[pascal] Obrót kwadratu w okół koła i własnego środka

Eoghan
Użytkownik
Użytkownik
Posty: 29
Rejestracja: 11 maja 2008, o 19:09
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 3 razy
Pomógł: 1 raz

[pascal] Obrót kwadratu w okół koła i własnego środka

Post autor: Eoghan »

Witam mam zrobić animację w którym kwadrat będzie poruszał się po okręgu (załóżmy takim o środku na środku ekranu i promieniu r) no i w zasadzie z tym problemu wielkiego nie ma. Schody zaczynają się z tym że ten kwadrat ma się podczas ruchu po okręgu obracać w okół własnej osi, nie jak to ze sobą połączyć
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

[pascal] Obrót kwadratu w okół koła i własnego środka

Post autor: soku11 »

Google nie boli

Kod: Zaznacz cały

http://ohp.magres.net/index.php?id=295
Powinno zaradzic na twoj problem POZDRO
Eoghan
Użytkownik
Użytkownik
Posty: 29
Rejestracja: 11 maja 2008, o 19:09
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 3 razy
Pomógł: 1 raz

[pascal] Obrót kwadratu w okół koła i własnego środka

Post autor: Eoghan »

No wiesz niby nie boli, ale na poziomie liceum jednak nie mogę sobie dać rady i o ile z obrotem samego kwadratu po okręgu nie ma większego problemu ( po prostu ze wzoru na obrót punktu w okół pukntu w układzie współrzędnych) to nie potrafię dodatkowo wprowadzić w ruch kwadratu w okół środka ciężkości. To moje przykładowe kody: (pierwszy, w którym kwadrat obraca się po okręgu i jest wszystko ładnie):

Kod: Zaznacz cały

program kwadrat;
uses crt,graph;

procedure obrot(var x,y:real; xs,ys,k:real);
var xn,yn:real;
begin
xn:=xs+(x-xs)*cos(k*Pi/180)-(y-ys)*sin(k*Pi/180);
yn:=ys+(x-xs)*sin(k*Pi/180)+(y-ys)*cos(k*Pi/180);
x:=xn;
y:=yn;
end;

var s1,s2,r,x,x1,x2,x3,x4,xs,y,y1,y2,y3,y4,ys:real;
    driver,mode:integer;
