rotacja obrazka z centrum tam gdzie myszka

rotacja obrazka z centrum tam gdzie myszka
LU
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 10 lat
0

Witam
Chciałbym obracać obrazek tam gdzie złapie myszką.
Niestety kiedy obrócę obrazek i chcę złapać w innym miejscu to łapie obrazek lecz niestety w innym miejscu niż pokazywałem.
W czym Może być problem, albo jak to poprawić?

Kopiuj
using System.Windows.Media;
using System.Windows;
using System.Windows.Controls;
using Microsoft.Win32;
using System.Windows.Media.Imaging;
using System;
using System.Windows.Input;
using System.Windows.Shapes;
using System.Windows.Media.Animation;
namespace WpfApplication5
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        Image image = new Image();
         static Point pozycja;
        
        //kontroler
        public class Kontroler
        {
            private static RotateTransform rotuj;
            private static TranslateTransform transluj;
            private static ScaleTransform skaluj;
            private static FrameworkElement lassel = null;
            private static Boolean doScal = false;
            private static Point P;
            private static Double sumuj;
            private static Point poprzedni;
            private static Boolean first = true;
            private static Point star = new Point();
            private static TransformGroup tg;
            private static Point move = new Point();
            //add position
            public static void Posadd(Point delta, Point kart, Point mysz)
            {
           
               
                transluj.X += delta.X; //translate with mouse
                transluj.Y += delta.Y;
                
             rotuj.Angle += 1;
                sumuj += 0.5;

                RegEl(lassel);
            }

            public static void changeCenter( Point kart, Point mysz)
            {
                
             
                Point move=new Point();
               
                move.X = (mysz.X - transluj.X -rotuj.CenterX ) * Math.Cos(rotuj.Angle * Math.PI / 180) ;
                move.Y = (mysz.Y - transluj.Y - rotuj.CenterY) * Math.Cos(rotuj.Angle * Math.PI / 180);
            
                rotuj.CenterX += (move.X); //change center rotate <-tu mam problem
                rotuj.CenterY += (move.Y) ;


                sumuj = 0.0;
            }
            public static Point gdzie()
            {
                Point aktualne = new Point();
                aktualne.X = transluj.X;
                aktualne.Y = transluj.Y;
                return aktualne;

            }
            public static double kat()
            {
               double zm = new double();
                zm=rotuj.Angle;
                return zm;
            }
            public static Point gdziecent()
            {
                RegEl(lassel);
                return new Point(rotuj.CenterX, rotuj.CenterY);
            }

            public static void BaseTrans(FrameworkElement elem)
            {
                TransformGroup tg = new TransformGroup();
                ScaleTransform sc = new ScaleTransform();

                tg.Children.Add(sc);
                RotateTransform rt = new RotateTransform();
                tg.Children.Add(rt);
                TranslateTransform tt = new TranslateTransform();
                tg.Children.Add(tt);
                elem.RenderTransform = tg;
            }
            //czyszczenie transformacji
            public static void cleanTr()
            {
                if (lassel != null)
                {
                    lassel.Opacity = 0.75;
                    lassel = null;
                }
                rotuj = null;
                transluj = null;
                skaluj = null;
            }

            //metoda rejestrujaca
            public static void RegEl(UIElement elem)
            {
                first=false;
                cleanTr();
                if (elem != null && elem.RenderTransform is TransformGroup)
                {
                    if (elem is FrameworkElement)
                    {
                        lassel = elem as FrameworkElement;
                        lassel.Opacity = 0.75;
                        
                    }
                    tg = elem.RenderTransform as TransformGroup;
                    
                    foreach (Transform tran in tg.Children)
                    {
                        
                        if (tran is TranslateTransform)
                        {
                            
                            transluj = tran as TranslateTransform;
                            
                        }
                        if (tran is RotateTransform)
                        {
                            
                            rotuj = tran as RotateTransform;
                           
                        }
                        if (tran is ScaleTransform)
                        {
                            skaluj = tran as ScaleTransform;
                         
                            }
                       

                    }
                }
            }
            public static void PL()
            {
                if (transluj != null)
                    transluj.X -= 10;
            }
            public static void spr(){
                 if (doScal == true)
                            {
                                rotuj.CenterX = lassel.ActualWidth/2;
                                rotuj.CenterY = lassel.ActualHeight/2;
                                doScal = false;
                            }  
            }

            public static void PR()
            {
                
                if (transluj != null)
                    transluj.X += 10;
            }
            public static void PU()
            {
               
                if (transluj != null)
                    transluj.Y -= 10;
            }
            public static void PD()
            {
               
                if (transluj != null)
                    transluj.Y += 10;
            }
            public static void OL()
            {
              
                if (rotuj != null)
                {
                
                    rotuj.CenterX = lassel.ActualWidth / 2;
                    rotuj.CenterY = lassel.ActualHeight / 2;
                    rotuj.Angle -= 1;
                }
            }
            public static void OR()
            {
                if (rotuj != null)
                {
                  
                    rotuj.CenterX = lassel.ActualWidth / 2;
                    rotuj.CenterY = lassel.ActualHeight / 2;
                   rotuj.Angle += 1;
                    
                }
            }
            public static void res(double scala)
            {
               
                if (skaluj != null)
                 {           
                    skaluj.ScaleX = scala;
                    skaluj.ScaleY = scala;
                    doScal = true;

                    skaluj.CenterX = lassel.ActualWidth/2;
                   skaluj.CenterY = lassel.ActualHeight/2;
                }
            }

        }

        //koniec klasy
        private void add(object sender, RoutedEventArgs e)
        {

            OpenFileDialog ofd = new OpenFileDialog();
            FrameworkElement elem = null;
            ofd.Title = "Select a picture";
            ofd.Filter = "All supported graphics|*.jpg;*.jpeg;*.png|" +
                "JPEG (*.jpg;*.jpeg)|*.jpg;*.jpeg|" +
                "Portable Network Graphic (*.png)|*.png";

            Image img = new Image();
            img.BringIntoView();
            if (ofd.ShowDialog() == true)
            {
                Grid.SetRow(img, 0);
                Grid.SetZIndex(img, -2);
            }

            //if (rd.Next() % 2 == 0) 
            //  { 
            if (ofd.FileName.Length > 0)
            {
                img.Source = new BitmapImage(new Uri(ofd.FileName));
                //kartka.Children.Add(img);
                elem = img;

                Kontroler.BaseTrans(elem);

                elem.MouseLeftButtonDown += czus;
                elem.MouseMove += MoveMouse;
                elem.MouseLeftButtonUp += Ediend;
                // kartka.ClipToBounds=;
                kartka.Children.Add(img);
                Canvas.SetZIndex(img, 1);
                kartka.ClipToBounds = true;
                //crop image
                //--   pole=new RectangleGeometry();
                //--   pole.Rect = new Rect(0, 0,800,511);

            }
        }
        //wybieranie obrazka
        
        private bool isMouseDown = false;
        private void czus(object sender, MouseButtonEventArgs e)
        {
            
            Kontroler.RegEl(e.OriginalSource as UIElement);
            Kontroler.changeCenter(e.GetPosition(kartka), Mouse.GetPosition(null));
            poi.Text = "mouse-" + Mouse.GetPosition(null).X.ToString()+" "+Mouse.GetPosition(null).Y.ToString();
            poi.AppendText("gdzie" + Kontroler.gdzie().X + " "+Kontroler.gdzie().Y+" "+ "kat" +Kontroler.kat()%360);
            poi.AppendText("\ncent" + Kontroler.gdziecent().X.ToString() + " " + Kontroler.gdziecent().Y.ToString());
            isMouseDown = true;
            pozycja = e.GetPosition(kartka);

        }
        //koniec edycji
        private void Ediend(object sender, MouseButtonEventArgs e)
        {
            isMouseDown = false;

        }
        //ruch myszy

        private void MoveMouse(object sender, MouseEventArgs e)
        {

            if (isMouseDown)
            {
                Point mousePos = e.GetPosition(kartka);

                Point delta = new Point(mousePos.X - pozycja.X,
                      mousePos.Y - pozycja.Y);
                Kontroler.Posadd(delta, pozycja, mousePos);
                pozycja = mousePos;
            }

        }
        private void przesL(object sender, RoutedEventArgs e)
        {
            Kontroler.PL();
        }

        private void przesP(object sender, RoutedEventArgs e)
        {
            Kontroler.PR();
        }
        private void przesD(object sender, RoutedEventArgs e)
        {
            Kontroler.PD();
        }
        private void przesG(object sender, RoutedEventArgs e)
        {
            Kontroler.PU();
        }
        private void RotR(object sender, RoutedEventArgs e)
        {
            Kontroler.OR();
        }
        private void RotL(object sender, RoutedEventArgs e)
        {
            Kontroler.OL();
        }
        private void ZmRoz(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            Kontroler.res(Convert.ToDouble(zmien.Value));
        }
    }
} 

