Предназначен для изменения положения точки на плоскости. При этом точка перемещается вместе с некоторой текущей базой - точкой(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).