Procedure
Tch_NiK(X Cg,YCg,Xg1,Yg1,Xg2,Yg2,Xs,Y s,X Tn,YTn,LD k);
¯
NOKO S NK NK. NOKO. NK NK.
NOS - SN - NS - SK - KS - SKO .. . , SN SK NOKO.
n(XTn,YTn) (XT,YT) e Tb. Tn k. Tn Te Tn Tb , Tb NOKO, SNe, Skb. , SNe, - SKb.
. 107 , -
NOKO.
NOKO. .
, .
, , S. S - NOKO c ().
n(XTn,YTn) NO Tk(XTk,YTk).
begin
if Obhod=1 then Hod:=2 else Hod:=1; {
Hod }
, , :
if El=1 then begin
:
TekUgol(Xg1, Yg1, Xg2, Yg2,Ug);
OtrDug(Xg1,Yg1,Ug,Xs,Ys,Ri,XP1,YP1,XP2,YP2,P);
{Ri - }
(XTn,YTn) (XTk,YTk) :
DlinaL(Xg1,Yg1,XP1,YP1,L1);
DlinaL(Xg1,Yg1,XP2,YP2,L2);
if L1<L2 then begin
XTn:=XP1; YTn:=YP1; XTk:=XP2; YTk:=YP2;
end
else begin
XTn:=XP2; YTn:=YP2; XTk:=XP1; YTk:=YP1;
end;
Tk :
PikOtr(XTk,YTk,Xg1,Yg1,Xg2,Yg2,P);
LDk:
if P=1 then LDk:=180 else LDk:=360;
{Ldk - max , LD<=LDk .
S , LDk=360.
LDk=180}
end
, , :
else begin
:
DugDug(XCg,YCg,R,Xs,Ys,Ri,XP1,YP1,XP2,YP2,P);
(Xg1,Yg1) (XP1,YP1), (XP2,YP2):
DlinaD(Xg,YCg,Xg1,Yg1,XP1,YP1,Nag,LD1);
DlinaD(XCg,YCg,Xg1,Yg1,XP2,YP2,Nag,LD2);
|
|
(XTn,YTn) (XTk,YTk) :
if LD1<LD2 then begin
XTn:=XP1; YTn:=YP1; XTk:=XP2; YTk:=YP2;
end
else begin
XTn:=XP2; YTn:=YP2; XTk:=XP1; YTk:=YP1;
end;
LDk:
DlinaD(Xs,Ys,XTn,YTn,XTk,YTk,Hod,LDk);
end;
end;
, , . .
, (.108). , -
. 108 S1, S2 L, L- .
, .
:
Procedure Box_Otr;
var P, Ps:byte;
begin
Ps:=0; { }
Repeat
1- :
SledLine(g, 1, Nag, Xg1, Yg1, Xg2, Yg2, XCg, YCg),
TekUgol(Xg1, Yg1, Xg2, Yg2,Ug);
(Xm1,Ym1,Xm2,Ym2) :
DwaOtr(Xm1, Ym1,Um, Xg1, Yg1,Ug,XP,YP,P);
XP,YP :
if P=1 then PikOtr(XP,YP,Xm1,Ym1,Xm2,Ym2,P);
XP,YP :
if P=1 then PikOtr(XP,YP,Xg1,Yg1,Xg2,Yg2,P);
if P=1 then begin
Ps:=Ps+1; { }
Xs:=XP; Ys:=YP; { }
DlinaL(Xm1,Ym1,Xs,Ys,L); {
}
if L>0 then
e L:
StrokBox(e, Ps, L>, Xg1, Yg1, Xg2, Yg2, Xs, Ys);
end;
Until E=Nkg; { }
if Ps=0 then begin
Xm1,Ym1 :
Tch_Obl(Xm1,Ym1,X1,Y1,X2,Y2,P);
if P=1 then
o:
RisLineBox(o, 1, Nao, Xm1, Ym1, Xm2, Ym2, XCm, YCm);
end;
, , (Procedure FiltrOtr):
if Ps>0 then FiltrOtr;
end;
Procedure FiltrOtr; {
, , -
}
var Xm1s, Ym1s. Xk, Yk:Float;
begin
Xm1s:=Xm1; Ym1s:=Ymx; { }
:
if =1 then Hod:=2 else Hod:=1;
Repeat
1- , :
SledStrok(e, Ps, L>, Xg1, Yg1, Xg2, Yg2, Xs, Ys),
DlinaL(Xm1,Ym1,Xs,Ys,L); {
}
if L>0 theh begin
:
Tch_NiK(XCg,YCg,Xg1,Yg1,Xg2,Yg2,Xs,Ys,XTn,YTn,LDk);
TekUgol(Xm1, Ym1, Xm2, Ym2,Ug);
|
|
, . (Xm1,Ym1,Xs,Ys):
OtrDug(Xm1,Ym1,Um,Xs,Ys,Ri,XP1,YP1,XP2,YP2,P);
PikOtr(XP1,YP1,Xm1,Ym1,Xs,Ys,P);
if P=1 then begin
Xk:=XP1; Yk:=YP1;
end
else begin
Xk:=XP2; Yk:=YP2;
end;
:
DlinaD(Xs,Ys,XTn,YTn,Xk,Yk,Hod,LD);
if LD<LDk then { o}
RisLineBox(o, 1, Nao, Xm1, Ym1, Xs, Ys, XCo, YCo);
end;
Xm1:=Xs; Ym1:=Ys;
Until E=Nke; { }
:
DlinaL(Xm1,Ym1,Xm2,Ym2,L);
if L>0 then begin
, (Xm2, Ym2):
Tch_Obl(Xm2,Ym2,X1,Y1,X2,Y2,P);
if P=1 then { o}
RisLineBox(o, 1, Nao, Xm1, Ym1, Xm2, Ym2, XCo, YCo);
end;
X Y :
Xm1:=Xm1s; Ym1:=Ym1s;
end;
,
, , . .
NK (. 109). - S1, S2, S3, S4, S5
. 109 LD, LD - N S.
Procedure Box_Dug;{ }
var P, Pt, Ps:byte;
begin
Ps:=0; { }
Repeat
1- :
SledLine(g, 1, Nag, Xg1, Yg1, Xg2, Yg2, XCg, YCg),
TekUgol(Xg1, Yg1, Xg2, Yg2,Ug);
(XCm,YCm,Xm1,Ym1,Xm2,Ym2) :
OtrDug(Xg1,Yg1,Ug,XCm,YCm,R,XP1,YP1,XP2,YP2,Pt);
(XP1,YP1) :
if Pt=1 then PikOtr(XP1,YP1,Xg1,Yg1,Xg2,Yg2,P);
(XP1,YP1) :
if P=1 then
. PikDug(XP1,YP1,XCm,YCm,Xm1,Ym1,Xm2,Ym2,Nam,P);
if P=1 then begin
Ps:=Ps+1; { }
Xs:=XP1; Ys:=YP1; { }
S:
DlinaD(Xm,Ym,Xm1,Ym1,Xs,Ys,nam,LD);
if LD>0 then
LD:
StrokBox(e, Ps, LD>, Xg1, Yg1, Xg2, Yg2, Xs, Ys);
end;
2- (XP2,YP2) :
if Pt=1 then PikOtr(XP2,YP2,Xg1,Yg1,Xg2,Yg2,P);
(XP2,YP2) :
if P=1 then
. PikDug(XP2,YP2,XCm,YCm,Xm1,Ym1,Xm2,Ym2,Nam,P);
if P=1 then begin
Ps:=Ps+1; { }
Xs:=XP2; Ys:=YP2; { }
S:
DlinaD(XCm,YCm,Xm1,Ym1,Xs,Ys,nam,LD);
if LD>0 then
LD:
StrokBox(e, Ps, LD>, Xg1, Yg1, Xg2, Yg2, Xs, Ys);
end;
Until E=Nkg; { }
if Ps=0 then begin
(Xm1,Ym1)
Tch_Obl(Xm1,Ym1,X1,Y1,X2,Y2,P);
if P=1 then
{ }
RisLineBox(o, 2, Nam, Xm1, Ym1, Xm2, Ym2, XCm, YCm);
end;
,
, (Procedure FiltrDug):
if Ps>0 then FiltrDug;
end;
Procedure FiltrDug; { ,
}
var Xm1s, Ym1s:Float;
begin
Xm1s:=Xm1; Ym1s:=Ym1;
:
if =1 then Hod:=2 else Hod:=1;
Repeat
1- , :
|
|
SledStrok(e, Ps, LD>, Xg1, Yg1, Xg2, Yg2,Xs, Ys);
:
DlinaD(XCm,YCm,Xm1,Ym1,Xs,Ys,Nam,LD1);
if LD1>0 then begin
(XTn,YTn) LDk:
Tch_NiK(XCg,YCg,Xg1,Yg1,Ug,Xs,Ys,XTn,YTn,LDk);
:
DugDug(XCm,YCm,R,Xs,Ys,Ri,XP1,YP1,XP2,YP2,P);
{Ri - }
:
DlinaD(Xs,Ys,XTn,YTn,XP1,YP1,Hod,LD1);
DlinaD(Xs,Ys,XTn,YTn,XP2,YP2,Hod,LD2);
:
if LD1<LD2 then LD:=LD1 else LD:=LD2;
if LD<LDk then { o}
RisLineBox(, 2, Nam, Xm1, Ym1, Xs, Ys, XCm, YCm);
end;
Xm1:=Xs; Ym1:=Ys;
Until E=Nke;
:
Tch_Obl(Xm2,Ym2,X1,Y1,X2,Y2,P);
if P=1 theh
{ }
RisLineBox(, 2, Nam, Xs, Ys, Xm2, Ym2, XCm, YCm);
X Y :
Xm1:=Xm1s; Ym1:=Ym1s;
end;
Procedure Box_Lin;
{ }
var m, Em, Nam:byte; Xm1, Ym1, Xm2, Ym2, XCm, YCm:float;
{ }
var g, Eg, Nag:byte; Xg1, Yg1, Xg2, Yg2, XCg, YCg:float;
{ }
var o, Eo, Nao:byte; Xo1, Yo1, Xo2, Yo2, XCo, YCo:float;
{ L}
var e, N:byte; L>, Xe1, Ye1, Xe2, Ye2, XCe, YCe:float;
{ X Y}
var X1, Y1, X2, Y2:float;
{ }
var X, Y, U, Um, Ug, Uo, Us, Xs, Ys:float:
P, Pn, Pk, Ps, E, . :byte;
Nkm, Nko, Nke; Nkg:integer;
begin
Repeat
1- , .
SledLine(m, Em, Napr, Xm1, Ym1, Xm2, Ym2, XCm, YCm);
if Em=1 then Box_Otr; { - }
if Em=2 then Box_Dug; { - }
Until E=Nkm;
end;
2. (. 110).
:
X,Y.
2- :
- , ;
- .
, , , . , . . , .
. 110
Procedure Lin_Kontur;
, :
var Em, Nam: byte: Xm1, Ym1, Xm2, Ym2, XCm, YCm:float:
:
var Eo, Nao: byte: Xo1, Yo1, Xo2, Yo2, XCo, YCo:float:
var Et, Nat: byte; Xt1, Yt1, Xt2, Yt2, XCt, YCt:float;
:
var Xs, Ys, L, L1, Lmin, Li:float;
P, P1, P2, , :byte;
begin
Nach_Lin; { }
Och_Line; { }
end;
Procedure Nach_Lin; { }
|
|
var XA,YA,XB,YB:float;
Pd:byte;
begin
L:=0; Pd:=0;
Repeat
1- :
SledLine(Bx, El, Nag, Xm1, Ym1, Xm2, Ym2, XCm, YCm);
if Em=2 then begin { }
(O, YO) (, Y) :
TekUgol(XO,YO,XCm,YCm,U);
:
DlinaL(XCm,YCm,Xm1,Ym1,R);
:
OtrDug(XO,YO,U,XCm,YCm,R,XP1,YP1,XP2,YP2,P);
(XP1,YP1) :
PikDug(XP1,YP1,Xm1,Ym1,Xm2,Ym2,Nam,P1);
(XP1,YP1) :
PikOtr(XP1,YP1,X,Y,X,Y,P2);
if P1=1 and P2=1 then begin
XA:=XP1; YA:=YP1;
end
else begin
XA:=XP2; YA:=YP2;
end;
:
Xs:=XA; Ys:=YA;
:
DlinaL(X,Y,X,Y,L1);
end;
if Em=1 then begin { }
TekUgol(Xm1,Ym1,Xm2,Ym2,U);
:
DwaOtr(Xm1, Ym1,U, XO, YO,U+90,XP,YP,P);
XB:=XP; YB:=YP;
:
Xs:=XB; Ys:=YB;
:
DlinaL(X,Y,XB,YB,L1);
end;
Pd:=Pd+1; { }
1- :
if Pd=1 then begin
:
L:= L1;
:
Eo:=Em; XCo:=XCm; YCo:=YCm;
Xo1:=Xs; Yo1:=Ys; Xo2:=Xm2; Yo2:=Ym2;
end;
:
if Pd >1 and L>L1 then begin
L:= L1;
Eo:=Em; XCo:=XCm; YCo:=YCm;
Xo1:=Xs; Yo1:=Ys; Xo2:=Xm2; Yo2:=Ym2;
end;
Until E=Nkm;
Sopr_LL ( ) Sopr_LD ( ). :
Naprawl(XC,YC,Xn,Yn,Xk,Yk,) }
if Eo=1 then Sopr_LL(XC, YC, )
else Sopr_LD(XC, YC, );
S(Xs,Ys), S. .
RisLineBox(Bx, Em, Nam, Xm1, Ym1, Xs, Ys, XCm, YCm);
end;
Na a(Na,Ka) (. 111).
Nach_Lin (Xo1:=Xs; Yo1:=Ys; Xo2:=Xm2; Yo2:=Ym2).
S1, S2 , ( Na). DL.
S2 2 ( d ), LD. d S2 Kd. a Na S2 , .
. 111
d . . S2 - S3.
S3Kc, . , , KcS2.
,
Xs, Ys.
Procedure Och_Line; { }
var Xs1; Ys1, Lmin, Li:Float; Pd:byte;
begin
Pd:=0;
Repeat
SledLine(Bx, Em, Nam, Xm1, Ym1, Xm2, Ym2, XCm, YCm);
if Em=1 then TekUgol(Xm1, Ym1, Xm2, Ym2,Um);
if Em=2 then DlinaL(Xm1, Ym1, XCm, YCm,R);
if Eo=1 and Em=1 then O_O;
if Eo=1 and Em=2 then O_D;
if Eo=2 and Em=1 then D_O;
if Eo=2 and Em=2 then D_D;
:
RisLineBox(o, Eo, Nao, Xo1, Yo1, Xo2, Yo2, XCo, YCo);
:
Eo:=Et; Nao:=Nat;
Xo1:=Xt1; Yo1:=Yt1; Xo2:=Xt2; Yo2:=Yt2; XCo:=XCt; YCo:=YCt;
Until Xt2=Xs and Yt2=Ys;
:
RisLineBox(o, Et, Nat, Xt1, Yt1, Xt2, Yt2, XCt, YCt);
end;
- , -
Procedure O_O;
- o (o1,o2) - m (m1,m2).
Li < Lmin, m 2 m1 Pm2 (. 112).
, .
|
|
begin
Lmin , ( ):
. 112
if Pd=0 then DlinaL(Xo1,Yo1,Xo2,Yo2,Lmin); {Pd - P . , d =0}
TekUgol(Xo1,Yo1,Xo2,Yo2,Uo); { }
TekUgol(Xm1,Ym1,Xm2,Ym2,Um); { }
:
DwaOtr(Xm1, Ym1,Um, Xo1, Yo1,Uo,XP,YP,P);
:
if P=1 then PikOtr(XP,YP,Xm1,Ym1,Xm2,Ym2,P);
:
if P=1 then PikOtr(XP,YP,Xo1,Yo1,Xo2,Yo2,P);
{ P=1, }
if P=1 then begin
:
DlinaL(Xo1,Yo1,XP,YP,Li);
if Li > 0 and Li <= Lmin then begin
if Pd=0 then
LDk:
Tch_NiK(XCo,YCo,Xo1,Yo1,Xo2,Yo2,XP,YP,XTn,YTn,LDk);
:
DlinaL(XP,YP,Xm2,Ym2,L);
if L>0 then begin
Tk(XTk,YTk) (XP,YP.Xm2,Ym2):
OtrDug(XP,YP,Um,XP,YP,Ri,XP1,YP1,XP2,YP2,P);
PikOtr(XP1,YP1,XP,YP,Xm2,Ym2,P);
if P=1 then begin
XTk:=XP1; YTk:=YP1;
end
else begin
XTk:=XP2; YTk:=YP2;
end;
Tn Tk:
DlinaD(XP,YP,XTn,YTn,XTk,YTk,Hod,LD);
if LD<LDk then begin
, :
Et:=1; Xt1:=XP; Yt1:=YP; Xt2:=Xm2; Yt2:=Ym2;
, LDk Lmin:
Pd:=Pd+1; LDk:=LD; if Li<Lmin then Lmin:=Li;
end;
end;
:
DlinaL(XP,YP,Xm1,Ym1,L);
if L>0 then begin
Um, .. :
TekUgol(XP,YP,Xm1,Ym1,Um);
OtrDug(XP,YP,Um,XP,YP,Ri,XP1,YP1,XP2,YP2,P);
PikOtr(XP1,YP1,XP,YP,Xm1,Ym1,P);
if P=1 then begin
XTk:=XP1; YTk:=YP1;
end
else begin
XTk:=XP2; YTk:=YP2;
end;
DlinaD(XP,YP,XTn,YTn,XTk,YTk,Hod,LD);
if LD<LDk then begin
, :
Et:=1; Xt1:=XP; Yt1:=YP; Xt2:=Xm2; Yt2:=Ym2;
, LDk Lmin:
Pd:=Pd+1; LDk:=LD; if Li<Lmin then Lmin:=Li;
end;
end;
if Li<Lmin then
{ }
Xo2:=XP; Yo2:=YP;
end;
end;
end;
- , -
Procedure O_D;
- o (o1,o2) - m (m1,m2).
Li < Lmin, m 2 m1 Pm2 (. 113). , .
. 113
begin
Lmin ,
( ):
if Pd=0 then DlinaL(Xo1,Yo1,Xo2,Yo2,Lmin); {Pd - P . , d =0}
TekUgol(Xo1,Yo1,Xo2,Yo2,Uo); { }
DlinaL(Xm,YCm,Xm1,Ym1,R); { }
2 :
OtrDug(Xo1,Yo1,Uo,XCm,YCm,R,XP1,YP1,XP2,YP2,P);
1 :
if P=1 then PikOtr(XP1,YP1,Xo1,Yo1,Xo2,Yo2,P1);
1 :
if P1=1 then
PikDug(XP1,YP1,XCm,YCm,Xm1,Ym1,Xm2,Ym2,Nam,P2);
if P1=1 and P2=1 then P3=1 else P3=0;
2 :
PikOtr(XP2,YP2,Xo1,Yo1,Xo2,Yo2,P1);
2 :
if P1=1 then
PikDug(XP2,YP2,XCm,YCm,Xm1,Ym1,Xm2,Ym2,Nam,P2);
if P1=1 and P2=1 then P4=1 else P4=0;
{ P3=1 P4=1, . 3=1 4=1, , }
if P3=1 and P4=1 then begin
DlinaL(Xo1,Yo1,XP1,YP1,L1);
DlinaL(Xo1,Yo1,XP2,YP2,L2);
if L1<L2 then begin
XP:=XP1; YP:=YP1; Li:=L1;
end
else begin
XP:=XP2; YP:=YP2; Li:=L2;
end;
end;
if P3=1 and P4=0 then begin
XP:=XP1; YP:=YP1; Li:=L1;
end;
if P3=0 and P4=1 then begin
XP:=XP2; YP:=YP2; Li:=L2;
end;
if Li > 0 and Li <= Lmin then begin
if Pd=0 then
(XTn,YTn) LDk:
Tch_NiK(XCo,YCo,Xo1,Yo1,Xo2,Yo2,XP,YP,XTn,YTn,LDk);
:
DlinaD(XCm,YCm,XP,YP,Xm2,Ym2,Nam,LD);
if LD>0 then begin
(XTk,YTk) :
DugDug(XCm,YCm,R,XP,YP,Ri,XP1,YP1,XP2,YP2,P);
PikDug(XP1,YP1,XCm,YCm,XP,YP,Xm2,Ym2,Nam,P);
if P=1 then begin
XTk:=XP1; YTk:=YP1;
end
else begin
XTk:=XP2; YTk:=YP2;
end;
:
DlinaD(XP,YP,XTn,YTn,XTk,YTk,Hod,LD);
if LD<LDk then begin
, :
Et:=2; Xt1:=XP; Yt1:=YP; Xt2:=Xm2; Yt2:=Ym2;
XCt:=XCm; YCt:=YCm;
, LDk Lmin:
Pd:=Pd+1; LDk:=LD;
if Li<Lmin then begin
Lmin:=Li;
:
Xo2:=XP; Yo2:=YP;
end;
end;
end;
:
if Nam=1 then Nam:=2 else Nam:=1;
DlinaD(XCm,YCm,XP,YP,Xm1,Ym1,Nam,LD);
if LD>0 then begin
DugDug(XCm,YCm,R,XP,YP,Ri,XP1,YP1,XP2,YP2,P);
PikDug(XP1,YP1,XCm,YCm,XP,YP,Xm1,Ym1,Nam,P);
if P=1 then begin
XTk:=XP1; YTk:=YP1;
end
else begin
XTk:=XP2; YTk:=YP2;
end;
DlinaD(XP,YP,XTn,YTn,XTk,YTk,Hod,LD);
if LD<LDk then begin
Et:=2; Xt1:=XP; Yt1:=YP; Xt2:=Xm1; Yt2:=Ym1;
XCt:=XCm; YCt:=YCm;
, LDk Lmin:
Pd:=Pd+1; LDk:=LD;
if Li<Lmin then begin
Lmin:=Li;
:
Xo2:=XP; Yo2:=YP;
end;
end;
end;
end;
end;
- , -
Procedure D_O;
- o (o1,o2) - m (m1,m2).
Li < Lmin, m 2 m1 Pm2 (. 114). , .
. 114
begin
Lmin ,
( ):
if Pd=0 then DlinaD(XCo,YCo,Xo1,Yo1,Xo2,Yo2,Nao,Lmin);
{Pd - P .
, d =0}
TekUgol(Xm1,Ym1,Xm2,Ym2,Um); { }
DlinaL(Xo,YCo,Xo1,Yo1,R); { }
:
OtrDug(Xm1,Ym1,Um,XCo,YCo,R,XP1,YP1,XP2,YP2,P);
1 :
if P=1 then PikOtr(XP1,YP1,Xm1,Ym1,Xm2,Ym2,P1);
1 :
if P1=1 then
PikDug(XP1,YP1,XCo,YCo, Xo1,Yo1,Xo2,Yo2,Nao,P2);
if P1=1 and P2=1 then P3=1 else P3=0;
2 :
if P=1 then PikOtr(XP2,YP2,Xm1,Ym1,Xm2,Ym2,P1);
2 :
if P1=1 then
PikDug(XP2,YP2,XCo,YCo,Xo1,Yo1,Xo2,Yo2,Nao,P2);
if P1=1 and P2=1 then P4=1 else P4=0;
3=1 4=1, , :
if P3=1 and P4=1 then begin
DlinaD(XCo,YCo,Xo1,Yo1,XP1,YP1,Nao,L1);
DlinaD(XCo,YCo,Xo1,Yo1,XP2,YP2,Nao,L2);
if L1<L2 then begin
XP:=XP1; YP:=YP1; Li:=L1;
end
else begin
XP:=XP2; YP:=YP2; Li:=L2;
end;
end;
if P3=1 and P4=0 then begin
XP:=XP1; YP:=YP1; Li:=L1;
end;
if P3=0 and P4=1 then begin
XP:=XP2; YP:=YP2; Li:=L2;
end;
if Li > 0 and Li <= Lmin then begin
if Pd=0 then
(XTn,YTn) LDk:
Tch_NiK(XCo,YCo,Xo1,Yo1,Xo2,Yo2,XP,YP,XTn,YTn,LDk);
:
DlinaL(XP,YP,Xm2,Ym2,L);
if L>0 then begin
Tk(XTk,YTk) (XP,YP.Xm2,Ym2):
OtrDug(XP,YP,Um,XP,YP,Ri,XP1,YP1,XP2,YP2,P);
PikOtr(XP1,YP1,XP,YP,Xm2,Ym2,P);
if P=1 then begin
XTk:=XP1; YTk:=YP1;
end
else begin
XTk:=XP2; YTk:=YP2;
end;
Tn Tk:
DlinaD(XP,YP,XTn,YTn,XTk,YTk,Hod,LD);
if LD<LDk then begin
, :
Et:=1; Xt1:=XP; Yt1:=YP; Xt2:=Xm2; Yt2:=Ym2;
, LDk Lmin:
Pd:=Pd+1; LDk:=LD; if Li<Lmin then Lmin:=Li;
end;
end;
:
DlinaL(XP,YP,Xm1,Ym1,L);
if L>0 then begin
Um, .. :
TekUgol(XP,YP,Xm1,Ym1,Um);
OtrDug(XP,YP,Um,XP,YP,Ri,XP1,YP1,XP2,YP2,P);
PikOtr(XP1,YP1,XP,YP,Xm1,Ym1,P);
if P=1 then begin
XTk:=XP1; YTk:=YP1;
end
else begin
XTk:=XP2; YTk:=YP2;
end;
DlinaD(XP,YP,XTn,YTn,XTk,YTk,Hod,LD);
if LD<LDk then begin
, :
Et:=1; Xt1:=XP; Yt1:=YP; Xt2:=Xm2; Yt2:=Ym2;
, LDk Lmin:
Pd:=Pd+1; LDk:=LD; if Li<Lmin then Lmin:=Li;
end;
end;
if Li<Lmin then
{ }
Xo2:=XP; Yo2:=YP;
end;
end;
end;
Procedure D_D;
- o (o1,o2) - m (m1,m2).
Li < Lmin, m 2 m1 Pm2 (. 115). , .
. 115
begin
Lmin ,
( ):
if Pd=0 then DlinaD(XCo,YCo,Xo1,Yo1,Xo2,Yo2,Nao,Lmin);
{Pd - P . , d =0}
DlinaL(Xm,YCm,Xm1,Ym1,Rm); { }
DlinaL(Xo,YCo,Xo1,Yo1,R); { }
:
DugDug(XCm,YCm,Rm,XCo,YCo,R,XP1,YP1,XP2,YP2,P);
1 :
if P=1 then
PikDug(XP1,YP1,XCm,YCm,Xm1,Ym1,Xm2,Ym2,Nam,P1);
1 :
if P1=1 then
PikDug(XP1,YP1,XCo,YCo,Xo1,Yo1,Xo2,Yo2,Nao,P2);
if P1=1 and P2=1 then P3=1 else P3=0;
2 :
if P=1 then
PikOtr(XP2,YP2,XCm,YCm,Xm1,Ym1,Xm2,Ym2,P1);
2 :
if P1=1 then
PikDug(XP2,YP2,XCo,YCo,Xo1,Yo1,Xo2,Yo2,Nao,P2);
if P1=1 and P2=1 then P4=1 else P4=0;
3=1 4=1, , :
if P3=1 and P4=1 then begin
DlinaD(XCo,YCo,Xo1,Yo1,XP1,YP1,Nao,L1);
DlinaD(XCo,YCo,Xo1,Yo1,XP2,YP2,Nao,L2);
if L1<L2 then begin
XP:=XP1; YP:=YP1; Li:=L1;
end
else begin
XP:=XP2; YP:=YP2; Li:=L2;
end;
end;
if P3=1 and P4=0 then begin
XP:=XP1; YP:=YP1; Li:=L1;
end;
if P3=0 and P4=1 then begin
XP:=XP2; YP:=YP2; Li:=L2;
end;
if Li > 0 and Li <= Lmin then begin
if Pd=0 then
(XTn,YTn) LDk:
Tch_NiK(XCo,YCo,Xo1,Yo1,Xo2,Yo2,XP,YP,XTn,YTn,LDk);
:
DlinaD(XCm,YCm,XP,YP,Xm2,Ym2,Nam,LD);
if LD>0 then begin
(XTk,YTk) :
DugDug(XCm,YCm,R,XP,YP,Ri,XP1,YP1,XP2,YP2,P);
PikDug(XP1,YP1,XCm,YCm,XP,YP,Xm2,Ym2,Nam,P);
if P=1 then begin
XTk:=XP1; YTk:=YP1;
end
else begin
XTk:=XP2; YTk:=YP2;
end;
:
DlinaD(XP,YP,XTn,YTn,XTk,YTk,Hod,LD);
if LD<LDk then begin
, :
Et:=2; Xt1:=XP; Yt1:=YP;
Xt2:=Xm2; Yt2:=Ym2;
XCt:=XCm; YCt:=YCm;
, LDk Lmin:
Pd:=Pd+1; LDk:=LD;
if Li<Lmin then begin
Lmin:=Li;
:
Xo2:=XP; Yo2:=YP;
end;
end;
end;
:
if Nam=1 then Nam:=2 else Nam:=1;
DlinaD(XCm,YCm,XP,YP,Xm1,Ym1,Nam,LD);
if LD>0 then begin
DugDug(XCm,YCm,R,XP,YP,Ri,XP1,YP1,XP2,YP2,P);
PikDug(XP1,YP1,XCm,YCm,XP,YP,Xm1,Ym1,Nam,P);
if P=1 then begin
XTk:=XP1; YTk:=YP1;
end
else begin
XTk:=XP2; YTk:=YP2;
end;
DlinaD(XP,YP,XTn,YTn,XTk,YTk,Hod,LD);
if LD<LDk then begin
Et:=2; Xt1:=XP; Yt1:=YP; Xt2:=Xm1; Yt2:=Ym1;
XCt:=XCm; YCt:=YCm;
, LDk Lmin:
Pd:=Pd+1; LDk:=LD;
if Li<Lmin then begin
Lmin:=Li;
:
Xo2:=XP; Yo2:=YP;
end;
end;
end;
end;
end;
3. (. 116).
:
- , , -
;
- (X,Y,Z), ;
- a b;
- S(X,Y,Z).
.
.
:
.
. 116
Procedure El_Pw(El,Pw:tekst; var X[N],Y[N],Z[N]:float; P:byte);
begin
S AB:
PikOtr(XS2, ZS2, XA2, ZA2, XB2, ZB2, P1);
PikOtr(XS1, YS1, XA1, YA1, XB1, YB1, P2);
if P1=1 and P2=1 then begin
P:=1; { }
K = S -
XK:= XS; YK:= YS; ZK:= S;
, .
else begin
S(S, AB) D(r),
r - .
2- (N(X,Y,Z) M(X,Y,Z)), 2- S(S, AB) D(r). , D(r) j <> 0.
S .
TekUgol(XA2,ZA2,XB2,ZB2,UAB2);
TekUgol(XA1,ZA1,XB1,YB1,UAB1);
TekUgol(XO2,ZO2,XT2,ZT2,UOT2);
DwaOtr(XA2,ZA2,UAB2,XS2,ZS2,130,XF2,ZF2,P5);
DwaOtr(XA1,YA1,UAB1,XF2,ZF2, 90,XF1,YF1,P5);
{ SF - S(S, AB) }
TekUgol(XS1,YS1,XF1,YF1,USF1);
DwaOtr(XS2,ZS2,130, XO2,ZO2,UOT2 ,XN2,ZN2,P5);
DwaOtr(XS1,YS1, USF1, XN2,ZN2,90,XN1,YN1,P5);
{N(N1,N2) - SF
}
DwaOtr(XA2,ZA2,UAB2, XO2,ZO2,UOT2 ,XM2,ZM2,P3);
if P3=1 then begin
DwaOtr(XA1,YA1,UAB1,XM2,ZM2,90,XM1,YM1,P5);
{(M1,M2) - AB
}
PikOtr(XM2, ZM2, XR2, ZR2,XT2, ZT2, P4);
if P4=1 then
OtrDug(XA1,YA1,UAB1,XO1,YO1,R,XH1,YH1,XL2,YL2,P4);
if P4=1 then PikOtr(XM1, YM1, XH1, YH1,XL1, YL1, P4);
{ P4=1,
. :
Tch_Obl(X,Y,X1,Y1,X2,Y2,P)}
end
else begin
{ AB }
DwaOtr(XA2,ZA2,UAB2,XS2,ZS2,60,XG2,ZG2,P5);
DwaOtr(XA1,YA1,UAB1,XG2,ZG2, 90,XG1,YG1,P5);
{ SG - S(S, AB) }
TekUgol(XS1,YS1,XG1,YG1,USG1);
DwaOtr(XS2,ZS2,60, XO2,ZO2,UOT2 ,XM2,ZM2,P5);
DwaOtr(XS1,YS1, USG1, XM2,ZM2,90,XM1,YM1,P5);
{(M1,M2) - SG
}
end;
if P1=1 and P2=1 and P4=1 then begin
P:=1; { }
XK:=XM2; YK:=YM1; ZK:=ZM2;
{
=}
end
else begin
TekUgol(XM1,YM1,XN1,YN1,UMN1);
OtrDug(XM1,YM1,UMN1,XS1,YS1,R,XC1,YC1,XE2,YE2,P5);
if P5=0 then P:=0 { }
else begin
TekUgol(XS1,YS1,XC1,YC1,USC1);
DwaOtr(XS1,YS1, USC1, XA1,YA1,UAB1 ,XK1,YK1,P5);
DwaOtr(XA2,ZA2,UAB2, XK1,YK1,90,XK2,ZK2,P5);
if (XC1-XE1<0.05 and (YC2-YE2)<0.05 then begin
P:=1; { K(XK1,YK1,ZK2}
end
else begin
TekUgol(XS1,YS1,XE1,YE1,USE1);
DwaOtr(XS1,YS1, USE1, XA1,YA1,UAB1 ,XD1,YD1,P5);
DwaOtr(XA2,ZA2,UAB2, XK1,YK1,90,XD2,ZD2,P5);
P:=1; {
K(XK1,YK1,ZK2); D(XD1,YD1,ZD2}
end;
end;
end;
end;
.23. ( ), , , , .
.