<?xml version="1.0" encoding="windows-1251"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title>Построение эквидистантного контура к замкнутому невыпоклуму многограннику</title>
<description>Здравствуйте!
Возникла задача построения эквидистантного кунтура к невыпоклуму многограннику.

Исходные данные:
набор координат вершин многогранника в последовательном порядке обхода контура (по часовой или против).

Необходимо определить наборы точек эквидистантных контуров как внешних так и внутренних (величина смещения для эквидистант = а).

Готового решения я не жду. Помогите хотябы с пониманием такого алгоритма (в частности, как определять характер нормалей к сторонам многогранника - внешняя или внутренняя?)

Буду благодарен за любую помощь</description><link>http://www.mathforum.ru/forum/read/1/18960/18960/#18960</link><lastBuildDate>Tue, 08 Sep 2026 12:19:57 +0300</lastBuildDate>
<generator>Phorum 5.2.10</generator>
<item>
<guid>http://www.mathforum.ru/forum/read/1/18960/107325/#107325</guid>
<title>эквидистантный контур расчёт полный случай</title><link>http://www.mathforum.ru/forum/read/1/18960/107325/#107325</link><description><![CDATA[<blockquote class="bbcode"><div><small>Цитата<br/></small><strong>schukin</strong><br/>
<blockquote class="bbcode"><div><small>Цитата<br/></small><strong></strong><br/>Выскажу гипотезу: речь идет о плоском многоугольнике.</div></blockquote><br />Да, действительно, прошу прощения за неточность<br />Вершины предствляют собой точки на плоскости А1(x1;y1), А2(x2;y2), ... , АN(xN;yN).<br />При этом еще раз подчеркну что, набор координат вершин многогранника задан в последовательном порядке обхода контура (по часовой или против).<br /><br />PS<br />я пытаюсь реализовать такой алгоритм в Object Pascal</div></blockquote><br />https://voloshinov.ru/simplex/functions/W3/index.htm<br /><br /><br /><br /><br /><br /><br />Алгоритм построения эквидистантного контура:<br /><br /><br />function EExecW3(X,Y: TObj; var OOO: TObj; Att: TAtt; Sg1,Sg2: integer; OW: pointer): boolean;<br />var X1,X2,X3,X4,X5,Y1,Y2,Y3,Y4,Y5: complex;<br />Value,Dx,RR,AX,AY,BX,BY,Rx,Ry: real;<br />XD1,Yd1,Xd2,Yd2: real;<br />XP,YP: complex;<br />Iz: boolean;<br />I,J,N,N1,N2: integer;<br />Cst,E,E1,E2,OB,OB1,OB2,OB3,OB4,Pnt1,Pnt2,Pnt3,Pnt4,Pnt5,Pnt6,Pnt7,Pnt8,Pnt,Distance: TObj;<br />Criterium: boolean;<br />A,B,C,D: complex;<br />AA,BB,CC,DD,Xc,Yc,R: real;<br />Otr1,Otr2,Dug1,Dug2: TObj;<br />Xt,Yt: complex;<br />Prizn,Found: boolean;<br />Xb,Yb,Xe,Ye: real;<br />NN: integer;<br />XStart,YStart,XEnd,YEnd: real;<br />BlockIJ: boolean;<br />label l_dd,l_od,l_do,fin,lab100,lab101,lab200,lab400;<br /><br />procedure LineLine(Sg: integer);<br />begin<br />if (E1 is TOLine) and (E2 is TOLine) then<br />begin<br />EExecDC0(E1,E2,Y,OB,Pnt1,Pnt2,Att0,Att5,Att5,-1,1,Sg,NIL,NIL,NIL);<br />Pnt1.Destroy;<br />Pnt2.Destroy;<br />NeedCorrect:=FALSE;<br />if OB is TOEmpty then begin OB.Destroy; NeedCorrect:=TRUE end else<br />begin<br />XD1:=TODuga(OB).X1; YD1:=TODuga(OB).Y1;XD2:=TODuga(OB).X2; YD2:=TODuga(OB).Y2;<br />AX:=TOLine(E1).X2.Re;AY:=TOLine(E1).Y2.Re;<br />BX:=TOLine(E2).X1.Re;BY:=TOLine(E2).Y1.Re;<br />OB.Tag:=1;<br />Criterium:=(Abs(XD1-AX)&lt;Eps) and (Abs(YD1-AY)&lt;Eps) and (Abs(XD2-BX)&lt;Eps) and (Abs(YD2-BY)&lt;Eps);<br />if Criterium then<br />with TOKontur(OOO).Spis do Add(OB) else<br />begin<br />{ликвидация дуги}<br />NeedCorrect:=TRUE;<br />OB.Destroy;<br />end;<br />end;<br />if NeedCorrect then<br />begin<br />{коррекция концов отрезков}<br />EExecP2(E1,E2,Pnt,Att5,1,1,NIL);<br />if Pnt is TOPoint then<br />begin<br />XP:=TOPoint(Pnt).X; YP:=TOPoint(Pnt).Y;<br />TOLine(E1).X2:=XP; TOLine(E1).Y2:=YP;<br />TOLine(E2).X1:=XP; TOLine(E2).Y1:=YP;<br />end;<br />Pnt.Destroy;<br />end;<br />end;<br />end; // LineLine<br /><br />function PointInCircle(Lin: TOLine; Dug: TODuga): integer;<br />var CX,CY,XC,YC,R: real;<br />begin<br />CX:=(Lin.X1.Re+Lin.X2.Re)/2;<br />CY:=(Lin.Y1.Re+Lin.Y2.Re)/2;<br />XC:=Dug.XC.Re;<br />YC:=Dug.YC.Re;<br />R:=Abs(Dug.R.Re);<br />if Dist(Xc,Yc,Cx,Cy)&lt;R then Result:=-1 else Result:=1;<br />end; // PointInCircle<br /><br />procedure DugLine(Sgg: integer);<br />var<br />P1,P2,Cst1,Cst0,N1,N2,F: TObj;<br />Q1,Q2,Q3: integer;<br />Fi,Dl: real;<br />SG: integer;<br />Prizn: boolean;<br />begin<br />if (E1 is TODuga) and (E2 is TOLine) then<br />begin<br />Q1:=-1{PointInCircle(TOLine(E2),TODuga(E1))}{*Sign(TODuga(E1).R)};<br />Q2:=Q1;<br />Q3:={Sign(TODuga(E1).R)*Sign(TOChisl(Y).C.Re)}1;<br />{E1.FAtt.LV:=0;E2.FAtt.LV:=0;}<br />EExecDA(E1,E2,Y,OB1,Pnt1,Pnt2,OB2,Pnt3,Pnt4,Att0,Att5,Att5,Att0,Att5,Att5,Q1,Q2,Q3,NIL,NIL,NIL,NIL,NIL,NIL);<br />Pnt1.Destroy; Pnt2.Destroy; Pnt3.Destroy; Pnt4.Destroy;<br />if OB1 is TOEmpty then OB1.Destroy else<br />begin<br />Prizn:=TRUE;<br />TODuga(OB1).R.Re:=-TODuga(OB1).R.Re; OB1.Tag:=1;<br />if Prizn {критерий включения дуги в состав контура} then<br />with TOKontur(OOO).Spis do Add(OB1) else {ликвидация дуги} OB1.Destroy;<br />end;<br />if OB2 is TOEmpty then OB2.Destroy else<br />begin<br />Prizn:=TRUE;<br />Ob2.Tag:=1;<br />if Prizn {критерий включения дуги в состав контура} then<br />with TOKontur(OOO).Spis do Add(OB2) else {ликвидация дуги} OB2.Destroy;;<br />end;<br />end;<br />end; // DugLine<br /><br />procedure LineDug(Sgg: integer);<br />var<br />P1,P2,Cst1,Cst0,N1,N2,F: TObj;<br />Fi,Dl: real;<br />Q1,Q2,Q3: integer;<br />Sg: integer;<br />Prizn: boolean;<br />begin<br /><br />if (E1 is TOLine) and (E2 is TODuga) then<br />begin<br />Q1:=-1{PointInCircle(TOLine(E1),TODuga(E2))}{*Sign(TODuga(E2).R)};<br />Q2:=Q1;<br />Q3:={Sign(TODuga(E2).R)*Sign(TOChisl(Y).C.Re)}1;<br />EExecDA(E2,E1,Y,OB1,Pnt1,Pnt2,OB2,Pnt3,Pnt4,Att0,Att5,Att5,Att0,Att5,Att5,Q2,Q1,Q3,NIL,NIL,NIL,NIL,NIL,NIL);<br />Pnt1.Destroy; Pnt2.Destroy; Pnt3.Destroy; Pnt4.Destroy;<br />if OB1 is TOEmpty then OB1.Destroy else<br />begin<br />Prizn:=TRUE;<br />OB1.Tag:=1;<br />if Prizn {критерий включения дуги в состав контура} then<br />with TOKontur(OOO).Spis do Add(OB1) else {ликвидация дуги} OB1.Destroy;<br />end;<br />if OB2 is TOEmpty then OB2.Destroy else<br />begin<br />Prizn:=TRUE;<br />TODuga(OB2).R.Re:=-TODuga(OB2).R.Re; OB2.Tag:=1;<br />if Prizn {критерий включения дуги в состав контура} then<br />with TOKontur(OOO).Spis do Add(OB2) else {ликвидация дуги} OB2.Destroy;;<br />end;<br />end;<br />end; // LineDug<br /><br />procedure DugDug;<br />var Sga,Sgb,Sgc,SV1,SV2,Q1,Q2,Q3: integer;<br />P1,P2,Cst1,Cst0,Cst100,N1,N2,F,Vekt1,Vekt2,Txt: TObj;<br />Temp1Att,Temp2Att,Sg1,Sg2,Sg3: integer;<br />begin<br />if (E1 is TODuga) and (E2 is TODuga) then<br />begin<br />Temp1Att:=E1.FAtt.Lv;<br />Temp2Att:=E2.FAtt.Lv;<br />E1.FAtt.Lv:=0;<br />E2.FAtt.Lv:=0;{}<br />SV1:=TODuga(E1).Vid; SV2:=TODuga(E2).Vid;<br />Q1:=-1;<br />Q2:=-1;<br />Q3:=1;<br /><br />EExecD7(E1,E2,Y,OB1,Pnt1,Pnt2,OB2,Pnt3,Pnt4,nAtt,nAtt,nAtt,NAtt,nAtt,nAtt,Q1,Q2,Q3,NIL,NIL,NIL,NIL,NIL,NIL);<br />TODuga(E1).Vid:=SV1; TODuga(E2).Vid:=SV2;<br /><br />if OB1 is TOEmpty then OB1.Destroy else<br />begin<br />if True {критерий включения дуги в состав контура} then<br />with TOKontur(OOO).Spis do<br />begin<br />if not TODuga(OB1).Zamkn then<br />Add(OB1); OB1.Tag:=1;<br />end else {ликвидация дуги} OB1.Destroy;<br />end;<br />if OB2 is TOEmpty then OB2.Destroy else<br />begin<br />if True {критерий включения дуги в состав контура} then<br />with TOKontur(OOO).Spis do<br />begin<br />if not TODuga(OB2).Zamkn then<br />Add(OB2); TODuga(OB2).R.Re:=-TODuga(OB2).R.Re; OB2.Tag:=1{} {OB2.Destroy}<br />end else {ликвидация дуги} OB2.Destroy;<br />end;<br /><br />E1.FAtt.Lv:=Temp1Att;<br />E2.FAtt.Lv:=Temp2Att;<br /><br />end;<br /><br />end; // DugDug<br /><br />var BBB,RRR: boolean;<br />begin<br />BBB:=SysVar.AllowComplex;<br />SysVar.AllowComplex:=FALSE;<br /><br />if (X is TOKontur) and (Y is TOChisl) then<br />begin<br />if TOKontur(X).Zamkn then<br />BEGIN<br />OOO:=TOKontur.Create(Att,OW);<br />N:=TOKontur(X).Spis.Count - 1;<br />for I := 0 to TOKontur(X).Spis.Count - 1 do<br />begin<br />E:=TOKontur(X).Spis<i>;<br />if E.Obj='O' then<br />begin<br />EExecO7(E,Y,OB,Att0,1,SG2,NIL);<br />with TOKontur(OOO).Spis do Add(OB);<br />OB.Tag:=0;<br />end;<br />if E.Obj='D' then<br />begin<br />EExecO7(E,Y,OB,Att0,1,SG2,NIL);<br />with TOKontur(OOO).Spis do Add(OB);<br />OB.Tag:=0;<br />TODuga(OB).Vid:=TODuga(E).Vid;<br />if TODuga(OB).Vid=2 then TODuga(OB).Vid:=0;<br />end;<br />end;<br /><br />{goto fin;}<br /><br /><br />I:=0;<br />lab101:;<br />NN:=I;<br />RRR:=TOKontur(X).Start(XStart,YStart,I);<br />if not RRR then goto fin;<br /><br />Found:=FALSE;<br />while I&lt;N do<br />begin<br />E1:=TOKontur(OOO).Spis<i>;<br />E2:=TOKontur(OOO).Spis[I+1];<br />TOKontur(X).Finish(XEnd,YEnd,I);<br />if Dist(XStart,YStart,XEnd,YEnd)&lt;Eps then<br />begin<br />Found:=TRUE;<br />if Found then goto lab100;<br />end;<br /><br /><br />LineLine(1);<br />DugLine(1);<br />LineDug(1);<br />DugDug;<br /><br />Inc(I);<br />end;<br /><br />// в случае многосвязных контуров замыкание нужно проверять не по первому элементу<br />lab100:;<br />{if N&gt;1 then} {при нуле, как было раньше сопряжения дублируются из-за замыкания}<br />begin<br />E1:=TOKontur(OOO).Spis<i>;<br />E2:=TOKontur(OOO).Spis[NN];<br /><br />LineLine(1);<br />DugLine(1);<br />LineDug(1);<br />DugDug;<br />Inc(I);<br />end;<br />if I&lt;N then goto lab101;<br /><br /><br />END;<br /><br />if not TOKontur(X).Zamkn then<br />BEGIN<br />OOO:=TOKontur.Create(Att,OW);<br />N:=TOKontur(X).Spis.Count - 1;<br />for I := 0 to TOKontur(X).Spis.Count - 1 do<br />begin<br />E:=TOKontur(X).Spis<i>;<br />if E.Obj='O' then<br />begin<br />EExecO7(E,Y,OB,Att0,1,SG2,NIL);<br />with TOKontur(OOO).Spis do Add(OB);<br />end;<br />if E.Obj='D' then<br />begin<br />EExecO7(E,Y,OB,Att0,1,SG2,NIL);<br />with TOKontur(OOO).Spis do Add(OB);<br />end;<br />end;<br /><br /><br />for I := 0 to TOKontur(X).Spis.Count - 1 do<br />begin<br />E:=TOKontur(X).Spis<i>;<br />if E.Obj='O' then<br />begin<br />EExecO7(E,Y,OB,Att0,1,-1*SG2,NIL);<br />with TOKontur(OOO).Spis do Add(OB);<br />end;<br />if E.Obj='D' then<br />begin<br />EExecO7(E,Y,OB,Att0,1,-1*SG2,NIL);<br />with TOKontur(OOO).Spis do Add(OB);<br />end;<br />end;<br /><br /><br /><br />N:=TOKontur(X).Spis.Count - 1;<br />N1:=TOKontur(OOO).Spis.Count - 1;<br />I:=0;<br />while I&lt;N do<br />begin<br />E1:=TOKontur(OOO).Spis<i>;<br />E2:=TOKontur(OOO).Spis[I+1];<br /><br />LineLine(1);<br />DugLine(1);<br />LineDug(1);<br />DugDug;<br /><br />Inc(I);<br />end;<br />I:=N+1;<br />while I&lt;N1 do<br />begin<br />E1:=TOKontur(OOO).Spis<i>;<br />E2:=TOKontur(OOO).Spis[I+1];<br /><br />LineLine(-1);<br />DugLine(-1);<br />LineDug(-1);<br />DugDug;<br />Inc(I);<br />end;<br /><br />if TOKontur(X).Spis.Count&gt;0 then<br />begin<br />R:=TOChisl(Y).C.Re;<br />if TObj(TOKontur(X).Spis[0]) is TOLine then<br />begin<br />Xc:=TOLine(TOKontur(X).Spis[0]).X1.Re;<br />Yc:=TOLine(TOKontur(X).Spis[0]).Y1.Re;<br />Xb:=TOLine(TOKontur(OOO).Spis[N+1]).X1.Re;<br />Yb:=TOLine(TOKontur(OOO).Spis[N+1]).Y1.Re;<br />Xe:=TOLine(TOKontur(OOO).Spis[0]).X1.Re;<br />Ye:=TOLine(TOKontur(OOO).Spis[0]).Y1.Re;<br />end;<br />if TObj(TOKontur(X).Spis[0]) is TODuga then<br />begin<br />Xc:=TODuga(TOKontur(X).Spis[0]).X1;<br />Yc:=TODuga(TOKontur(X).Spis[0]).Y1;<br />Xb:=TODuga(TOKontur(OOO).Spis[N+1]).X1;<br />Yb:=TODuga(TOKontur(OOO).Spis[N+1]).Y1;<br />Xe:=TODuga(TOKontur(OOO).Spis[0]).X1;<br />Ye:=TODuga(TOKontur(OOO).Spis[0]).Y1;<br />end;<br /><br />OB:=TODuga.Create(MCompl(Xc,0),MCompl(Yc,0),MCompl(R,0),Xb,Yb,Xe,Ye,0,circ_arc,NAtt,Nil);;<br />TOKontur(OOO).Spis.Add(OB);<br /><br />if TObj(TOKontur(X).Spis[N]) is TOLine then<br />begin<br />Xc:=TOLine(TOKontur(X).Spis[N]).X2.Re;<br />Yc:=TOLine(TOKontur(X).Spis[N]).Y2.Re;<br />Xb:=TOLine(TOKontur(OOO).Spis[N]).X2.Re;<br />Yb:=TOLine(TOKontur(OOO).Spis[N]).Y2.Re;<br />Xe:=TOLine(TOKontur(OOO).Spis[N1]).X2.Re;<br />Ye:=TOLine(TOKontur(OOO).Spis[N1]).Y2.Re;<br />end;<br />if TObj(TOKontur(X).Spis[N]) is TODuga then<br />begin<br />Xc:=TODuga(TOKontur(X).Spis[N]).X2;<br />Yc:=TODuga(TOKontur(X).Spis[N]).Y2;<br />Xe:=TODuga(TOKontur(OOO).Spis[N1]).X2;<br />Ye:=TODuga(TOKontur(OOO).Spis[N1]).Y2;<br />Xb:=TODuga(TOKontur(OOO).Spis[N]).X2;<br />Yb:=TODuga(TOKontur(OOO).Spis[N]).Y2;<br />end;<br /><br />OB:=TODuga.Create(MCompl(Xc,0),MCompl(Yc,0),MCompl(R,0),Xb,Yb,Xe,Ye,0,circ_arc,NAtt,Nil);;<br />TOKontur(OOO).Spis.Add(OB);<br />end;<br /><br />(*<br />if N&gt;1 then {при нуле, как было раньше сопряжения дублируются из-за замыкания}<br />begin<br />E1:=TOKontur(OOO).Spis[N];<br />E2:=TOKontur(OOO).Spis[0];<br /><br />LineLine(-1);<br />DugLine;<br />LineDug;<br />DugDug;<br />end;<br />*)<br /><br />END;<br />{привести контур к последовательному виду}<br /><br />{TOKontur(OOO).Ordnung(FALSE);}//!!<br /><br />{нужен тест на повторяющиеся элементы}<br />{goto fin;}<br />I:=0; BlockIJ:=FALSE;<br />while I&lt;= TOKontur(OOO).Spis.Count - 2 do<br />begin<br />J:=I+1;<br />while J&lt;= TOKontur(OOO).Spis.Count - 1 do<br /><br />begin<br /><br />E1:=TOKontur(OOO).Spis<i>;<br />E2:=TOKontur(OOO).Spis[J];<br /><br />{Пересечение двух линейных элементов}<br />if (E1 is TOLine) and (E2 is TOLine) then<br />begin<br />EExecP2(E1,E2,Pnt1,Att5,1,1,NIL);<br />if not (Pnt1 is TOEmpty) then<br />begin<br />if not ((KrajOtr(Pnt1,E1)) or (KrajOtr(Pnt1,E2))) then<br />begin<br />A:=TOLine(E1).X1;<br />B:=TOLine(E1).Y1;<br />C:=TOPoint(Pnt1).X;<br />D:=TOPoint(Pnt1).Y;<br />Otr1:=TOLine.Create(A,B,1,C,D,1,brn_Limited,Sobstv,Att0,NIL,Ordinal);<br />TOKontur(OOO).Spis.Insert(I+1,Otr1,[zn_Plus]) ;<br />C:=TOLine(E1).X2;<br />D:=TOLine(E1).Y2;<br />A:=TOPoint(Pnt1).X;<br />B:=TOPoint(Pnt1).Y;<br />Otr1:=TOLine.Create(A,B,1,C,D,1,brn_Limited,Sobstv,Att0,NIL,Ordinal);<br />TOKontur(OOO).Spis.Insert(I+2,Otr1,[zn_Plus]) ;<br />E:=TOKontur(OOO).Spis<i>;E.Destroy;<br />TOKontur(OOO).Spis.Delete(I); Inc(J);<br /><br /><br />A:=TOLine(E2).X1;<br />B:=TOLine(E2).Y1;<br />C:=TOPoint(Pnt1).X;<br />D:=TOPoint(Pnt1).Y;<br />Otr1:=TOLine.Create(A,B,1,C,D,1,brn_Limited,Sobstv,Att0,NIL,Ordinal);<br />TOKontur(OOO).Spis.Insert(J+1,Otr1,[zn_Plus]) ;<br />C:=TOLine(E2).X2;<br />D:=TOLine(E2).Y2;<br />A:=TOPoint(Pnt1).X;<br />B:=TOPoint(Pnt1).Y;<br />Otr1:=TOLine.Create(A,B,1,C,D,1,brn_Limited,Sobstv,Att0,NIL,Ordinal);<br />TOKontur(OOO).Spis.Insert(J+2,Otr1,[zn_Plus]) ;<br /><br />E:=TOKontur(OOO).Spis[J];E.Destroy;<br />TOKontur(OOO).Spis.Delete(J);<br />end<br />end;<br />Pnt1.Destroy;<br />goto lab200;<br />end;<br /><br />{Пересечение прямой и дуги}<br />if (E1 is TOLine) and (E2 is TODuga) then<br />begin<br />E1:=TOKontur(OOO).Spis<i>;<br />E2:=TOKontur(OOO).Spis[J];<br />BlockIJ:=FALSE;<br />EExecP6(E1,E2,Pnt1,Pnt2,Att5,Att5,1,1,NIL,NIL);<br /><br />if not (Pnt1 is TOEmpty) then<br />begin<br />if not ((KrajOtr(Pnt1,E1)) or (KrajDug(Pnt1,E2))) then<br />begin<br />A:=TOLine(E1).X1;<br />B:=TOLine(E1).Y1;<br />C:=TOPoint(Pnt1).X;<br />D:=TOPoint(Pnt1).Y;<br />Xc:=TODuga(E2).XC.Re;<br />Yc:=TODuga(E2).YC.Re;<br />R:=TODuga(E2).R.Re;<br />AA:=TODuga(E2).X1;<br />BB:=TODuga(E2).Y1;<br />CC:=TODuga(E2).X2;<br />DD:=TODuga(E2).Y2;<br />Otr1:=TOLine.Create(A,B,1,C,D,1,brn_Limited,Sobstv,Att0,NIL,Ordinal);<br />TOKontur(OOO).Spis.Insert(I+1,Otr1,[zn_Plus]) ;<br />C:=TOLine(E1).X2;<br />D:=TOLine(E1).Y2;<br />A:=TOPoint(Pnt1).X;<br />B:=TOPoint(Pnt1).Y;<br />Otr1:=TOLine.Create(A,B,1,C,D,1,brn_Limited,Sobstv,Att0,NIL,Ordinal);<br />TOKontur(OOO).Spis.Insert(I+2,Otr1,[zn_Plus]) ;<br /><br />E:=TOKontur(OOO).Spis<i>;E.Destroy;<br />TOKontur(OOO).Spis.Delete(I); Inc(J);<br /><br />C:=TOPoint(Pnt1).X;<br />D:=TOPoint(Pnt1).Y;<br />Dug1:=TODuga.Create(MCompl(Xc,0),MCompl(Yc,0),MCompl(R,0),AA,BB,C.Re,D.Re,0,circ_arc,Att0,NIL);<br />TOKontur(OOO).Spis.Insert(J+1,Dug1,[zn_Plus]) ;<br />A:=TOPoint(Pnt1).X;<br />B:=TOPoint(Pnt1).Y;<br />Dug1:=TODuga.Create(MCompl(Xc,0),MCompl(Yc,0),MCompl(R,0),A.Re,B.Re,CC,DD,0,circ_arc,Att0,NIL);<br />TOKontur(OOO).Spis.Insert(J+2,Dug1,[zn_Plus]) ;<br /><br />E:=TOKontur(OOO).Spis[J];E.Destroy;<br />TOKontur(OOO).Spis.Delete(J);<br />BlockIJ:= (Pnt1 is TOPoint) and (Pnt2 is TOPoint);<br /><br />goto l_od;<br />end<br />end;<br /><br /><br />if not (Pnt2 is TOEmpty) then<br />begin<br />if not ((KrajOtr(Pnt2,E1)) or (KrajDug(Pnt2,E2))) then<br />begin<br />A:=TOLine(E1).X1;<br />B:=TOLine(E1).Y1;<br />C:=TOPoint(Pnt2).X;<br />D:=TOPoint(Pnt2).Y;<br />Otr1:=TOLine.Create(A,B,1,C,D,1,brn_Limited,Sobstv,Att0,NIL,Ordinal);<br />TOKontur(OOO).Spis.Insert(I+1,Otr1,[zn_Plus]) ;<br />C:=TOLine(E1).X2;<br />D:=TOLine(E1).Y2;<br />A:=TOPoint(Pnt2).X;<br />B:=TOPoint(Pnt2).Y;<br />Otr1:=TOLine.Create(A,B,1,C,D,1,brn_Limited,Sobstv,Att0,NIL,Ordinal);<br />TOKontur(OOO).Spis.Insert(I+2,Otr1,[zn_Plus]) ;<br />E:=TOKontur(OOO).Spis<i>;E.Destroy;<br />TOKontur(OOO).Spis.Delete(I); Inc(J);<br /><br />Xc:=TODuga(E2).XC.Re;<br />Yc:=TODuga(E2).YC.Re;<br />R:=TODuga(E2).R.Re;<br />AA:=TODuga(E2).X1;<br />BB:=TODuga(E2).Y1;<br />C:=TOPoint(Pnt2).X;<br />D:=TOPoint(Pnt2).Y;<br />Dug1:=TODuga.Create(MCompl(Xc,0),MCompl(Yc,0),MCompl(R,0),AA,BB,C.Re,D.Re,0,circ_arc,Att0,NIL);<br />TOKontur(OOO).Spis.Insert(J+1,Dug1,[zn_Plus]) ;<br />CC:=TODuga(E2).X2;<br />DD:=TODuga(E2).Y2;<br />A:=TOPoint(Pnt2).X;<br />B:=TOPoint(Pnt2).Y;<br />Dug1:=TODuga.Create(MCompl(Xc,0),MCompl(Yc,0),MCompl(R,0),A.Re,B.Re,CC,DD,0,circ_arc,Att0,NIL);<br />TOKontur(OOO).Spis.Insert(J+2,Dug1,[zn_Plus]) ;<br /><br />E:=TOKontur(OOO).Spis[J];E.Destroy;<br />TOKontur(OOO).Spis.Delete(J);<br />end<br />end;<br />l_od:<br />Pnt1.Destroy;<br />Pnt2.Destroy;<br />goto lab200;<br />end;<br /><br />{Пересечение дуги и прямой}<br />if (E1 is TODuga) and (E2 is TOLine) then {!!!}<br />begin<br />E1:=TOKontur(OOO).Spis<i>;<br />E2:=TOKontur(OOO).Spis[J];<br />BlockIJ:=FALSE;<br /><br />EExecP6(E2,E1,Pnt1,Pnt2,Att5,Att5,1,1,NIL,NIL);<br /><br />if not (Pnt1 is TOEmpty) then<br />begin<br />if not ((KrajDug(Pnt1,E1)) or (KrajOtr(Pnt1,E2))) then<br />begin<br />Xc:=TODuga(E1).XC.Re;<br />Yc:=TODuga(E1).YC.Re;<br />R:=TODuga(E1).R.Re;<br />AA:=TODuga(E1).X1;<br />BB:=TODuga(E1).Y1;<br />CC:=TODuga(E1).X2;<br />DD:=TODuga(E1).Y2;<br /><br />A:=TOPoint(Pnt1).X;<br />B:=TOPoint(Pnt1).Y;<br />Dug1:=TODuga.Create(MCompl(Xc,0),MCompl(Yc,0),MCompl(R,0),AA,BB,A.Re,B.Re,0,circ_arc,Att0,NIL);<br />TOKontur(OOO).Spis.Insert(I+1,Dug1,[zn_Plus]) ;<br />Dug1.Tag:=E1.Tag;<br />Dug1:=TODuga.Create(MCompl(Xc,0),MCompl(Yc,0),MCompl(R,0),A.Re,B.Re,CC,DD,0,circ_arc,Att0,NIL);<br />TOKontur(OOO).Spis.Insert(I+2,Dug1,[zn_Plus]) ;<br />Dug1.Tag:=E1.Tag;<br />E:=TOKontur(OOO).Spis<i>;E.Destroy;<br />TOKontur(OOO).Spis.Delete(I); Inc(J);<br /><br />A:=TOLine(E2).X1;<br />B:=TOLine(E2).Y1;<br />C:=TOPoint(Pnt1).X;<br />D:=TOPoint(Pnt1).Y;<br />Otr1:=TOLine.Create(A,B,1,C,D,1,brn_Limited,Sobstv,Att0,NIL,Ordinal);<br />TOKontur(OOO).Spis.Insert(J+1,Otr1,[zn_Plus]);<br />A:=TOLine(E2).X2;<br />B:=TOLine(E2).Y2;<br />Otr1:=TOLine.Create(C,D,1,A,B,1,brn_Limited,Sobstv,Att0,NIL,Ordinal);<br />TOKontur(OOO).Spis.Insert(J+2,Otr1,[zn_Plus]);<br />E:=TOKontur(OOO).Spis[J];E.Destroy;<br />TOKontur(OOO).Spis.Delete(J);<br />BlockIJ:= (Pnt1 is TOPoint) and (Pnt2 is TOPoint);<br /><br /><br />goto l_do;<br />end<br />end;<br /><br /><br />if not (Pnt2 is TOEmpty) then<br />begin<br />if not ((KrajDug(Pnt2,E1)) or (KrajOtr(Pnt2,E2))) then<br />begin<br />Xc:=TODuga(E1).XC.Re;<br />Yc:=TODuga(E1).YC.Re;<br />R:=TODuga(E1).R.Re;<br />AA:=TODuga(E1).X1;<br />BB:=TODuga(E1).Y1;<br />CC:=TODuga(E1).X2;<br />DD:=TODuga(E1).Y2;<br /><br />A:=TOPoint(Pnt2).X;<br />B:=TOPoint(Pnt2).Y;<br />Dug1:=TODuga.Create(MCompl(Xc,0),MCompl(Yc,0),MCompl(R,0),AA,BB,A.Re,B.Re,0,circ_arc,Att0,NIL);<br />TOKontur(OOO).Spis.Insert(I+1,Dug1,[zn_Plus]) ;<br />Dug1.Tag:=E1.Tag;<br />Dug1:=TODuga.Create(MCompl(Xc,0),MCompl(Yc,0),MCompl(R,0),A.Re,B.Re,CC,DD,0,circ_arc,Att0,NIL);<br />TOKontur(OOO).Spis.Insert(I+2,Dug1,[zn_Plus]) ;<br />Dug1.Tag:=E1.Tag;<br />E:=TOKontur(OOO).Spis<i>;E.Destroy;<br />TOKontur(OOO).Spis.Delete(I); Inc(J);<br /><br />A:=TOLine(E2).X1;<br />B:=TOLine(E2).Y1;<br />C:=TOPoint(Pnt2).X;<br />D:=TOPoint(Pnt2).Y;<br />Otr1:=TOLine.Create(A,B,1,C,D,1,brn_Limited,Sobstv,Att0,NIL,Ordinal);<br />TOKontur(OOO).Spis.Insert(J+1,Otr1,[zn_Plus]);<br />A:=TOLine(E2).X2;<br />B:=TOLine(E2).Y2;<br />Otr1:=TOLine.Create(C,D,1,A,B,1,brn_Limited,Sobstv,Att0,NIL,Ordinal);<br />TOKontur(OOO).Spis.Insert(J+2,Otr1,[zn_Plus]);<br />E:=TOKontur(OOO).Spis[J];E.Destroy;<br />TOKontur(OOO).Spis.Delete(J);<br />end<br />end;<br />l_do:<br />Pnt1.Destroy;<br />Pnt2.Destroy;<br />goto lab200;<br />end;<br /><br />{Пересечение двух дуг} {(TODuga(E1).Xc=-220.5) and (TODuga(E2).Xc=-139.5) and (Abs(TODuga(E1).X1+342)&lt;1)}<br />if (E1 is TODuga) and (E2 is TODuga) then<br />begin<br /><br />E1:=TOKontur(OOO).Spis<i>;<br />E2:=TOKontur(OOO).Spis[J];<br />if TODuga(E1).Vid=5 then TODuga(E1).Vid:=1;<br />if TODuga(E2).Vid=5 then TODuga(E2).Vid:=1;<br />EExecP3(E1,E2,Pnt1,Pnt2,Att5,Att5,1,1,NIL,NIL);<br />BlockIJ:=FALSE;<br /><br /><br />if not (Pnt1 is TOEmpty) then<br />if Assigned(Pnt1) then<br />begin<br />if not ((KrajDug(Pnt1,E1)) or (KrajDug(Pnt1,E2))) then<br />begin<br />Xc:=TODuga(E1).XC.Re;<br />Yc:=TODuga(E1).YC.Re;<br />R:=TODuga(E1).R.Re;<br />AA:=TODuga(E1).X1;<br />BB:=TODuga(E1).Y1;<br />C:=TOPoint(Pnt1).X;<br />D:=TOPoint(Pnt1).Y;<br />Dug1:=TODuga.Create(MCompl(Xc,0),MCompl(Yc,0),MCompl(R,0),AA,BB,C.Re,D.Re,0,circ_arc,Att0,NIL);<br />TOKontur(OOO).Spis.Insert(I+1,Dug1,[zn_Plus]) ;<br /><br /><br />Dug1.Tag:=E1.Tag;<br />CC:=TODuga(E1).X2;<br />DD:=TODuga(E1).Y2;<br />A:=TOPoint(Pnt1).X;<br />B:=TOPoint(Pnt1).Y;<br />Dug1:=TODuga.Create(MCompl(Xc,0),MCompl(Yc,0),MCompl(R,0),A.Re,B.Re,CC,DD,0,circ_arc,Att0,NIL);<br />TOKontur(OOO).Spis.Insert(I+2,Dug1,[zn_Plus]) ;<br /><br /><br />Dug1.Tag:=E1.Tag;<br />E:=TOKontur(OOO).Spis<i>;E.Destroy;<br />TOKontur(OOO).Spis.Delete(I); Inc(J);<br /><br />Xc:=TODuga(E2).XC.Re;<br />Yc:=TODuga(E2).YC.Re;<br />R:=TODuga(E2).R.Re;<br />AA:=TODuga(E2).X1;<br />BB:=TODuga(E2).Y1;<br />C:=TOPoint(Pnt1).X;<br />D:=TOPoint(Pnt1).Y;<br />Dug1:=TODuga.Create(MCompl(Xc,0),MCompl(Yc,0),MCompl(R,0),AA,BB,C.Re,D.Re,0,circ_arc,Att0,NIL);<br />TOKontur(OOO).Spis.Insert(J+1,Dug1,[zn_Plus]) ;<br /><br /><br />Dug1.Tag:=E2.Tag;<br />CC:=TODuga(E2).X2;<br />DD:=TODuga(E2).Y2;<br />A:=TOPoint(Pnt1).X;<br />B:=TOPoint(Pnt1).Y;<br />Dug1:=TODuga.Create(MCompl(Xc,0),MCompl(Yc,0),MCompl(R,0),A.Re,B.Re,CC,DD,0,circ_arc,Att0,NIL);<br />TOKontur(OOO).Spis.Insert(J+2,Dug1,[zn_Plus]) ;<br /><br /><br />Dug1.Tag:=E2.Tag;<br /><br />E:=TOKontur(OOO).Spis[J];E.Destroy;<br />TOKontur(OOO).Spis.Delete(J);<br />BlockIJ:= (Pnt1 is TOPoint) and (Pnt2 is TOPoint);<br />goto l_dd;<br />end;<br />end;<br /><br />if not (Pnt2 is TOEmpty) then<br />if Assigned(Pnt2) then<br />begin<br />if not ((KrajDug(Pnt2,E1)) or (KrajDug(Pnt2,E2))) then<br />begin<br />Xc:=TODuga(E1).XC.Re;<br />Yc:=TODuga(E1).YC.Re;<br />R:=TODuga(E1).R.Re;<br />AA:=TODuga(E1).X1;<br />BB:=TODuga(E1).Y1;<br />C:=TOPoint(Pnt2).X;<br />D:=TOPoint(Pnt2).Y;<br />Dug1:=TODuga.Create(MCompl(Xc,0),MCompl(Yc,0),MCompl(R,0),AA,BB,C.Re,D.Re,0,circ_arc,Att0,NIL);<br />TOKontur(OOO).Spis.Insert(I+1,Dug1,[zn_Plus]) ;<br />Dug1.Tag:=E1.Tag;<br />CC:=TODuga(E1).X2;<br />DD:=TODuga(E1).Y2;<br />A:=TOPoint(Pnt2).X;<br />B:=TOPoint(Pnt2).Y;<br />Dug1:=TODuga.Create(MCompl(Xc,0),MCompl(Yc,0),MCompl(R,0),A.Re,B.Re,CC,DD,0,circ_arc,Att0,NIL);<br />TOKontur(OOO).Spis.Insert(I+2,Dug1,[zn_Plus]) ;<br />Dug1.Tag:=E1.Tag;<br />E:=TOKontur(OOO).Spis<i>;E.Destroy;<br />TOKontur(OOO).Spis.Delete(I); Inc(J);<br /><br />Xc:=TODuga(E2).XC.Re;<br />Yc:=TODuga(E2).YC.Re;<br />R:=TODuga(E2).R.Re;<br />AA:=TODuga(E2).X1;<br />BB:=TODuga(E2).Y1;<br />C:=TOPoint(Pnt2).X;<br />D:=TOPoint(Pnt2).Y;<br />Dug1:=TODuga.Create(MCompl(Xc,0),MCompl(Yc,0),MCompl(R,0),AA,BB,C.Re,D.Re,0,circ_arc,Att0,NIL);<br />TOKontur(OOO).Spis.Insert(J+1,Dug1,[zn_Plus]) ;<br /><br />Dug1.Tag:=E2.Tag;<br />CC:=TODuga(E2).X2;<br />DD:=TODuga(E2).Y2;<br />A:=TOPoint(Pnt2).X;<br />B:=TOPoint(Pnt2).Y;<br />Dug1:=TODuga.Create(MCompl(Xc,0),MCompl(Yc,0),MCompl(R,0),A.Re,B.Re,CC,DD,0,circ_arc,Att0,NIL);<br />TOKontur(OOO).Spis.Insert(J+2,Dug1,[zn_Plus]) ;<br />Dug1.Tag:=E2.Tag;<br /><br />E:=TOKontur(OOO).Spis[J];E.Destroy;<br />TOKontur(OOO).Spis.Delete(J);<br />goto l_dd;<br />end;<br /><br />end;<br />l_dd:<br />if Assigned(Pnt1) then Pnt1.Destroy;<br />if Assigned(Pnt2) then Pnt2.Destroy;<br />goto lab200;<br />end;<br />lab200:<br />if not BlockIJ then Inc(J);<br />end;<br />if not BlockIJ then Inc(I);<br />end;<br />{ goto fin; }<br /><br />{Тест на средние точки с удалением}<br />Cst:=TOchisl.Create(MCompl(1.0,0),tc_Constant,NAtt,NIL,c_ord);<br />if true then<br />for I := TOKontur(OOO).Spis.Count - 1 downto 0 do<br />begin<br />E1:=TOKontur(OOO).Spis<i>;<br />{определение средней точки элемента}<br />if E1 is TOLine then CalcP9_O(E1,MCompl(0.5,0),Xt,Yt,Prizn);<br />if E1 is TODuga then CalcP9_D(E1,0.5,Xt,Yt,Prizn);<br /><br />Pnt1:=TOPoint.Create(Xt,Yt,1,0,tp_fixed,Att5,nil);<br />{TOKontur(OOO).Spis.Add(TOPoint.Create(Xt,Yt,1,0,tp_fixed,Att5,nil));}<br /><br />for J := 0 to TOKontur(X).Spis.Count - 1 do<br />begin<br />{нахождение расстояние от средней точки до элемента исходного контура}<br />E2:=TOKontur(X).Spis[J];<br />EExecPF(Pnt1,E2,Pnt2,Att0,1,1,NIL);<br /><br />{TOKontur(OOO).Spis.Add(TOPoint.Create(TOPoint(Pnt2).X,TOPoint(Pnt2).Y,1,0,tp_fixed,Att5,nil));}<br /><br />if Pnt2 is TOEmpty then<br />begin<br />Continue;<br />end;<br /><br />EExecC2(Pnt1,Pnt2,Distance,Att5,1,1,NIL);<br />{если расстояние меньше, то исключить элемент I}<br />if (Abs(TOChisl(Distance).C.re)&lt;Abs(TOChisl(Y).C.Re)-Eps)<br />then<br />begin<br />TOKontur(OOO).Spis.Delete(I);<br />E1.Destroy;<br />Break;<br />end;<br />Distance.Destroy;<br />Pnt2.Destroy;<br />end;<br />{goto fin;}<br />if E1.Tag=0 then Continue;<br /><br />Found:=FALSE;<br />for J := 0 to TOKontur(X).Spis.Count - 1 do<br />begin<br />{нахождение расстояние от средней точки до вершины исходного контура}<br /><br />E2:=TOKontur(X).Spis[J];<br />EExecP9(E2,Cst,Pnt2,Att0,1,1,NIL);<br /><br />{TOKontur(OOO).Spis.Add(TOPoint.Create(TOPoint(Pnt2).X,TOPoint(Pnt2).Y,1,0,tp_fixed,Att5,nil));}<br /><br />EExecC2(Pnt1,Pnt2,Distance,Att5,1,1,NIL);<br />{если расстояние меньше, то исключить элемент I}<br />if (Abs(TOChisl(Distance).C.re)&lt;Abs(TOChisl(Y).C.Re)+Eps)<br />then<br />begin<br />{TOKontur(OOO).Spis.Delete(I);<br />E1.Destroy;}<br />Found:=TRUE;<br />end;<br />Distance.Destroy;<br />Pnt2.Destroy;<br />end;<br />if not Found then<br />begin<br />TOKontur(OOO).Spis.Delete(I);<br />E1.Destroy;<br />end;<br /><br /><br /><br /><br />Pnt1.Destroy;<br />end;<br />Cst.Destroy;<br />{ goto fin; }<br /><br /><br />{Тест на крайние точки с удалением}<br />if TRUE then<br />for I := TOKontur(OOO).Spis.Count - 1 downto 0 do<br />begin<br />E1:=TOKontur(OOO).Spis<i>;<br />{определение средней точки элемента}<br />if E1 is TOLine then CalcP9_O(E1,MCompl(0,0),Xt,Yt,Prizn);<br />if E1 is TODuga then CalcP9_D(E1,0,Xt,Yt,Prizn);<br /><br />Pnt1:=TOPoint.Create(Xt,Yt,1,0,tp_fixed,Att5,nil);<br />{ TOKontur(OOO).Spis.Add(TOPoint.Create(Xt,Yt,1,0,tp_fixed,Att5,nil)); }<br /><br />for J := 0 to TOKontur(X).Spis.Count - 1 do<br />begin<br />{нахождение расстояние от крайней точки до узла исходного контура}<br />E2:=TOKontur(X).Spis[J];<br />Cst:=TOchisl.Create(MCompl(J,0),tc_Constant,NAtt,NIL,c_ord);<br />EExecP9(X,Cst,Pnt2,Att5,1,1,NIL);<br />Cst.Destroy;<br />if Pnt2 is TOEmpty then Continue;<br /><br />EExecC2(Pnt1,Pnt2,Distance,Att5,1,1,NIL);<br />{если расстояние меньше, то исключить элемент I}<br />if Abs(TOChisl(Distance).C.re)&lt;Abs(TOChisl(Y).C.Re)-Eps then<br />begin<br />TOKontur(OOO).Spis.Delete(I);<br />E1.Destroy;<br />Break;<br />end;<br />Distance.Destroy;<br />Pnt2.Destroy;<br />end;<br />Pnt1.Destroy;<br /><br />end;<br />{goto fin;}<br />// Выбираем вершину на исходном контуре, проецируем ее на элемент контура-результата и,<br />// если расстояние окажется меньше дистанции, то такой элемент удаляем<br /><br />{Удаление элементов по критерию &quot;от вершин&quot;}<br />// Вершины исходного контура проецируем на элементы полученного<br />// Если получится, что расстояние меньше, то элемент удаляем<br /><br />if TRUE then if TOKontur(X).Spis.Count&gt;0 then<br />for I := 0 to TOKontur(X).Spis.Count {-1} do // -1 ликвидирована, иначе незамкнутый контур теряет возможность влиять на эквидистанту последней вершиной<br />begin<br />CalcP9_W(X,I,Xt,Yt,Prizn);<br />Pnt1:=TOPoint.Create(Xt,Yt,1,0,tp_fixed,Att5,nil);<br /><br />for J := TOKontur(OOO).Spis.Count - 1 downto 0 do<br />begin<br />E1:=TOKontur(OOO).Spis[J];<br />if TODuga(E1).OAtt.LV=2 then TODuga(E1).FAtt.LV:=0;<br /><br />EExecPF(Pnt1,E1,Pnt2,Att0,1,1,NIL);<br />if Pnt2 is TOEmpty then<br />begin<br />Pnt2.Destroy;<br />Continue;<br />end;<br />EExecC2(Pnt1,Pnt2,Distance,Att5,1,1,NIL);<br />{если расстояние меньше, то исключить элемент I}<br />if Abs(TOChisl(Distance).C.re)&lt;Abs(TOChisl(Y).C.Re)-Eps then<br />begin<br />TOKontur(OOO).Spis.Delete(J);<br />E1.Destroy;<br />end;<br />Distance.Destroy;<br />Pnt2.Destroy;<br />end;<br />Pnt1.Destroy;<br />end;<br />{goto fin;}<br />{Контроль дублированных элементов}<br />for I := TOKontur(OOO).Spis.Count - 1 downto 1 do<br />begin<br />E1:=TOKontur(OOO).Spis<i>;<br />for J := I - 1 downto 0 do<br />begin<br />E2:=TOKontur(OOO).Spis[J];<br />if (E1 is TODuga) and (E2 is TODuga) then<br />begin<br />if Abs(TODuga(E1).Xc.Re-TODuga(E2).Xc.Re)&lt;Eps then<br />if Abs(TODuga(E1).Yc.Re-TODuga(E2).Yc.Re)&lt;Eps then<br />if Abs(TODuga(E1).R.Re+TODuga(E2).R.Re)&lt;Eps then<br />if Abs(TODuga(E1).X1-TODuga(E2).X2)&lt;Eps then<br />if Abs(TODuga(E1).Y1-TODuga(E2).Y2)&lt;Eps then<br />if Abs(TODuga(E1).X2-TODuga(E2).X1)&lt;Eps then<br />if Abs(TODuga(E1).Y2-TODuga(E2).Y1)&lt;Eps then<br />begin<br />TOKontur(OOO).Spis.Delete(I);<br />E1.Destroy;<br />end;<br />if Abs(TODuga(E1).Xc.Re-TODuga(E2).Xc.re)&lt;Eps then<br />if Abs(TODuga(E1).Yc.Re-TODuga(E2).Yc.Re)&lt;Eps then<br />if Abs(TODuga(E1).R.Re-TODuga(E2).R.Re)&lt;Eps then<br />if Abs(TODuga(E1).X1-TODuga(E2).X1)&lt;Eps then<br />if Abs(TODuga(E1).Y1-TODuga(E2).Y1)&lt;Eps then<br />if Abs(TODuga(E1).X2-TODuga(E2).X2)&lt;Eps then<br />if Abs(TODuga(E1).Y2-TODuga(E2).Y2)&lt;Eps then<br />begin<br />TOKontur(OOO).Spis.Delete(I);<br />E1.Destroy;<br />end;<br />end;<br />end;<br /><br />end;<br /><br />{контроль нулевых объектов}<br />for I := TOKontur(OOO).Spis.Count - 1 downto 0 do<br />begin<br />E1:=TOKontur(OOO).Spis<i>;<br />if E1 is TOLine then<br />begin<br />if TOLine(E1).IsNull then<br />begin<br />TOKontur(OOO).Spis.Delete(I);<br />E1.Destroy;<br />end;<br />end;<br />// надо удалять только нулевые дуги, но не окружности<br />if E1 is TODuga then<br />begin<br />if not ((TODuga(E1).Vid=1) or (TODuga(E1).Vid=5)) then if Dist(TODuga(E1).X1,TODuga(E1).Y1,TODuga(E1).X2,TODuga(E1).Y2)&lt;Eps then<br />begin<br />TOKontur(OOO).Spis.Delete(I);<br />E1.Destroy;<br />end;<br />end;<br />end;<br /><br />{контроль объектов неправильной вложенности}<br />if TRUE then<br />Begin<br />Cst:=TOchisl.Create(MCompl(0.5,0),tc_Constant,NAtt,NIL,c_ord);<br />for I := TOKontur(OOO).Spis.Count - 1 downto 0 do<br />begin<br />E1:=TOKontur(OOO).Spis<i>;<br />begin<br /><br />EExecP9(E1,Cst,Pnt,NAtt,1,1,NIL);<br /><br />if (not PointInsideContur(PNT,X)) and (TOChisl(Y).C.Re&lt;0) then<br />begin<br />{ TOKontur(OOO).Spis.Delete(I);<br />E1.Destroy;}<br />end;<br />Pnt.Destroy;<br />end;<br />end;<br />Cst.Destroy;<br />End;<br /><br />{Изъятие &quot;висячих&quot; элементов}<br />if TRUE then<br />repeat<br />Prizn:=FALSE;<br />for I := TOKontur(OOO).Spis.Count - 1 downto 0 do<br />begin<br />N1:=0; N2:=0;<br />E1:=TOKontur(OOO).Spis<i>;<br />if E1 is TODuga then if (TODuga(E1).Vid=1) or (TODuga(E1).Vid=5) then Continue;<br /><br /><br />for J := TOKontur(OOO).Spis.Count - 1 downto 0 do<br />begin<br />E2:=TOKontur(OOO).Spis[J];<br />if I&lt;&gt;J then if KrajAny1(E1,E2) then Inc(N1);<br />if I&lt;&gt;J then if KrajAny2(E1,E2) then Inc(N2);<br />end;<br />if (N1&lt;1) or (N2&lt;1) then<br />begin<br />Prizn:=TRUE;<br />E1.Destroy;<br />TOKontur(OOO).Spis.Delete(I);<br />end;<br />end;<br />until not Prizn;<br /><br />fin:<br /><br />{сделать упорядочение контура}<br />// Временно отключаем ориентацию для прочей отладки<br /><br />// Сделать тест на взаимопринадлежность исходного контура и полученного<br />{}TOKontur(OOO).Ordnung(TRUE);{}<br />TOKontur(OOO).Zamkn:=TRUE;<br />TOKontur(OOO).L:=TOKontur(OOO).Spis.Count;<br />if TOKontur(OOO).L=0 then TOKontur(OOO).Zamkn:=FALSE;<br /><br />TOKontur(OOO).CalcGabarit;<br />{MySpecObj:=TODuga(TOKontur(OOO).Spis[0]);}<br /><br />end<br />else if Att.Chk=1 then if Att.Chk=1 then OOO:=TOEmpty.Create([X,Y],OW,NIL);<br />Result:=TRUE;<br />SysVar.AllowComplex:=BBB;<br /><br />// Признак vid=5 надо внимательно обдумать на предмет его бесконечности<br />end; // ExecW3<br /><br />Это мой САПР УП для машин термической резки: https://files.fm/f/de2zbp235<br />Качайте на здоровье. Он рабочий.<br />ЭТО видео работы Sapr: https://www.youtube.com/watch?v=Y2c9Otlu_to</i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i>]]></description>
<dc:creator>basilcat</dc:creator>
<category>Высшая математика</category><pubDate>Thu, 03 Nov 2022 08:13:00 +0300</pubDate></item>
<item>
<guid>http://www.mathforum.ru/forum/read/1/18960/19036/#19036</guid>
<title>уточнение вопроса</title><link>http://www.mathforum.ru/forum/read/1/18960/19036/#19036</link><description><![CDATA[<blockquote class="bbcode"><div><small>Цитата<br/></small><strong></strong><br/>Выскажу гипотезу: речь идет о плоском многоугольнике.</div></blockquote><br />Да, действительно, прошу прощения за неточность<br />Вершины предствляют собой точки на плоскости А1(x1;y1), А2(x2;y2), ... , АN(xN;yN).<br />При этом еще раз подчеркну что, набор координат вершин многогранника задан в последовательном порядке обхода контура (по часовой или против).<br /><br />PS<br />я пытаюсь реализовать такой алгоритм в Object Pascal]]></description>
<dc:creator>schukin</dc:creator>
<category>Высшая математика</category><pubDate>Tue, 01 Dec 2009 14:07:55 +0300</pubDate></item>
<item>
<guid>http://www.mathforum.ru/forum/read/1/18960/19014/#19014</guid>
<title>Что-то непонятное</title><link>http://www.mathforum.ru/forum/read/1/18960/19014/#19014</link><description><![CDATA[Первое непонятное - это исходные данные:<br /><blockquote class="bbcode"><div><small>Цитата<br/></small><strong></strong><br/>Исходные данные:<br />набор координат вершин многогранника.</div></blockquote> - Набор вершин худо-бедно определяет выпуклый многогранник, как выпуклую оболочку, но для невыпуклого (при размерности оного более двух) - уже не сильно понятно.<br />Второе непонятное (тоже и исходные данные): <blockquote class="bbcode"><div><small>Цитата<br/></small><strong></strong><br/>в последовательном порядке обхода контура (по часовой или против)</div></blockquote>. - что озачает порядок обхода контура многогранника?<br /><br />Выскажу гипотезу: речь идет о плоском многоугольнике.]]></description>
<dc:creator>museum</dc:creator>
<category>Высшая математика</category><pubDate>Tue, 01 Dec 2009 00:30:46 +0300</pubDate></item>
<item>
<guid>http://www.mathforum.ru/forum/read/1/18960/18960/#18960</guid>
<title>Построение эквидистантного контура к замкнутому невыпоклуму многограннику</title><link>http://www.mathforum.ru/forum/read/1/18960/18960/#18960</link><description><![CDATA[Здравствуйте!<br />Возникла задача построения эквидистантного кунтура к невыпоклуму многограннику.<br /><br />Исходные данные:<br />набор координат вершин многогранника в последовательном порядке обхода контура (по часовой или против).<br /><br />Необходимо определить наборы точек эквидистантных контуров как внешних так и внутренних (величина смещения для эквидистант = а).<br /><br />Готового решения я не жду. Помогите хотябы с пониманием такого алгоритма (в частности, как определять характер нормалей к сторонам многогранника - внешняя или внутренняя?)<br /><br />Буду благодарен за любую помощь]]></description>
<dc:creator>schukin</dc:creator>
<category>Высшая математика</category><pubDate>Mon, 30 Nov 2009 14:10:33 +0300</pubDate></item>
</channel>
</rss>