Плоскопараллельное перемещение

 

Предназначен для изменения положения точки на плоскости. При этом точка перемещается вместе с некоторой текущей базой - точкой(XT, YT) и может вращаться вокруг этой точки.

Procedure PP(var PX,PY: RealWektor; N: byte);

var XX: Float;

begin

if Ugol <> 0 then begin

while N>0 do begin

XX:=PX[N];

PX[N]:=XT + XX´Cos(Ugol) + PY[N]´Sin(Ugol);

PY[N]:=YT - XX´Sin(Ugol) + PY[N]´Cos(Ugol);

 

Dec(N);

end;

end

else begin

while N>0 do begin

PX[N]:=XT + PX[N];

PY[N]:=YT + PY[N];

Dec(N);

end;

end;

end;

 

Если составить оператор

Procedure Preobr(N :byte);

begin

PP(PX,PY,N)

end;

то для изменения положения 4-х вершин прямоугольника следует (рис. 121):

- сохранить исходные значения координат текущей базы и текущий угол

Рис. 121 XTS:=XT; YTS:=YT; Ugs:= Ugol;

- ввести новые их значения XT:=XT1; YT:=YT1; Ugol:= U;

- присвоить PX[1]:=X1; PY[1]:=Y1; PX[2]:=X2; PY[2]:=Y2; PX[3]:=X3;

PY[3]:=Y3; PX[4]:=X4; PY[4]:=Y4; {Заполнен массив точек}

- выполнить поворот четырех точек Preobr(4);

- выполнить обратные присвоения после поворота

X1:=PX[1]; Y1:=PY[1]; X2:=PX[2]; Y2:=PY[2]; X3:=PX[3]; Y3:=PY[3];

X4:=PX[4]; Y4:=PY[4];

- возвратить исходные значения

XT:=XTS, YT:=YTS, Ugol:= Ugs.

 

3.3.6. Угловая длина дуги

 

Дуга задана координатами центра(XC,YC), начальной точки (X1,Y1), конечной точки (X2,Y2) и направлением (направление = 1 - против часовой стрелки, направление = 2 - по часовой) (рис. 122).

Если измерить текущий угол Ug начальной точки дуги и повернуть конечную точку вокруг точки(ХС,YC) на угол ( - Ug ), то угловая длина дуги UD будет равна текущему углу конечной точки.

 

 

Программное описание оператора:

 

begin

DlinaO(XC,YC,X1,Y1,R); {радиус дуги}

DlinaO(X1,Y1,X2,Y2,LТ); {расстояние между начальной и конечной точками}

if R>0 then begin

if (LT<=0.01) or ((X1=X2) and (Y1=Y2))

Рис. 122 then begin

if напр.=1 then UD=360

else UD=0;

end

else begin

TekUgol( XC,YC,X1,Y1,Ug );

 

XTS:=XT; YTS:=YT; UgS:=Ugol;

XT:=0; YT:=0; Ugol:= - Ug;

PX[1]:=X2-XC; PY[1]:=Y2-YC;

{заполнен массив точек}

Preobr[1];

TekUgol( XC,YC,PX[1]+X2,PY[1]+Y2,UD );

if (UD>Ug) and (напр.=1) then UD:=UD

else UD:=360 - UD;

if (напр.=1) and ((UD<=0.01) or (UD>=359.99)

then UD:=360

else UD:=0;

XT:=XTS; YT:=YTS; Ugol:= UgS;

end;

end;

Значение угла следует округлить до 0,0001°.

Оператор: DlinaD(XC,YC,X1,Y1, X2,Y2,напр.,UD).

 

Принадлежность точки дуге

 

Программное описание оператора:

begin

DlinaO(XC,YC,X1,Y1,R); {радиус дуги}

DlinaO(XС,YС,X,Y,LТ); {расстояние от центра до точки (рис. 123)}

DlinaO(X1,Y1,X,Y,L1); {расстояния от точки до начала дуги}

 

DlinaO(X2,Y2,X,Y,L2); {расстояния от точки до конца дуги}

DlinaD(XC,YC,X1,Y1, X2,Y2,1,UD);

{длина дуги}

DlinaD(XC,YC,X1,Y1, X,Y,1,U); {длина дуги от начальной точки до точки(X,Y)}

if (abc(LT-R)<0.05 and (R>0) then begin

if (L1 < 0.05) or (L2 < 0.05) then P:=1

else if UD > U then P:=1

Рис. 123 else P:=0;

end

else P:=0;

end;

Р = 1 - точка принадлежит дуге, Р = 0 - точка не принадлежит дуге. В операторах длины дуги в данном случае напр.=1, т.е. дуга направлена против часовой стрелки.

Оператор: PikDug(X,Y,XC,YC,X1,Y1, X2,Y2,напр.,P).