.


:




:

































 

 

 

 





, , X1,Y1 X2,Y2.

 

Procedure Tch_Obl(X,Y,X1,Y1,X2,Y2,P);

begin

if X>=X1 and X<=X2 and Y>=Y1 and Y<=Y2 then P=1

else P=0;

{=1 - }

end;

1. , (. 128).

NK . S1, S2, S3, S4, S5 LD, LD - N S. , .

 

. 128

 

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);

 

LD:

if LD>0 then

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);

 

LD:

if LD>0 then

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;

Until E=Nkm;

, , (Procedure Filtr):

if Ps>0 then Filtr;

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;

 

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;

 

 





:


: 2016-11-18; !; : 776 |


:

:

, .
==> ...

1785 - | 1597 -


© 2015-2024 lektsii.org - -

: 0.299 .