Natomiast xaml wygląda tak

Kopiuj
 Window x:Class="WpfApplication5.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="650" Width="800">
    <Window.Resources>
       
        <Style TargetType="Button">
            <Setter Property="VerticalAlignment" Value="Bottom" />
            <Setter Property="HorizontalAlignment" Value="Left" />
            <Setter Property="BorderThickness" Value="3"/>
            <Setter Property="BorderBrush" Value="white"/>
        </Style>
 
    </Window.Resources>

    <Grid Name="any">
        <Grid.RowDefinitions>
            <RowDefinition MinHeight="400" Height="511*" Name="one"/>
            <RowDefinition Height="100"  Name="two" />

        </Grid.RowDefinitions>
        <Border Grid.Row="0"  Width="800" Height="500" BorderThickness="2" BorderBrush="Black">
            <Canvas Background="Gray" Name="kartka"  ></Canvas>

            
        </Border>
        <Button Height="30" Width="100" Margin="0,70,678,0"  Grid.Row="1" FontSize="15" Click="add" Name="addphoto" Content="Dodaj zdjęcie">
        </Button>
        <Button Height="30" Width="30" Margin="150,0,0,70"  Grid.Row="1" Click="przesG">
            <Button.Background>
                <ImageBrush ImageSource="images/up.jpg"  />
            </Button.Background>
        </Button>
        <Button Height="30" Width="30" Margin="150,0,0,10"  Grid.Row="1" Click="przesD">
            <Button.Background>
                <ImageBrush ImageSource="images/down.jpg"/>
            </Button.Background>
        </Button>
        <Button Height="30" Width="30" Margin="100,0,0,40"  Grid.Row="1" Click="przesL">
            <Button.Background>
                <ImageBrush ImageSource="images/left.jpg"/>
            </Button.Background>
        </Button>
        <Button Height="30" Width="30" Margin="200,0,0,40"  Grid.Row="1" Click="przesP">
            <Button.Background>
                <ImageBrush ImageSource="images/right.jpg"/>
            </Button.Background>
        </Button>
        <Slider Grid.Row="1" Height="30"  Margin="289,0,0,0" VerticalAlignment="Bottom" HorizontalAlignment="Left" Name="zmien" Width="150" ValueChanged="ZmRoz" Minimum="0.01" Maximum="2" Value="1" />
        <RepeatButton Height="30" Width="30" Margin="550,35,198,35"  Grid.Row="1" Click="RotL">
            <RepeatButton.Background>
                <ImageBrush ImageSource="images/left.jpg"/>
            </RepeatButton.Background>
        </RepeatButton>
        <RepeatButton Height="30" Width="30" Margin="600,35,148,35"  Grid.Row="1" Click="RotR">
            <RepeatButton.Background>
                <ImageBrush ImageSource="images/right.jpg"/>
            </RepeatButton.Background>
        </RepeatButton>
        <Label Content="Label" Grid.Row="1" Height="28" HorizontalAlignment="Left" Margin="523,72,0,0" Name="label1" VerticalAlignment="Top" Width="243" />
        <TextBox Grid.Row="1" Height="60" HorizontalAlignment="Left" Margin="257,0,0,0" Name="poi" VerticalAlignment="Top" Width="244" />
    </Grid>
</Window>
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)