Quix Quix Quix Quix

CodeZone   Projektowanie stron PHP WebPage Editor Forum Kontakt

Aktualności

Artykuły

Kursy

Download

Literatura

Linki

Pomoc

Login:

Hasło:

Literatura

Nowości

Aktualizacja 27-01-2007

Rzutowanie z 3d na płaszczyznę 27-01-2007

Obrót w 2d 27-01-2007

Szyfrowanie hasłem 27-01-2007

Wykresy funkcji 27-01-2007

Zamiana obrazków 19-08-2006

Lista 03-08-2006

Hello World 2.0 03-08-2006

Automatyczne wysyłanie formularza 03-08-2006

Animowanie wyświetlania tekstu 03-08-2006

PHP WebPage Editor

Najnowsza wersja: 3.2
Aktualizacja: 27.01.2007

Ściągnij

Ostatnio na forum

php.exe 18-02-2010

Kilka propozycji 24-04-2009

Konstruktor i zwracanie wartości 22-03-2009

formularz 29-06-2008

formularz 29-06-2008

Premiera PHP WebPage Editora 3.0 20-08-2007

utf-8 22-06-2007

Mapa odsyłaczy 20-06-2007

Możliwość zapisywania przez FTP 20-06-2007

problem 25-04-2007

->CodeZone->Artykuły->Algorytmy->Obrót w 2d

Obrót w 2d

27-01-2007

Obrót obiektu na płaszczyźnie o kąt alfa polega na takim odwzorowaniu obiektu pierwotnego, że każdy punkt obiektu wynikowego odpowiada każdemu punktowi obiektu pierwotnego, znajduje się w takiej samej odległości od osi obrotu oraz jest obrócony o kąt alfa

Najprostszy przypadek obrotu jest wtedy, gdy odwzorowywany jest punkt leżący na osi układu współrzędnych. W takiej sytuacji
x = r * cos (alfa);
y = r * sin (alfa);

gdzie r jest równe x0 lub y0 (współrzędne punktu przed obrotem). W innych przypadkach r = sqrt( x0^2 + y0^2); a podane powyżej wzory nie dają poprawnego wyniku.
Rozważmy poniższy rysunek:

Chcemy obrócić punkt, który przed obrotem znajduje się w jakiejś nieznanej nam bliżej odległości r (którą można ale nie trzeba wyliczyć na podstawie znanych współrzędnych tego punktu) oraz jest odchylony od osi układu współrzędnych o kąt beta. Obrót tego punktu o kąt alfa względem środka układu współrzędnych jest równoznaczny z umieszczeniem go w tej samej odległości r oraz odchyleniu o kąt alfa-beta względem osi, co wynika z sumowania kątów. Mamy wówczas:
x = r * cos (alfa - beta);
y = r * sin (alfa – beta);

nie są to jednak wartości którymi łatwo operować ze względu na złożoną postać r, można więc skorzystać z tożsamości trygonometrycznych:
x = r * cos(alfa) * cos (beta) – r * sin (alfa) * sin (beta);
y = r * sin(alfa) * cos (beta) – r * cos (alfa) * sin (beta);

wiemy także, że
sin(beta) = y0 / r;
cos (beta) = x0 / r;

zatem po podstawieniu otrzymujemy:
x = cos (alfa) * x0 – sin(alfa) * y0;
y = sin (alfa) * x0 + cos (alfa) * y0;

Wzór ten można przedstawić także w postaci wzoru na mnożenie macierzy:
|x| | cos(alfa) , -sin(alfa) | | x0 |
|y| = | sin(alfa) , cos(alfa) | x | y0 |

Praktycznym zastosowaniem tego wzoru może być np. obrót obrazka o dany kąt. Poniższa funkcja w Delphi obraca rysunek załadowany do obiektu image2 i rysuje go na formie programu

procedure rotateAndDraw(alfa:real)
  var alfa,cosa, sina:real;
  x0,y0,x,y:integer;
  kolor:tcolor;
begin
  cosa:=cos(alfa);
  sina:=sin(alfa);
  for x0:=0 to image1.picture.width-1 do
    for y0:=0 to image1.picture.height-1 do begin
      x:=round(cosa*(x0-image2.Picture.width/2)-sina*
(y0-image2.Picture.height/2));
      y:=round(sina*(x0-image2.Picture.width/2)+cosa*
(y0-image2.Picture.height/2));
      kolor:=image2.picture.bitmap.canvas.pixels[x0,y0];
      canvas.pixels[x+160,y+160]:=kolor;
      canvas.pixels[x+161,y+160]:=kolor;
      canvas.pixels[x+160,y+161]:=kolor;
  end;
end;


Od wartości x0 i y0 są odejmowane połowy odpowiednio szerokości i wysokości obrazka, dzięki czemu uzyskujemy obrót względem osi przechodzącej przez środek obrazka. Jak widać powyższy program zamalowuje aż 3 piksele wynikowe jednym pikselem źródłowym- ma to na celu uniknięcie efektu zaokrągleń- zamalowywanie jednego piksela owocowałoby powstawaniem siatki niezamalowanych pikseli na wynikowym obrazku, ze względu na zaokrąglenia rzeczywistych współrzędnych wyliczonych z funkcji trygonometrycznych do wartości całkowitych.

Komentarze

r.Q

15:52 07-03-2007

Dzieki, wlasnie tego szukalem;) A tak swoja droga, czy nie wkradl sie czasem blad do wzoru na cosinus roznicy katow?
cos(Alfa-Beta)=cos(Alfa)*cos(Beta)+sin(A lfa)*sin(Beta)
Pozdrawiam:)

Powered by Quix CMS

0.0022 0.0079 0.0081 0.0113 0.0117 0.0205