andruhovski icon

Demo

andruhovski | PRO | 05/15/16 02:21:04 PM UTC | 0 ⭐ | 10332 👁️ | Never ⏰ | []
Delphi |

8.56 KB

|

None

|

0 👍

/

0 👎

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.

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