canvas.polygon i obrót

0

Hej.
Generuję dynamicznie 'rysunek', na PaintBox, PaintBox.Canvas.Polygon(...). Konkretnie to trapez. Chciałbym go obracać ale nie mogę nigdzie znaleźć łopatologicznego wytłumaczenia jak to zrobić. Dane jakimi operuję to jedynie współrzędne gdzie na PaintBox'ie ma się pojawić trapez, do tych współrzędnych dodaję stałe wartości aby uzyskać wsp. wierzchołków.

Przykład:

 
PaintBox1.Canvas.Polygon([Point(40 + pX, 10 + pY), Point(80 + pX, 10 + pY),Point(110 + pX, 40 + pY), Point(110 + pX, 110 + pY), Point(10 + pX, 110 + pY), Point(10 + pX, 40 + pY)]);

Jak się zabrać za obrót?

0

Ten wzór:

x'=x*cos(phi)-y*sin(phi)
y'=x*sin(phi)-y*cos(phi)

wydaje się być odpowiedni, ale jak dokonać obrodu wokół własnej osi a nie punktu 0,0 panelu?

0

Wyznaczasz punkt środkowy figury, robisz translację o [-x, -y], gdzie (x,y) to środek figury, obracasz o kąt fi, translujesz (przesuwasz) figurę o [x,y].

0

Jakoś nie mogę tego ogarnąć. Rozumiem, że tamten wzór muszę zastosować do każdego wierzchołka, czyli x' i y' to nowe punkty wierzchołka. Załóżmy, że fX i fY to współrzędne figury na PaintBox'ie. A we wzorze nie mam 'miejsca' na podanie współrzędnej punktu obrotu. Chyba, że jest jakiś inny wzorek. Przyznam, że jeśli chodzi o wyobraźnię przestrzenną to ciężko mi to przychodzi.

0

hmm.. punkt obrotu to punkt 0,0,0. Czyli jesli masz narysowaną jakaś figurę, musisz "przesunąć" ją tak, żeby punkt 0,0,0 był w miejscu wokoło którego (względnie) chcesz obrócić figurę. Potem stosujesz ten wzór do punktów. Jak już wyliczysz nowe punkty, to musisz znów dodać odpowiednie przesuniecie, żeby figura wróciła na swoje miejsce.

0

Dzięki, teraz ma to jakiś sens :)

0

Witam,
mam pewien problem dot. tego wzoru, mianowicie efekt jego działania jest co najmniej niezadowalający. W załączniku dodaję screena z działania programu. Zielony kwadrat to efekt przy podaniu phi=0, a to krzywe coś powstało przy wartości phi=1. Poniżej zamieszczam również kod programu:

procedure TForm1.Button1Click(Sender: TObject);
var
  x:array[1..4] of integer;
  y:array[1..4] of integer;
  I,phi: integer;
begin
Panel1.Canvas.Brush.color:= clGreen;

x[1]:= 0;y[1]:= 0;
x[2]:=20;y[2]:= 0;
x[3]:=20;y[3]:= 20;
x[4]:= 0;y[4]:= 20;
phi:=StrToInt(Edit3.Text);
for I:=1 to 4 do
begin
   x[I]:=Round(x[I]*cos(phi)-y[I]*sin(phi));
   y[I]:=Round(x[I]*sin(phi)-y[I]*cos(phi));

   x[I]:=x[I] + 50;
   y[I]:=y[I] + 50;
end;

Panel1.Canvas.Polygon([Point(x[1],y[1]),
                       Point(x[2],y[2]),
                       Point(x[3],y[3]),
                       Point(x[4],y[4])]);

end;    

Moje pytanie, chyba nasuwa się samo... Co jest nie tak? Już mi ręce opadają, powinien być jakiś parametr do tego canvas/polygon 'rotate'.

0
<quote> ```delphi x[I]:=Round(x[I]*cos(phi)-y[I]*sin(phi)); y[I]:=Round(x[I]*sin(phi)-y[I]*cos(phi)); ``` <quote>

w drugiej linijce powinieneś się odwoływać do x[I] sprzed zmiany, tymczasem w pierwszej linijce już zmieniłeś wartość.

0

Wielkie dzięki, teraz proporcje figury są jak najbardziej zachowane, mam jednak problem z obrotem wokół własnej osi. Ta figura obraca się wokół swojego lewego górnego narożnika. Czy jest jakiś patent aby zmodyfikować wzór i będzie ok, czy muszę znaleźć środek figury i dodać te dane do współrzędnych nowej, obróconej już figury?

Btw: poprawiony kod

procedure TForm1.Button1Click(Sender: TObject);
var
  x:array[1..4] of integer;
  y:array[1..4] of integer;
  oldx,oldy: integer;
  I: integer;
  phi: Real;
begin
Panel1.Canvas.Brush.color:= clGreen;

x[1]:=  0;y[1]:=  0;
x[2]:= 20;y[2]:=  0;
x[3]:= 20;y[3]:= 20;
x[4]:=  0;y[4]:= 20;

phi:=StrToInt(Edit3.Text)*pi/180.0 ;

for I:=1 to 4 do
begin
   oldx:=x[I];
   oldy:=y[I];

   x[I]:=Round(oldx*cos(phi)-oldy*sin(phi));
   y[I]:=Round(oldx*sin(phi)+oldy*cos(phi));

   x[I]:=x[I] + 50;
   y[I]:=y[I] + 50;
end;

Panel1.Canvas.Polygon([Point(x[1],y[1]),
                       Point(x[2],y[2]),
                       Point(x[3],y[3]),
                       Point(x[4],y[4])]);

end;
0

Ta figura obraca się wokół swojego lewego górnego narożnika

wzór figurę obraca wokół punktu (0,0). obracasz kwadrat leżący na (0,0) - (20,20). dodatkowo dla utrudnienia canvas ma oś y skierowaną w dół.

1 użytkowników online, w tym zalogowanych: 0, gości: 1