Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2004.10.24;
Скачать: [xml.tar.bz2];

Вниз

Вращение точки   Найти похожие ветки 

 
VolanD   (2004-06-18 07:50) [0]

Люди, вот захотел написать прогу-вращение кубика. Вращается все нормально, вот только он в размерах уменьшается. Что делать?
Код вращения:
По "Z":
 (*vec3d).x3=(*vec3d).x3*cos(angle*M_PI/180)-(*vec3d).y3*sin  (angle*M_PI/180);
 (*vec3d).y3=(*vec3d).x3*sin(angle*M_PI/180)+(*vec3d).y3*cos(angle*M_PI/180);
По "X":  (*vec3d).x3=(*vec3d).x3*cos(angle*M_PI/180)+(*vec3d).z3*sin(angle*M_PI/180);
 (*vec3d).z3=-(*vec3d).x3*sin(angle*M_PI/180)+(*vec3d).z3*cos(angle*M_PI/180);
По "Y":  (*vec3d).y3=(*vec3d).y3*cos(angle*M_PI/180)-(*vec3d).z3*sin(angle*M_PI/180);
 (*vec3d).z3=(*vec3d).y3*sin(angle*M_PI/180)+(*vec3d).z3*cos(angle*M_PI/180);


 
}{enon ©   (2004-06-20 19:50) [1]

sin и cos всегда не больше 1, поэтому (*vec3d).x3*cos(angle*M_PI/180) получается меньше, чем (*vec3d).x3 и длина ребра уменьшается. В правой части замени (*vec3d).x3 и (*vec3d).y3 на некоторые константы / другие переменные.
P.S. может я что-то не понял, но уравнения движения по окружности выглядит так: x = r * cos(fi), y = r * sin (fi), а у тебя там сумма / разность.


 
Думкин ©   (2004-06-21 06:52) [2]

> [1] }{enon ©   (20.06.04 19:50)

Речь идет не о полярных координатах.

>  VolanD   (18.06.04 07:50)

Возможно, ошибка накапливается. Применяй матрицу вращения к исходному кубику.
Матрица будет получаться - как произведение предыдущих.


 
X-Disa   (2004-06-27 09:04) [3]

Вращение куба. Я сам сталкивался с такой проблемой искал тут ответ, на его основании сделал следующее:
Можетю она большая и кривая, но работает:
Cent - где выводить на экран, FRC - координаты камеры
Ha,Va - углы поворота, остальное понятно.
Procedure DrawParallelepiped(Bitmap:tBitmap;Cent:TPoint;FRC:T3dPoint;RebroX,RebroY,RebroZ,FZoom,Ha,Va:extended;DrawInvisibleLines, MakePoints:boolean;Ps:tColor);
Var A:Array [1..8] of T3dPoint;
A1: Array [1..8] of tPoint;

i:integer;
X,Y:extended;
DrawA1A2,DrawA1A3,DrawA1A5,DrawA5A6,DrawA5A7,
DrawA3A7,DrawA3A4,DrawA7A8,DrawA2A6,DrawA2A4,
DrawA8A4,DrawA8A6:boolean;
Begin
Bitmap.Canvas.Pen.Color:=Ps;
A[1]:=Point3D(0,0,0);
A[2]:=Point3D(RebroX,0,0);
A[3]:=Point3D(0,RebroY,0);
A[4]:=Point3D(RebroX,RebroY,0);
A[5]:=Point3D(0,0,RebroZ);
A[6]:=Point3D(RebroX,0,RebroZ);
A[7]:=Point3D(0,RebroY,RebroZ);
A[8]:=Point3D(RebroX,RebroY,RebroZ);
For i:=1 to 8 do begin
A1[i].X:=Cent.X+ round( FZoom * ( (A[i].X-FRC.x)*cos(ha)+(A[i].Y-FRC.y)*sin(ha) ));
A1[i].Y:=Cent.Y + round( FZoom * (((A[i].y-FRC.y)*cos(ha)-(A[i].x-FRC.x)*sin(ha))*sin(va)-cos(va)*(A[i].z-FRC.z)));
end;
If MakePoints then begin
Bitmap.Canvas.TextOut(A1[1].X+1,A1[1].Y+1,"A");
Bitmap.Canvas.TextOut(A1[2].X+1,A1[2].Y+1,"B");
Bitmap.Canvas.TextOut(A1[3].X+1,A1[3].Y+1,"C");
Bitmap.Canvas.TextOut(A1[4].X+1,A1[4].Y+1,"D");
Bitmap.Canvas.TextOut(A1[5].X+1,A1[5].Y+1,"E");
Bitmap.Canvas.TextOut(A1[6].X+1,A1[6].Y+1,"F");
Bitmap.Canvas.TextOut(A1[7].X+1,A1[7].Y+1,"G");
Bitmap.Canvas.TextOut(A1[8].X+1,A1[8].Y+1,"H");

end;
If DrawInvisibleLines then begin
For i:=1 to 8 do begin
Bitmap.Canvas.Pixels[A1[i].X+1,a1[i].Y+1]:=Ps;
end;
Bitmap.Canvas.MoveTo(A1[1].x,A1[1].y);
Bitmap.Canvas.LineTo(A1[3].x,A1[3].y);

Bitmap.Canvas.MoveTo(A1[2].x,A1[2].y);
Bitmap.Canvas.LineTo(A1[4].x,A1[4].y);

Bitmap.Canvas.MoveTo(A1[1].x,A1[1].y);
Bitmap.Canvas.LineTo(A1[2].x,A1[2].y);

Bitmap.Canvas.MoveTo(A1[3].x,A1[3].y);
Bitmap.Canvas.LineTo(A1[4].x,A1[4].y);

Bitmap.Canvas.MoveTo(A1[5].x,A1[5].y);
Bitmap.Canvas.LineTo(A1[6].x,A1[6].y);

Bitmap.Canvas.MoveTo(A1[7].x,A1[7].y);
Bitmap.Canvas.LineTo(A1[8].x,A1[8].y);

Bitmap.Canvas.MoveTo(A1[5].x,A1[5].y);
Bitmap.Canvas.LineTo(A1[7].x,A1[7].y);

Bitmap.Canvas.MoveTo(A1[6].x,A1[6].y);
Bitmap.Canvas.LineTo(A1[8].x,A1[8].y);

Bitmap.Canvas.MoveTo(A1[5].x,A1[5].y);
Bitmap.Canvas.LineTo(A1[1].x,A1[1].y);

Bitmap.Canvas.MoveTo(A1[7].x,A1[7].y);
Bitmap.Canvas.LineTo(A1[3].x,A1[3].y);

Bitmap.Canvas.MoveTo(A1[6].x,A1[6].y);
Bitmap.Canvas.LineTo(A1[2].x,A1[2].y);

Bitmap.Canvas.MoveTo(A1[8].x,A1[8].y);
Bitmap.Canvas.LineTo(A1[4].x,A1[4].y);
end else begin

X:=RadToGrad(Ha);
Y:=RadToGrad(Va);
DrawA1A2:=true;
DrawA1A3:=true;
DrawA1A5:=true;
DrawA5A6:=true;
DrawA5A7:=true;
DrawA3A7:=true;
DrawA3A4:=true;
DrawA7A8:=true;
DrawA2A6:=true;
DrawA2A4:=true;
DrawA8A4:=true;
DrawA8A6:=true;

If (x<100)and(y<100) then DrawA1A2:=false;
If ((x>100)and(x<200))and((y>100)and(y<200)) then DrawA1A2:=false;
If ((x>200)and(X<300))and((y>100)and(y<200)) then DrawA1A2:=false;
If (x>300)and(y<100) then DrawA1A2:=false;

If (X<100)and((y>100)and(Y<200)) then DrawA1A3:=false;
If ((X>100)and(X<200))and((Y>100)and(Y<200)) then DrawA1A3:=false;
If ((X>200)and(X<300))and(Y<100) then DrawA1A3:=false;
If (x>300)and(y<100) then DrawA1A3:=false;

If ((X>100)and(X<200))and((Y>100)and(Y<300)) then DrawA1A5:=false;
If (X>300)and(y<100) then DrawA1A5:=false;
If (X>300)and(y>300) then DrawA1A5:=false;

If (X<100)and(Y>300) then DrawA5A6:=false;
If ((X>100)and(X<300))and((Y>200)and(Y<300)) then DrawA5A6:=false;
If (X>300)and(Y>300) then DrawA5A6:=false;

If (X<100)and((Y>200)and(Y<300)) then DrawA5A7:=false;
If ((X>100)and(X<200))and((Y>200)and(Y<300)) then DrawA5A7:=false;
If ((X>200)and(X<300))and(Y>300) then DrawA5A7:=false;
If (X>300)and(Y>300) then DrawA5A7:=false;

If (X<100)and((Y>100)and(Y<300)) then DrawA3A7:=false;
If ((X>200)and(X<300))and((Y<100)or(Y>300)) then DrawA3A7:=false;

If (X<100)and((Y>100)and(Y<200)) then DrawA3A4:=false;
If ((X>100)and(X<300)and(Y<100)) then DrawA3A4:=false;
If (Y>300)and((Y>100)and(Y<200)) then DrawA3A4:=false;

If (X<100)and((Y>200)and(Y<300)) then DrawA7A8:=false;
If ((X>100)and(X<300))and(Y>300) then DrawA7A8:=false;
If (X>300)and((Y>200)and(Y<300)) then DrawA7A8:=false;

If (X<100)and((Y<100)Or(Y>300)) then DrawA2A6:=false;
If ((X>200)and(X<300))and((Y>100)and(Y<300)) then DrawA2A6:=false;

If (X<200)and(Y<100) then DrawA2A4:=false;
If (X>200)and((Y>100)and(Y<200)) then DrawA2A4:=false;

If ((X>100)and(X<200))and((Y<100)or(Y>300)) then DrawA8A4:=false;
If (X>300)and((Y>100)and(Y<200)) then DrawA8A4:=false;

If (X<200) and (Y>300) then DrawA8A6:=false;
If (X>200) and ((Y>200)and(Y<300)) then DrawA8A6:=false;

If DrawA1A2 then begin
Bitmap.Canvas.MoveTo(A1[1].x,A1[1].y);
Bitmap.Canvas.LineTo(A1[2].x,A1[2].y); end;

If DrawA1A3 then begin
Bitmap.Canvas.MoveTo(A1[1].x,A1[1].y);
Bitmap.Canvas.LineTo(A1[3].x,A1[3].y); end;

If DrawA1A5 then begin
Bitmap.Canvas.MoveTo(A1[1].x,A1[1].y);
Bitmap.Canvas.LineTo(A1[5].x,A1[5].y); end;

If DrawA5A6 then begin
Bitmap.Canvas.MoveTo(A1[5].x,A1[5].y);
Bitmap.Canvas.LineTo(A1[6].x,A1[6].y); end;

If DrawA5A7 then begin
Bitmap.Canvas.MoveTo(A1[5].x,A1[5].y);
Bitmap.Canvas.LineTo(A1[7].x,A1[7].y); end;

If DrawA3A7 then begin
Bitmap.Canvas.MoveTo(A1[3].x,A1[3].y);
Bitmap.Canvas.LineTo(A1[7].x,A1[7].y); end;

If DrawA3A4 then begin
Bitmap.Canvas.MoveTo(A1[3].x,A1[3].y);
Bitmap.Canvas.LineTo(A1[4].x,A1[4].y); end;

If DrawA7A8 then begin
Bitmap.Canvas.MoveTo(A1[7].x,A1[7].y);
Bitmap.Canvas.LineTo(A1[8].x,A1[8].y); end;

If DrawA2A6 then begin
Bitmap.Canvas.MoveTo(A1[2].x,A1[2].y);
Bitmap.Canvas.LineTo(A1[6].x,A1[6].y); end;

If DrawA2A4 then begin
Bitmap.Canvas.MoveTo(A1[2].x,A1[2].y);
Bitmap.Canvas.LineTo(A1[4].x,A1[4].y); end;

If DrawA8A4 then begin
Bitmap.Canvas.MoveTo(A1[8].x,A1[8].y);
Bitmap.Canvas.LineTo(A1[4].x,A1[4].y); end;

If DrawA8A6 then begin
Bitmap.Canvas.MoveTo(A1[8].x,A1[8].y);
Bitmap.Canvas.LineTo(A1[6].x,A1[6].y); end;

end;
End;



Страницы: 1 вся ветка

Форум: "Игры";
Текущий архив: 2004.10.24;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.027 c
3-1096270335
Sectey
2004-09-27 11:32
2004.10.24
Запись в таблицу не зависимо, отменена или подтверждена транзакци


10-1051092870
sniknik
2003-04-23 14:14
2004.10.24
Какого клиента коннект? Midas.


14-1096622555
kaZaNoVa
2004-10-01 13:22
2004.10.24
Админ &amp; юзер, права .. сабж !


8-1090764860
DDDeN
2004-07-25 18:14
2004.10.24
Подать звук по разным каналам


1-1096648518
Justas
2004-10-01 20:35
2004.10.24
Полупрозрачное изображение





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский