Текущий архив: 2004.10.24;
Скачать: CL | DM;
ВнизВращение точки Найти похожие ветки
← →
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;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.036 c