Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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<Points3D[i][j].Z) then
- zMax:= Points3D[i][j].Z;
- end;
- ScaleX:=50;//(Xn-X0);
- ScaleY:=100;//(zMax-zMin);
- //ScaleY:=100;
- DrawPoints;
- end;
- procedure TForm1.FormCreate(Sender: TObject);
- begin
- // Âû÷èñëÿåì öåíòð ýêðàíà
- oX := Image1.Width div 2;
- oY := Image1.Height div 2;
- Alpha:=0;
- AlphAP:=ArcTan(1)/4;
- // ScaleX:=50;
- // ScaleY:=25;
- // Óñòàíàâëèâàåì öâåò ôîíà (áóôôåðà ðèñîâàíèÿ)
- BufferColor := clWhite;
- // Ñîçäàåì áóôôåðà ðèñîâàíèÿ
- DrawBuffer := TBitMap.Create;
- DrawBuffer.Width := Image1.Width;
- DrawBuffer.Height := Image1.Height;
- // Î÷èùàåì áóôôåð
- ClearBuffer;
- end;
- procedure TForm1.DrawPoints;
- var
- tX: Real;
- tY: Real;
- i,j: Integer;
- begin
- if DrawBuffer <> 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.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement