unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; const PointsCount = 25; rPoint = 3; type // Ñòðóêòóðà îïèñûâàþùàÿ òî÷êó â ïðîñòðàíñòâå TPoint3D = record X: Real; Y: Real; Z: Real; end; type TForm1 = class(TForm) Image1: TImage; Button1: TButton; Timer1: TTimer; Button2: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure Timer1Timer(Sender: TObject); procedure Button2Click(Sender: TObject); { Private declarations } private // Êîîðäèíàòû öåíòðà ýêðàíà oX: Integer; oY: Integer; ScaleX,ScaleY:real; DrawBuffer: TBitMap; // Áóôåð äëÿ ðèñîâàíèÿ BufferColor: TColor; // Öâåò áóôåðà X0,Y0,Xn,Yn,dX,dY : Real; zMin, zMax: real; Alpha: Real; AlphaP: Real; Points3D: array[0..PointsCount,0..PointsCount] of TPoint3D; // Ìàññèâ òðåõìåðíûõ òî÷åê Points2D: array[0..PointsCount,0..PointsCount] of TPoint; subAxis3D_X: array[0..13] of TPoint3D; subAxis3D_Y: array[0..13] of TPoint3D; subAxis3D_Z: array[0..13] of TPoint3D; subAxis2D_X: array[0..13] of TPoint; subAxis2D_Y: array[0..13] of TPoint; subAxis2D_Z: array[0..13] of TPoint; Axis3D: array[0..8] of TPoint3D; Axis2D: array[0..8] of TPoint; procedure ClearBuffer; // Î÷èñòêà áóôåðà ðèñîâàíèÿ procedure DrawPoints; // Ïðîöåäóðà ðèñîâàíèÿ òî÷åê public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var i,j : integer; begin X0:=-3.14; Xn:=3.14; Y0:=-3.14; Yn:=3.14; dX:= (Xn-X0)/PointsCount; dY:= (Yn-Y0)/PointsCount; Axis3d[0].X:=0; Axis3d[0].Y:=0; Axis3d[0].Z:=0; Axis3d[1].X:=-4; Axis3d[1].Y:=0; Axis3d[1].Z:=0; Axis3d[2].X:=4; Axis3d[2].Y:=0; Axis3d[2].Z:=0; Axis3d[3].X:=0; Axis3d[3].Y:=-4; Axis3d[3].Z:=0; Axis3d[4].X:=0; Axis3d[4].Y:=4; Axis3d[4].Z:=0; Axis3d[5].X:=0; Axis3d[5].Y:=0; Axis3d[5].Z:=-4; Axis3d[6].X:=0; Axis3d[6].Y:=0; Axis3d[6].Z:=4; for i:=0 to 6 do begin subAxis3D_X[2*i].X:=Trunc(X0)+i; subAxis3D_X[2*i].Y:=-0.2; subAxis3D_X[2*i].Z:=0; subAxis3D_X[2*i+1].X:=Trunc(X0)+i; subAxis3D_X[2*i+1].Y:=0.2; subAxis3D_X[2*i+1].Z:=0; end; for i:=0 to 6 do begin subAxis3D_Y[2*i].X:=-0.2; subAxis3D_Y[2*i].Y:=Trunc(Y0)+i; subAxis3D_Y[2*i].Z:=0; subAxis3D_Y[2*i+1].X:=0.2; subAxis3D_Y[2*i+1].Y:=Trunc(Y0)+i; subAxis3D_Y[2*i+1].Z:=0; end; for i:=0 to 6 do begin subAxis3D_Z[2*i].X:=0; subAxis3D_Z[2*i].Y:=-0.2; subAxis3D_Z[2*i].Z:=-3+i; subAxis3D_Z[2*i+1].X:=0; subAxis3D_Z[2*i+1].Y:=0.2; subAxis3D_Z[2*i+1].Z:=-3+i; end; for i:=0 to PointsCount do for j:=0 to PointsCount do begin Points3D[i][j].X:=X0+i*dX; Points3D[i][j].Y:=Y0+j*dY; Points3D[i][j].Z:=cos(Points3D[i][j].X+sin(Points3D[i][j].Y)); end; zMin:=Points3D[0][0].Z; zMax:=zMin; for i:=0 to PointsCount do for j:=0 to PointsCount do begin if (zMin>Points3D[i][j].Z) then zMin:= Points3D[i][j].Z; if (zMax nil then begin ClearBuffer; for i:=0 to 6 do begin tX:=(Axis3D[i].X+Axis3D[i].Y*cos(AlphaP))*ScaleX; tY:=(Axis3D[i].Z+Axis3D[i].Y*sin(AlphaP))*ScaleY; Axis2D[i].X:=ROUND(oX+tX); Axis2D[i].Y:=ROUND(oY-tY); end; for i:=0 to 13 do begin tX:=(subAxis3D_X[i].X+subAxis3D_X[i].Y*cos(AlphaP))*ScaleX; tY:=(subAxis3D_X[i].Z+subAxis3D_X[i].Y*sin(AlphaP))*ScaleY; subAxis2D_X[i].X:=ROUND(oX+tX); subAxis2D_X[i].Y:=ROUND(oY-tY); tX:=(subAxis3D_Y[i].X+subAxis3D_Y[i].Y*cos(AlphaP))*ScaleX; tY:=(subAxis3D_Y[i].Z+subAxis3D_Y[i].Y*sin(AlphaP))*ScaleY; subAxis2D_Y[i].X:=ROUND(oX+tX); subAxis2D_Y[i].Y:=ROUND(oY-tY); tX:=(subAxis3D_Z[i].X+subAxis3D_Z[i].Y*cos(AlphaP))*ScaleX; tY:=(subAxis3D_Z[i].Z+subAxis3D_Z[i].Y*sin(AlphaP))*ScaleY; subAxis2D_Z[i].X:=ROUND(oX+tX); subAxis2D_Z[i].Y:=ROUND(oY-tY); end; for i := 0 to PointsCount do for j := 0 to PointsCount do begin tX:=(Points3D[i][j].X+Points3D[i][j].Y*cos(AlphaP))*ScaleX; tY:=(Points3D[i][j].Z+Points3D[i][j].Y*sin(AlphaP))*ScaleY; Points2D[i][j].X:=ROUND(oX+tX); Points2D[i][j].Y:=ROUND(oY-tY); end; DrawBuffer.Canvas.Pen.Width:=3; DrawBuffer.Canvas.Pen.Color := clBlue; DrawBuffer.Canvas.Brush.Color := clGreen; DrawBuffer.Canvas.MoveTo(Axis2D[1].X,Axis2D[1].Y); DrawBuffer.Canvas.LineTo(Axis2D[2].X,Axis2D[2].Y); DrawBuffer.Canvas.MoveTo(Axis2D[3].X,Axis2D[3].Y); DrawBuffer.Canvas.LineTo(Axis2D[4].X,Axis2D[4].Y); DrawBuffer.Canvas.MoveTo(Axis2D[5].X,Axis2D[5].Y); DrawBuffer.Canvas.LineTo(Axis2D[6].X,Axis2D[6].Y); DrawBuffer.Canvas.Pen.Width :=2; DrawBuffer.Canvas.Pen.Color := clBlue; for i:=0 to 6 do begin DrawBuffer.Canvas.MoveTo(subAxis2D_X[2*i].X, subAxis2D_X[2*i].Y); DrawBuffer.Canvas.LineTo(subAxis2D_X[2*i+1].X, subAxis2D_X[2*i+1].Y); DrawBuffer.Canvas.MoveTo(subAxis2D_Y[2*i].X, subAxis2D_Y[2*i].Y); DrawBuffer.Canvas.LineTo(subAxis2D_Y[2*i+1].X, subAxis2D_Y[2*i+1].Y); DrawBuffer.Canvas.MoveTo(subAxis2D_Z[2*i].X, subAxis2D_Z[2*i].Y); DrawBuffer.Canvas.LineTo(subAxis2D_Z[2*i+1].X, subAxis2D_Z[2*i+1].Y); end; // Ðèñóåì íàø ïîëèãîí. DrawBuffer.Canvas.Pen.Width :=1; DrawBuffer.Canvas.Pen.Color := clBlack; DrawBuffer.Canvas.Brush.Color := clGreen; for i := 0 to PointsCount do begin DrawBuffer.Canvas.MoveTo(Points2D[i][0].X, Points2D[i][0].Y); for j := 1 to PointsCount do DrawBuffer.Canvas.LineTo(Points2D[i][j].X, Points2D[i][j].Y); end; for i := 0 to PointsCount do begin DrawBuffer.Canvas.MoveTo(Points2D[0][i].X, Points2D[0][i].Y); for j := 1 to PointsCount do DrawBuffer.Canvas.LineTo(Points2D[j][i].X, Points2D[j][i].Y); end; //DrawBuffer.Canvas.Polygon(Points2D); Image1.Canvas.Draw(0, 0, DrawBuffer); end; end; procedure TForm1.ClearBuffer; begin DrawBuffer.Canvas.Pen.Color := BufferColor; DrawBuffer.Canvas.Brush.Color := BufferColor; DrawBuffer.Canvas.Rectangle(0, 0, Image1.Width, Image1.Height); end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin if DrawBuffer <> nil then begin DrawBuffer.Free; DrawBuffer := nil; end; end; procedure TForm1.Timer1Timer(Sender: TObject); var i,j:integer; begin //https://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D1%82%D1%80%D0%B8%D1%86%D0%B0_%D0%BF%D0%BE%D0%B2%D0%BE%D1%80%D0%BE%D1%82%D0%B0 Alpha:=Alpha+0.05; X0:=-3.14; Xn:=3.14; Y0:=-3.14; Yn:=3.14; dX:= (Xn-X0)/PointsCount; dY:= (Yn-Y0)/PointsCount; for i:=0 to PointsCount do for j:=0 to PointsCount do begin Points3D[i][j].X:=(X0+i*dX)*cos(Alpha)-(Y0+j*dY)*sin(Alpha); Points3D[i][j].Y:=(X0+i*dX)*sin(Alpha)+(Y0+j*dY)*cos(Alpha); Points3D[i][j].Z:=Points3D[i][j].Z*1; end; DrawPoints; end; procedure TForm1.Button2Click(Sender: TObject); begin Timer1.Enabled:= not Timer1.Enabled; end; end.