Альтернатива OpenGL, псевдо 3D
Код:
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
md:=true; xa:=x; ya:=y;
end;
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
md:=false; xa:=x; ya:=y;
end;
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if md then
begin
alf:=alf-(x-xa)*2*pi/300; //число 300 означает, на сколько пикселей надо
bet:=bet-(y-ya)*2*pi/300; //передвинуть мышь для поворота графика на 360 градусов
xa:=x; ya:=y;
risovanie; // процедура для перерисовки графика, с новыми значениями углов.
end;
end;
procedure LineToXYZ(x,y,z:real);
begin
form1.image1.canvas.lineto(trunc(((y*cos(alf)-x*sin(alf))*cos(gam)+(z*cos(bet)
+(x*cos(alf)+y*sin(alf))*sin(bet))*sin(gam))*zum+form1.image1.Width/2),
trunc(-((z*cos(bet)+(x*cos(alf)+y*sin(alf))*sin(bet))*cos(gam)-(y*cos(alf)-
x*sin(alf))*sin(gam))*zum+form1.Image1.Height/2));
end;
procedure MoveToXYZ(x,y,z:real);
begin
form1.image1.canvas.moveto(trunc(((y*cos(alf)-x*sin(alf))*cos(gam)+(z*cos(bet)
+(x*cos(alf)+y*sin(alf))*sin(bet))*sin(gam))*zum+form1.image1.Width/2),
trunc (-((z*cos(bet)+(x*cos(alf)+y*sin(alf))*sin(bet))*cos(gam)-(y*cos(alf)-
x*sin(alf))*sin(gam))*zum+form1.Image1.Height/2));
end;
MoveToXYZ(); перейти в точку в пространстве
LineToXYZ(); вектор от первой точки ко второй в пространстве
для понятия принципа работы оч. хорошо подойдет.