[pascal] Obrót kwadratu w okół koła i własnego środka
-
- 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
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ć
-
- 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
Google nie boli
Powinno zaradzic na twoj problem POZDROKod: Zaznacz cały
http://ohp.magres.net/index.php?id=295
-
- 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
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):
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 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.
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.
-
- 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
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
-
- 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
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++
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++