SHOW:
|
|
- or go back to the newest paste.
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. |