begin
driver:=detect;
initgraph(driver,mode,'C:\TP\BGI\');
 xs:=GetMaxX div 2;
 ys:=GetMaxY div 2;
 x1:=150; y1:=50;
 x2:=250; y2:=50;
 x3:=250; y3:=150;
 x4:=150; y4:=150;

  repeat
  setcolor(white);
   line(round(x1),round(y1),round(x2),round(y2));
   line(round(x2),round(y2),round(x3),round(y3));
   line(round(x3),round(y3),round(x4),round(y4));
   line(round(x4),round(y4),round(x1),round(y1));

  delay(20);
   setcolor(black);
   line(round(x1),round(y1),round(x2),round(y2));
   line(round(x2),round(y2),round(x3),round(y3));
   line(round(x3),round(y3),round(x4),round(y4));
   line(round(x4),round(y4),round(x1),round(y1));

  obrot(x1,y1,xs,ys,1);obrot(x2,y2,xs,ys,1);obrot(x3,y3,xs,ys,1);obrot(x4,y4,xs,ys,1);

 until keypressed;
repeat until keypressed;
closegraph;
end.
i drugi, gdzie chciałem spróbować obrotu kwadratu w okół własnego środka ciężkości, który porusza się po okręgu, co z kolei nie wychodzi :/

Kod: Zaznacz cały

program bezuzyteczny;
uses crt,graph;
var driver,mode:integer;
    xs,ys,xst,yst,step1,step2,k,k2,
    xp1,xp2,xp3,xp4,xp1a,
    xp2a,xp3a,xp4a,
    yp1,yp2,yp3,yp4,
    yp1a,yp2a,yp3a,yp4a,
    x,y,
    xp1o,yp1o,xp2o,yp2o,xp3o,yp3o,xp4o,yp4o,
    xp1ao,yp1ao,xp2ao,yp2ao,xp3ao,yp3ao,xp4ao,yp4ao:real;


begin
clrscr;
driver:=DETECT;
InitGraph(driver,mode,'C:\TP\BGI');

{kroki step1-obrot calkowity, step2-obrot wokol wlasnej osi}
step1:=1;
step2:=2;

{srodek}
xs:=GetMaxX div 2;
ys:=GetMaxY div 2;

{kat krok}

{srodek kwadratu na poczatku (300px od srodka}
xst:=800;
yst:=400;

repeat

{generowanie srodka kwadratu}
k:=step1;
       if k>360 then
	k:=k-360;

y:=ys+(xst-xs)*sin(pi/180*k)+(yst-ys)*cos(pi/180*k);
x:=xs+(xst-xs)*cos(pi/180*k)-(yst-ys)*sin(pi/180*k);
{generowanie kwadratu (nieobroconego}
xp1:=x-10;
yp1:=y-10;
xp1a:=x+10;
yp1a:=y-10;
xp2:=x+10;
yp2:=y-10;
xp2a:=x+10;
yp2a:=y+10;
xp3:=x+10;
yp3:=y+10;
xp3a:=x-10;
yp3a:=y+10;
xp4:=x-10;
yp4:=y+10;
xp4a:=x-10;
yp4a:=y-10;

{obracanie każdej ze wspolrzednych}
k2:=step2;
       if k2>360 then
	k2:=k2-360;



xp1o:=x+(xp1-x)*cos(pi/180*k2)-(yp1-y)*sin(pi/180*k2);
yp1o:=ys+(xp1-xs)*sin(pi/180*k2)+(yp1-ys)*cos(pi/180*k2);
xp1ao:=x+(xp1a-x)*cos(pi/180*k2)-(yp1a-y)*sin(pi/180*k2);
yp1ao:=ys+(xp1a-xs)*sin(pi/180*k2)+(yp1a-ys)*cos(pi/180*k2);
xp2o:=x+(xp2-x)*cos(pi/180*k2)-(yp2-y)*sin(pi/180*k2);
yp2o:=ys+(xp2-xs)*sin(pi/180*k2)+(yp2-ys)*cos(pi/180*k2);
xp2ao:=x+(xp2a-x)*cos(pi/180*k2)-(yp2a-y)*sin(pi/180*k2);
yp2ao:=ys+(xp2a-xs)*sin(pi/180*k2)+(yp2a-ys)*cos(pi/180*k2);
xp3o:=x+(xp3-x)*cos(pi/180*k2)-(yp3-y)*sin(pi/180*k2);
yp3o:=ys+(xp3-xs)*sin(pi/180*k2)+(yp3-ys)*cos(pi/180*k2);
xp3ao:=x+(xp3a-x)*cos(pi/180*k2)-(yp3a-y)*sin(pi/180*k2);
yp3ao:=ys+(xp3a-xs)*sin(pi/180*k2)+(yp3a-ys)*cos(pi/180*k2);
xp4o:=x+(xp4-x)*cos(pi/180*k2)-(yp4-y)*sin(pi/180*k2);
yp4o:=ys+(xp4-xs)*sin(pi/180*k2)+(yp4-ys)*cos(pi/180*k2);
xp4ao:=x+(xp4a-x)*cos(pi/180*k2)-(yp4a-y)*sin(pi/180*k2);
yp4a:=ys+(xp4a-xs)*sin(pi/180*k2)+(yp4a-ys)*cos(pi/180*k2);

{generowanie}
line(round(xp1),round(yp1),round(xp1a),round(yp1a));
line(round(xp2),round(yp2),round(xp2a),round(yp2a));
line(round(xp3),round(yp3),round(xp3a),round(yp3a));
line(round(xp4),round(yp4),round(xp4a),round(yp4a));

until keypressed;
clrscr;

repeat until keypressed;
closegraph;
end.
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

[pascal] Obrót kwadratu w okół koła i własnego środka

Post autor: soku11 »

Napisz moze sobe najpierw oddzielnie program do obrotow samego kwadratu. Nie rob 2 rzeczy na raz. Ja to widze tak, ze przechowujesz aktualne pozycje kazdego rogu kwadrat (nie wiem czy w pascalu istnieje cos takiego jak struktura) i srodka. I teraz do kazdego z nich robisz operacje przemieszczenia wzgledem danego punktu o dany kat. Niestety Pascalem nie zajmuje sie od podstawowki POZDRO
Eoghan
Użytkownik
Użytkownik
Posty: 29
Rejestracja: 11 maja 2008, o 19:09
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 3 razy
Pomógł: 1 raz

[pascal] Obrót kwadratu w okół koła i własnego środka

Post autor: Eoghan »

Ja też się pascalem od roku zajmuję więc nie za długo.
Też w sumie wiem jak to zrobić ale z wykonaniem już gorze, byłbym wdzięczny gdyby ktoś mi pomógł i zrobił to nawet nie w pascalu, ale równie dobrze może być Basic albo C++
ODPOWIEDZ