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
0 B
|👍
/👎
0 B
|👍
/👎