Бугреев ПЗ (1231492), страница 13
Текст из файла (страница 13)
a1:=(x0)+(x1-x0) / 2;b1:=(y0)+(y1-y0) / 2;c1:=(x1)+(x2-x1) / 2;d1:=(y1)+(y2-y1) / 2;
e1:=(x2)+(x3-x2) / 2;f1:=(y2)+(y3-y2) / 2; g1:=(a1)+(c1-a1) / 2;h1:=(b1)+(d1-b1) / 2;
j1:=(c1)+(e1-c1) / 2; k1:=(d1)+(f1-d1) / 2;pX:=(g1)+(j1-g1)/2;pY:=(h1)+(k1-h1)/2;
a(px,py,j1,k1,e1,f1,x3,y3,L);
end;
### Установка опорных точек и вызов рекурсии ###
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
x0:=Form1.Shape1.left+(Form1.Shape1.width div 2);
y0:=Form1.Shape1.Top+(Form1.Shape1.width div 2);
x1:=Form1.Shape2.left+(Form1.Shape1.width div 2);
y1:=Form1.Shape2.Top+(Form1.Shape1.width div 2);
x2:=Form1.Shape3.left+(Form1.Shape1.width div 2);
y2:=Form1.Shape3.Top+(Form1.Shape1.width div 2);
x3:=Form1.Shape4.left+(Form1.Shape1.width div 2);
y3:=Form1.Shape4.Top+(Form1.Shape1.width div 2); i:=0; a(x0,y0,x1,y1,x2,y2,x3,y3,L);
end;
### Алгоритм сравнения длин от первой опорной точки до остальных ###
procedure TForm1.BitBtn2Click(Sender: TObject);
var i,p,j: Integer; L1,L:real;
begin
for j:=0 to 30 do begin L:=500;
for i:=0 to 30 do begin L1:=((sqrt(sqr(T[j].X1-T[i].X1)+sqr(T[j].Y1-T[i].Y1))));
if (L1 < L) and (L1<>0) then begin L:=L1;p:=i; end; end; SG2.Cells[3,j]:=IntToStr(p); end;
end;
### Действия при создании формы ###
procedure TForm1.FormCreate(Sender: TObject);
begin P:=0; Form1.Memo1.Lines.Clear; end;
### Отрисовка линий для наглядности представления метода сравнения длин ###
procedure TForm1.BitBtn4Click(Sender: TObject);
var q:integer;
begin
Form1.Canvas.MoveTo((Form1.Shape1.Left+Form1.Shape1.Width div 2),
Form1.Shape1.Top+Form1.Shape1.Width div 2);
If (((T[0].X1)<>0) and ((T[0].Y1)<>0)) then
Form1.Canvas.LineTo(Trunc(T[0].X1),Trunc(T[0].Y1))
else Form1.Canvas.LineTo((Form1.Shape4.Left+Form1.Shape1.Width div 2),
Form1.Shape4.Top+Form1.Shape1.Width div 2);
Form1.Canvas.MoveTo(Trunc(T[kol].X1),Trunc(T[kol].Y1));
If (((T[0].X1)<>0) and ((T[0].Y1)<>0)) then
Form1.Canvas.LineTo((Form1.Shape4.Left+Form1.Shape1.Width div 2),
Form1.Shape4.Top+Form1.Shape1.Width div 2); for q:=0 to kol-1 do begin
Form1.Canvas.MoveTo(Trunc(T[q].X1),Trunc(T[q].Y1));
Form1.Canvas.LineTo(Trunc(T[q+1].X1),Trunc(T[q+1].Y1)); end;
end;
### Последовательное соединение точек линиями ###
procedure TForm1.BitBtn5Click(Sender: TObject);
begin
Form1.Canvas.MoveTo(Trunc(T[p].X1),Trunc(T[p].Y1));
Form1.Canvas.LineTo(Trunc(T[p+1].X1),Trunc(T[p+1].Y1)); Inc(P);
end;
### Занесение данных о текущем положении мыши в статус бар ###
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var p,o: string; i:integer;
begin p:=IntToStr (X); o:=IntToStr (Y); begin
StatusBar1.Panels[0].Text := 'X='+p; StatusBar1.Panels[1].Text := 'Y='+ o;
for i:=0 to kol-2 do begin
If (X=(Trunc(T[i].X1))) then StatusBar1.Panels[2].Text := SG2.Cells[0,i]; end end;
end;
### Алгоритм пузырьковой сортировки ###
procedure TForm1.Button1Click(Sender: TObject);
var Sort:boolean; tmp:Tp; i,j:integer;
begin Sort:=true; while sort do begin Sort:=false;
If (Sqrt(sqr(x0-x3)+sqr(y0-y3)))>(T[0].S1) then for i:=0 to kol-1 do
If (T[i].S1)>(T[i+1].S1) then begin sort:=true; tmp:=T[i]; T[i]:=T[i+1]; T[i+1]:=tmp;
If (Sqrt(sqr(x0-x3)+sqr(y0-y3)))>(T[0].S1) then for j:=0 to kol-1 do
If (T[j].S1)>(T[j+1].S1) then begin
sort:=true; tmp:=T[j]; T[j]:=T[j+1]; T[j+1]:=tmp; end; end; end;
end;
### Занесение данных о длинах линий в компонент мемо ###
procedure TForm1.Button2Click(Sender: TObject);
var i:integer;
begin Memo1.Lines.Clear; For i:=0 to kol-1 do Form1.Memo1.Lines.Add(FloatToStr(T[i].s1)); end;
### Поиск и отрисовка 10 точек на кривой Безье через интервал t=0,1 ###
procedure TForm1.BitBtn3Click(Sender: TObject);
var t,bezX,bezY,op,po:real;Str,w:integer;
begin
W:=Shape1.Width div 2; t:=0; Str:=1; Op:=0.1; Po:=1; while t<1 do begin
bezX:=(((1-t)*(1-t)*(1-t))*(Shape1.Left+W))+(3*t*((1-t)*
(1-t))*(Shape2.Left+W))+(3*t*t*(1-t)*(Shape3.Left+W))+(t*t*t*(Shape4.Left+W));
bezY:=(((1-t)*(1-t)*(1-t))*(Shape1.Top+W))+(3*t*((1-t)*
(1-t))*(Shape2.Top+W))+(3*t*t*(1-t)*(Shape3.Top+W))+(t*t*t*(Shape4.Top+W));
SG1.Cells[1,0]:='X'; SG1.Cells[2,0]:='Y'; SG1.Cells[3,0]:='L';
SG1.Cells[4,0]:='V'; SG1.Cells[1,Str]:=FloatToStr (bezX);
SG1.Cells[2,Str]:=FloatToStr (bezY); SG1.Cells[0,Str]:=IntToStr(Str);
Form1.Canvas.Ellipse((Trunc(Bezx)-10),(Trunc(BezY)
-10),(Trunc(Bezx)+10),(Trunc(Bezy)+10)); Inc(Str); t:=t+0.1;
If (t<>op) then begin
Sg1.Cells[3,Str-1]:=FloatTostr(sqrt(sqr(StrToFloat(Sg1.Cells[1,str-1])
-StrToFloat(Sg1.Cells[1,str-2]))+sqr(StrToFloat(Sg1.Cells[2,str-1])
-StrToFloat(Sg1.Cells[2,str-2]))));
SG1.Cells[4,Str-1]:=FloatToStr(StrToFloat(Sg1.Cells[3,Str-1])/0.1); end;
end;
end;
### Вычисление точек Катмулл-Рома ###
procedure TForm1.BitBtn6Click(Sender: TObject);
var p0x,p0y,p1x,p1y,m0x,m1x,m0y,m1y,ax,bx,cx,dx,ay,by,cy,dy,PTx,PTy,Px,Py:real;
begin
p0x:=StrToFloat(SG1.Cells[1,4]); p1x:=StrToFloat(SG1.Cells[1,7]);
m0x:=StrToFloat(SG1.Cells[1,1]); m1x:=StrToFloat(SG1.Cells[1,11]);
p0y:=StrToFloat(SG1.Cells[2,4]); p1y:=StrToFloat(SG1.Cells[2,7]);
m0y:=StrToFloat(SG1.Cells[2,1]); m1y:=StrToFloat(SG1.Cells[2,11]);
ax:=2*(p0x-p1x)+m0x+m1x; bx:=-3*(p0x-p1x)-2*(m0x+0.5*m1x); cx:=m0x;
dx:=p0x; ay:=2*(p0y-p1y)+m0y+m1y; by:=-3*(p0y-p1y)-2*(m0y+0.5*m1y); cy:=m0y; dy:=p0y;
Px:=((ax*(StrToFloat(Edit2.Text))+bx)*(StrToFloat(Edit2.Text))+cx)*StrToFloat(Edit2.Text))+dx;
Py:=((ay*(StrToFloat(Edit2.Text))+by)*(StrToFloat(Edit2.Text))+cy)*(StrToFloat(Edit2.Text))+dy;
PTx:=3*ax*sqr(StrToFloat(Edit2.Text))+2*bx*(StrToFloat(Edit2.Text))+cx;
PTy:=3*ay*sqr(StrToFloat(Edit2.Text))+2*by*(StrToFloat(Edit2.Text))+cy;
end;
end.
Приложение В
Листинг программы 3D-визуализации
unit Unit1_;
interface
uses
Windows, Forms, GLScene, GLObjects, ComCtrls, GLMisc, ExtCtrls, StdCtrls, AsyncTimer,
Classes, Controls, GLCadencer, GLWin32Viewer, VectorGeometry, GLVectorFileObjects, GLfile3DS;
type
TForm1_ = class(TForm)
GLScene1: TGLScene; GLSceneViewer1: TGLSceneViewer; TrackBar: TTrackBar;
Cube3: TGLCube; GLCamera1: TGLCamera; GLLightSource1: TGLLightSource;
CBPlay: TCheckBox; DummyCube2: TGLDummyCube; Cube4: TGLCube;TB1x: TTrackBar;
TBy: TTrackBar; Edit1: TEdit; GLLines1: TGLLines; Button1: TButton;Button2: TButton;
GLCadencer1: TGLCadencer; DC2: TGLDummyCube; DCC2: TGLCube; DCC3: TGLCube;
Cube2: TGLFreeForm; Button3: TButton; GLDummyCube1: TGLDummyCube;C2: TGLFreeForm;
procedure TrackBarChange(Sender: TObject); procedure FormResize(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure GLCadencer1Progress(Sender: TObject; const deltaTime, newTime: Double);
procedure TB1xChange(Sender: TObject) ;procedure Button1Click(Sender: TObject);
procedure MoveOnward(Obj: TGLSceneObject;const deltaTime: Double);
procedure FormCreate(Sender: TObject);procedure Button2Click(Sender: TObject);
procedure GLSceneViewer1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
procedure FormMouseWheel(Sender: TObject; Shift: TShiftState;
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
procedure Button3Click(Sender: TObject);
procedure FormKeyPress(Sender: TObject; var Key: Char);
private
{ Dйclarations privйes }
public
{ Dйclarations publiques }
end;
var
Form1_: TForm1_; B,C,PX,PZ,Sl : Single; sv,sd:TVector; sv1,sd1:TVector;
i,N : Integer; mx,my:integer;
implementation
{$R *.DFM}
uses Math, SysUtils;
## Вращение геометрии куб компонентом трэкбар ###
procedure TForm1_.TrackBarChange(Sender: TObject);
var t : Integer;
begin t:=TrackBar.Position; Cube2.TurnAngle:=t;
end;
### Организация движения моделей по сплайну ###
procedure TForm1_.GLCadencer1Progress(Sender: TObject; const deltaTime,
newTime: Double);
var xx : Single;
begin
if sl>0 then begin xx:=sl;//*sl*(3-2*sl);
Cube2.Direction.asVector:=VectorLerp(VectorMake((GLLines1.Nodes[i].X
-GLLines1.Nodes[i-1].X)/2,0,(GLLines1.Nodes[i].Z-GLLines1.Nodes[i-1].Z)/2),sd,xx);
B:=GLLines1.Nodes[i+1].Z+GLLines1.Nodes[i-1].Z;
C:=GLLines1.Nodes[i+1].X+GLLines1.Nodes[i-1].X;PX:=C/2;
PZ:=B/2; Cube2.Position.asVector:=VectorLerp(VectorMake(PX,0,PZ),sv,xx);
C2.Direction.asVector:=VectorLerp(VectorMake((GLLines1.Nodes[N].X
-GLLines1.Nodes[N-1].X)/2,0,(GLLines1.Nodes[N].Z-GLLines1.Nodes[N-1].Z)/2),sd1,xx);
B:=GLLines1.Nodes[N+1].Z+GLLines1.Nodes[N-1].Z;
C:=GLLines1.Nodes[N+1].X+GLLines1.Nodes[N-1].X; PX:=C/2;
PZ:=B/2; C2.Position.asVector:=VectorLerp(VectorMake(PX,0,PZ),sv1,xx); sl:=sl-deltatime/5;
end else if sl<0 then begin
B:=GLLines1.Nodes[i+1].Z+GLLines1.Nodes[i-1].Z;
C:=GLLines1.Nodes[i+1].X+GLLines1.Nodes[i-1].X; PX:=C/2; PZ:=B/2;
Cube2.Position.X:=PX; Cube2.Position.Z:=PZ; sv:= Cube2.Position.asVector;
B:=(GLLines1.Nodes[i+1].Z-GLLines1.Nodes[i-1].Z)/2;
C:=(GLLines1.Nodes[i+1].X-GLLines1.Nodes[i-1].X)/2;sd:= Cube2.Direction.asVector;
B:=GLLines1.Nodes[N+1].Z+GLLines1.Nodes[N-1].Z;
C:=GLLines1.Nodes[N+1].X+GLLines1.Nodes[N-1].X; PX:=C/2; PZ:=B/2;
C2.Position.X:=PX; C2.Position.Z:=PZ; sv1:= C2.Position.asVector;
B:=(GLLines1.Nodes[N+1].Z-GLLines1.Nodes[N-1].Z)/2;
C:=(GLLines1.Nodes[N+1].X-GLLines1.Nodes[N-1].X)/2;sd1:= C2.Direction.asVector;sl:=0;
if i < 9 then begin sl:=1; Inc(i); Inc(N)end; end;
if CBPlay.Checked and Visible then begin TrackBar.Position:=((TrackBar.Position+1) mod 360);
end;
end;
procedure TForm1_.FormResize(Sender: TObject);
begin GLSceneViewer1.ResetPerformanceMonitor;
end;
procedure TForm1_.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin CBPlay.Checked:=False;
end;
### Вращение второй геометрии куб компонентом ###
procedure TForm1_.TB1xChange(Sender: TObject);
begin
i:=0; B:= TB1x.Position/50+1; C:= TBY.Position/50; Edit1.Text:=FloatToStr(B);
Cube2.Direction.asVector:=VectorMake(C, 0,B); PZ:=C/ 2; PX:=B/ 2;
Cube2.Position.X:=PX;Cube2.Position.Z:=PZ;
end;















