Читайте также:
|
|
‘Укажите курсором линию контура’ X,Y.
Заштрихованный контур в нашем случае ограничен 2-я линиями:
- наружная состоит из отрезков прямых, дуг и окружности;
- внутренняя содержит отрезки прямых и дуги.
Следовательно, следует указать в любой последовательности обе линии. например курсором внутри области поставить точку О. Программное обеспечение в этом случае находит ближайший элемент линии наружного контура и на нем ближайшую от О точку А или В, которая принимается за начальную точку обхода по
контуру в направлении конечной точки элемента. Возврат в эту точку означает окончание выбора линии контура. Выбранный контур для наглядности и контроля со стороны пользователя желательно прорисовать другим цветом, а его линии записать во временный файл для продолжения работы с контуром.
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); {Точки пересечения прямой ОЦ с дугой}
PikDug(XP1,YP1,Xm1,Ym1,Xm2,Ym2,Nam,P1); {Принадлежность точки (XP1,YP1) дуге}
PikOtr(XP1,YP1,XО,YО,XЦ,YЦ,P2); {Принадлежность точки (XP1,YP1) отрезку}
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) в направлении ‘обход’ (рис. 109). Параметры ее записаны предыдущим оператором Nach_Lin в строку линий контура (Xo1:=Xs; Yo1:=Ys; Xo2:=Xm2; Yo2:=Ym2).
Далее определяются точки пересечения S1, S2 этого элемента с другими элементами, содержащимися в файле, и сортируются по наименьшему расстоянию до начала исходного элемента(точка Na). Одновременно определяется длина дуги DL.
Если через точку S2 проходят 2 и более элементов (в данном случае дуга d и прямая с), то выбирается элемент с меньшим углом LD. В данном случае часть дуги d с начальной точкой S2 и конечной точкой Kd. Отрезок прямой a от начальной точки Na до точки S2 записывается в файл, содержащий линии определяемого контура.
Дуга 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;
Дата добавления: 2015-08-09; просмотров: 77 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Определение дуг, расположенных в области | | | МАТЕРИЯ |