Advertisement
andruhovski

Demo

May 15th, 2016
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, StdCtrls, ExtCtrls;
  8. const PointsCount = 25;
  9.       rPoint      = 3;
  10. type
  11.   // Ñòðóêòóðà îïèñûâàþùàÿ òî÷êó â ïðîñòðàíñòâå
  12.  
  13.   TPoint3D = record
  14.     X: Real;
  15.     Y: Real;
  16.     Z: Real;
  17.   end;
  18.  
  19. type
  20.   TForm1 = class(TForm)
  21.     Image1: TImage;
  22.     Button1: TButton;
  23.     Timer1: TTimer;
  24.     Button2: TButton;
  25.     procedure Button1Click(Sender: TObject);
  26.     procedure FormCreate(Sender: TObject);
  27.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  28.     procedure Timer1Timer(Sender: TObject);
  29.     procedure Button2Click(Sender: TObject);
  30.  { Private declarations }
  31.   private
  32.     // Êîîðäèíàòû öåíòðà ýêðàíà
  33.     oX: Integer;
  34.     oY: Integer;
  35.  
  36.     ScaleX,ScaleY:real;
  37.     DrawBuffer:  TBitMap;    // Áóôåð äëÿ ðèñîâàíèÿ
  38.     BufferColor: TColor;     // Öâåò áóôåðà
  39.     X0,Y0,Xn,Yn,dX,dY : Real;
  40.     zMin, zMax: real;
  41.     Alpha: Real;
  42.     AlphaP: Real;
  43.     Points3D: array[0..PointsCount,0..PointsCount] of TPoint3D; // Ìàññèâ òðåõìåðíûõ òî÷åê
  44.     Points2D: array[0..PointsCount,0..PointsCount] of TPoint;
  45.     subAxis3D_X: array[0..13] of TPoint3D;
  46.     subAxis3D_Y: array[0..13] of TPoint3D;
  47.     subAxis3D_Z: array[0..13] of TPoint3D;
  48.     subAxis2D_X: array[0..13] of TPoint;
  49.     subAxis2D_Y: array[0..13] of TPoint;
  50.     subAxis2D_Z: array[0..13] of TPoint;
  51.     Axis3D: array[0..8] of  TPoint3D;
  52.     Axis2D: array[0..8] of  TPoint;
  53.     procedure ClearBuffer;  // Î÷èñòêà áóôåðà ðèñîâàíèÿ
  54.     procedure DrawPoints;   // Ïðîöåäóðà ðèñîâàíèÿ òî÷åê
  55.   public
  56.     { Public declarations }
  57.   end;
  58.  
  59. var
  60.   Form1: TForm1;
  61.  
  62. implementation
  63.  
  64. {$R *.dfm}
  65.  
  66. procedure TForm1.Button1Click(Sender: TObject);
  67. var i,j : integer;
  68. begin
  69.     X0:=-3.14; Xn:=3.14;
  70.     Y0:=-3.14; Yn:=3.14;
  71.     dX:= (Xn-X0)/PointsCount;
  72.     dY:= (Yn-Y0)/PointsCount;
  73.     Axis3d[0].X:=0;
  74.     Axis3d[0].Y:=0;
  75.     Axis3d[0].Z:=0;
  76.  
  77.     Axis3d[1].X:=-4;
  78.     Axis3d[1].Y:=0;
  79.     Axis3d[1].Z:=0;
  80.     Axis3d[2].X:=4;
  81.     Axis3d[2].Y:=0;
  82.     Axis3d[2].Z:=0;
  83.  
  84.     Axis3d[3].X:=0;
  85.     Axis3d[3].Y:=-4;
  86.     Axis3d[3].Z:=0;
  87.  
  88.     Axis3d[4].X:=0;
  89.     Axis3d[4].Y:=4;
  90.     Axis3d[4].Z:=0;
  91.  
  92.     Axis3d[5].X:=0;
  93.     Axis3d[5].Y:=0;
  94.     Axis3d[5].Z:=-4;
  95.  
  96.     Axis3d[6].X:=0;
  97.     Axis3d[6].Y:=0;
  98.     Axis3d[6].Z:=4;
  99.   for i:=0 to 6 do
  100.   begin
  101.    subAxis3D_X[2*i].X:=Trunc(X0)+i;
  102.    subAxis3D_X[2*i].Y:=-0.2;
  103.    subAxis3D_X[2*i].Z:=0;
  104.    subAxis3D_X[2*i+1].X:=Trunc(X0)+i;
  105.    subAxis3D_X[2*i+1].Y:=0.2;
  106.    subAxis3D_X[2*i+1].Z:=0;
  107.   end;
  108.   for i:=0 to 6 do
  109.   begin
  110.    subAxis3D_Y[2*i].X:=-0.2;
  111.    subAxis3D_Y[2*i].Y:=Trunc(Y0)+i;
  112.    subAxis3D_Y[2*i].Z:=0;
  113.    subAxis3D_Y[2*i+1].X:=0.2;
  114.    subAxis3D_Y[2*i+1].Y:=Trunc(Y0)+i;
  115.    subAxis3D_Y[2*i+1].Z:=0;
  116.   end;
  117.   for i:=0 to 6 do
  118.   begin
  119.    subAxis3D_Z[2*i].X:=0;
  120.    subAxis3D_Z[2*i].Y:=-0.2;
  121.    subAxis3D_Z[2*i].Z:=-3+i;
  122.    subAxis3D_Z[2*i+1].X:=0;
  123.    subAxis3D_Z[2*i+1].Y:=0.2;
  124.    subAxis3D_Z[2*i+1].Z:=-3+i;
  125.   end;
  126.  
  127.   for i:=0 to PointsCount do
  128.    for j:=0 to PointsCount do
  129.     begin
  130.       Points3D[i][j].X:=X0+i*dX;
  131.       Points3D[i][j].Y:=Y0+j*dY;
  132.       Points3D[i][j].Z:=cos(Points3D[i][j].X+sin(Points3D[i][j].Y));
  133.     end;
  134.  
  135.    zMin:=Points3D[0][0].Z;
  136.    zMax:=zMin;
  137.    for i:=0 to PointsCount do
  138.     for j:=0 to PointsCount do
  139.     begin
  140.       if (zMin>Points3D[i][j].Z) then
  141.       zMin:= Points3D[i][j].Z;
  142.       if (zMax<Points3D[i][j].Z) then
  143.       zMax:= Points3D[i][j].Z;
  144.     end;
  145.   ScaleX:=50;//(Xn-X0);
  146.   ScaleY:=100;//(zMax-zMin);
  147.   //ScaleY:=100;
  148.   DrawPoints;
  149. end;
  150.  
  151. procedure TForm1.FormCreate(Sender: TObject);
  152. begin
  153.   // Âû÷èñëÿåì öåíòð ýêðàíà
  154.   oX := Image1.Width div 2;
  155.   oY := Image1.Height div 2;
  156.  
  157.   Alpha:=0;
  158.   AlphAP:=ArcTan(1)/4;
  159.  
  160. //  ScaleX:=50;
  161. //  ScaleY:=25;
  162.   // Óñòàíàâëèâàåì öâåò ôîíà (áóôôåðà ðèñîâàíèÿ)
  163.  
  164.   BufferColor       := clWhite;
  165.  
  166.   // Ñîçäàåì áóôôåðà ðèñîâàíèÿ
  167.  
  168.   DrawBuffer        := TBitMap.Create;
  169.   DrawBuffer.Width  := Image1.Width;
  170.   DrawBuffer.Height := Image1.Height;
  171.  
  172.   // Î÷èùàåì áóôôåð
  173.  
  174.   ClearBuffer;
  175. end;
  176.  
  177. procedure TForm1.DrawPoints;
  178. var
  179.   tX:  Real;
  180.   tY:  Real;
  181.   i,j: Integer;
  182.  
  183. begin
  184.   if DrawBuffer <> nil then
  185.   begin
  186.     ClearBuffer;
  187.     for i:=0 to 6 do
  188.      begin
  189.         tX:=(Axis3D[i].X+Axis3D[i].Y*cos(AlphaP))*ScaleX;
  190.         tY:=(Axis3D[i].Z+Axis3D[i].Y*sin(AlphaP))*ScaleY;
  191.         Axis2D[i].X:=ROUND(oX+tX);
  192.         Axis2D[i].Y:=ROUND(oY-tY);
  193.      end;
  194.  
  195.      for i:=0 to 13 do
  196.      begin
  197.         tX:=(subAxis3D_X[i].X+subAxis3D_X[i].Y*cos(AlphaP))*ScaleX;
  198.         tY:=(subAxis3D_X[i].Z+subAxis3D_X[i].Y*sin(AlphaP))*ScaleY;
  199.         subAxis2D_X[i].X:=ROUND(oX+tX);
  200.         subAxis2D_X[i].Y:=ROUND(oY-tY);
  201.  
  202.         tX:=(subAxis3D_Y[i].X+subAxis3D_Y[i].Y*cos(AlphaP))*ScaleX;
  203.         tY:=(subAxis3D_Y[i].Z+subAxis3D_Y[i].Y*sin(AlphaP))*ScaleY;
  204.         subAxis2D_Y[i].X:=ROUND(oX+tX);
  205.         subAxis2D_Y[i].Y:=ROUND(oY-tY);
  206.  
  207.         tX:=(subAxis3D_Z[i].X+subAxis3D_Z[i].Y*cos(AlphaP))*ScaleX;
  208.         tY:=(subAxis3D_Z[i].Z+subAxis3D_Z[i].Y*sin(AlphaP))*ScaleY;
  209.         subAxis2D_Z[i].X:=ROUND(oX+tX);
  210.         subAxis2D_Z[i].Y:=ROUND(oY-tY);
  211.      end;
  212.  
  213.     for i := 0 to PointsCount do
  214.       for j := 0 to PointsCount do
  215.       begin
  216.           tX:=(Points3D[i][j].X+Points3D[i][j].Y*cos(AlphaP))*ScaleX;
  217.           tY:=(Points3D[i][j].Z+Points3D[i][j].Y*sin(AlphaP))*ScaleY;
  218.           Points2D[i][j].X:=ROUND(oX+tX);
  219.           Points2D[i][j].Y:=ROUND(oY-tY);
  220.       end;
  221.  
  222.  
  223.     DrawBuffer.Canvas.Pen.Width:=3;
  224.     DrawBuffer.Canvas.Pen.Color   := clBlue;
  225.     DrawBuffer.Canvas.Brush.Color := clGreen;
  226.  
  227.  
  228.     DrawBuffer.Canvas.MoveTo(Axis2D[1].X,Axis2D[1].Y);
  229.     DrawBuffer.Canvas.LineTo(Axis2D[2].X,Axis2D[2].Y);
  230.  
  231.     DrawBuffer.Canvas.MoveTo(Axis2D[3].X,Axis2D[3].Y);
  232.     DrawBuffer.Canvas.LineTo(Axis2D[4].X,Axis2D[4].Y);
  233.  
  234.     DrawBuffer.Canvas.MoveTo(Axis2D[5].X,Axis2D[5].Y);
  235.     DrawBuffer.Canvas.LineTo(Axis2D[6].X,Axis2D[6].Y);
  236.  
  237.  
  238.     DrawBuffer.Canvas.Pen.Width   :=2;
  239.     DrawBuffer.Canvas.Pen.Color   := clBlue;
  240.  
  241.     for i:=0 to 6 do
  242.     begin
  243.       DrawBuffer.Canvas.MoveTo(subAxis2D_X[2*i].X, subAxis2D_X[2*i].Y);
  244.       DrawBuffer.Canvas.LineTo(subAxis2D_X[2*i+1].X, subAxis2D_X[2*i+1].Y);
  245.       DrawBuffer.Canvas.MoveTo(subAxis2D_Y[2*i].X, subAxis2D_Y[2*i].Y);
  246.       DrawBuffer.Canvas.LineTo(subAxis2D_Y[2*i+1].X, subAxis2D_Y[2*i+1].Y);
  247.       DrawBuffer.Canvas.MoveTo(subAxis2D_Z[2*i].X, subAxis2D_Z[2*i].Y);
  248.       DrawBuffer.Canvas.LineTo(subAxis2D_Z[2*i+1].X, subAxis2D_Z[2*i+1].Y);
  249.     end;
  250.     // Ðèñóåì íàø ïîëèãîí.
  251.  
  252.     DrawBuffer.Canvas.Pen.Width   :=1;
  253.     DrawBuffer.Canvas.Pen.Color   := clBlack;
  254.     DrawBuffer.Canvas.Brush.Color := clGreen;
  255.     for i := 0 to PointsCount do
  256.       begin
  257.            DrawBuffer.Canvas.MoveTo(Points2D[i][0].X, Points2D[i][0].Y);
  258.            for j := 1 to PointsCount do
  259.                DrawBuffer.Canvas.LineTo(Points2D[i][j].X, Points2D[i][j].Y);
  260.       end;
  261.  
  262.     for i := 0 to PointsCount do
  263.       begin
  264.            DrawBuffer.Canvas.MoveTo(Points2D[0][i].X, Points2D[0][i].Y);
  265.            for j := 1 to PointsCount do
  266.                DrawBuffer.Canvas.LineTo(Points2D[j][i].X, Points2D[j][i].Y);
  267.       end;
  268.  
  269.     //DrawBuffer.Canvas.Polygon(Points2D);
  270.     Image1.Canvas.Draw(0, 0, DrawBuffer);
  271.     end;
  272. end;
  273.  
  274. procedure TForm1.ClearBuffer;
  275. begin
  276.   DrawBuffer.Canvas.Pen.Color   := BufferColor;
  277.   DrawBuffer.Canvas.Brush.Color := BufferColor;
  278.   DrawBuffer.Canvas.Rectangle(0, 0, Image1.Width, Image1.Height);
  279. end;
  280.  
  281. procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
  282. begin
  283.  if DrawBuffer <> nil then
  284.   begin
  285.     DrawBuffer.Free;
  286.     DrawBuffer := nil;
  287.   end;
  288. end;
  289.  
  290. procedure TForm1.Timer1Timer(Sender: TObject);
  291. var i,j:integer;
  292. begin
  293.   //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
  294.   Alpha:=Alpha+0.05;
  295.   X0:=-3.14; Xn:=3.14;
  296.   Y0:=-3.14; Yn:=3.14;
  297.   dX:= (Xn-X0)/PointsCount;
  298.   dY:= (Yn-Y0)/PointsCount;
  299.   for i:=0 to PointsCount do
  300.    for j:=0 to PointsCount do
  301.     begin
  302.       Points3D[i][j].X:=(X0+i*dX)*cos(Alpha)-(Y0+j*dY)*sin(Alpha);
  303.       Points3D[i][j].Y:=(X0+i*dX)*sin(Alpha)+(Y0+j*dY)*cos(Alpha);
  304.       Points3D[i][j].Z:=Points3D[i][j].Z*1;
  305.     end;
  306.   DrawPoints;
  307. end;
  308.  
  309. procedure TForm1.Button2Click(Sender: TObject);
  310. begin
  311.   Timer1.Enabled:= not Timer1.Enabled;
  312. end;
  313.  
  314. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement