Параметры выделенной области
Под выделенной областью следует понимать часть площади чертежа, ограниченную произвольной замкнутой линией. Как любой элемент область
имеет параметры, позволяющие работать внутри области: измерять длины и углы. К ним относятся: 1) файл линий, которые задают непрерывный контур;
2) обход – положительное направление перемещения внутри контура; 3) границы области – диагональ прямоугольника, в котором расположена область.
Прямоугольная область
Выделить прямоугольную область можно, например курсором, для чего потребуется указать одну из его вершин и полученный квадрат раздвинуть командами ®¯до необходимых размеров прямоугольника. В файл а будут записаны 4 линии:
Line(Xа1, Yа1, Xа1, Yа2);
Line(Xа1, Yа2, Xа2, Yа2);
Line(Xа2, Yа2, Xа2, Yа1);
Line(Xа2, Yа1, Xа1, Yа1).
Линии записаны в произвольном порядке, БТ линий находится в левом верхнем углу экрана. Чтобы записать линии в формате чертежа:
begin
Repeat
Читать файл а линий границы области, начиная с1-й строки:
SledLine(а,1,Naа,Xа1,Yа1,Xа2,Yа2,XCа,YCа );
Прорисовать и записать линии границы области, начиная с1-й строки в файл g
RisLineBox(g, 1, Nag, Xg1,Yg1,Xg2,Yg2, XCg,YCg)
Until E=4;
end;
Если границы области следует записать в виде ломаной линии, т.е. выполнить ‘обход’ по или против часовой стрелки (рис. 127), то необходим оператор ‘ОбходOбл’, который прочитает файл g, отсортирует строки по возрастанию (убыванию) текущего угла, перепишет файл g и заполнит значение переменной ‘Обход’ (1 - против часовой стрелки, 2 – по часовой).
Рис. 127
Procedure ОбходOбл; {записывает непрерывный контур, назначает ‘Обход’}
var Xg1,Yg1,Xg2,Yg2,TUgol :float;
var Bx, Pd :tekst;
var El, Napr, Обход :byte;
Procedure Взять;
begin
Repeat
Читать файл линий границы области, начиная с1-й строки:
SledLine(g,1,Nag,Xg1,Yg1,Xg2,Yg2,XCg,YCg );
Определить текущий угол:
TekUgol(Xg1,Yg1,Xg2,Yg2,TUgol);
Записать в файл параметры линий в порядке убывания TUgol:
StrokBox(m, Pd, TUgol<, Napr, El, Xg1, Yg1, Xg2, Yg2);
Until E=Nkg;
DelBox(g);
end;
Procedure Вернуть;
begin
Repeat
Читать файл m строку начиная с 1-й строки:
SledStrok( m, Pd, TUgol<, Napr, El, Xg1, Yg1, Xg2, Yg2 );
Переписать файл g в порядке возрастания TUgol :
RisLineBox( g, 1, Nag, Xg1, Yg1, Xg2, Yg2, XCg, YCg ),
Until E=Nkm;
end;
{ основная программа ОбходОбл }
begin
Взять; Вернуть; DelBox(m);
if TUgol = TUgol< then Обход:= 1 else Обход:= 2;
{на рис. 13 обход принят против часовой стрелки}
end;
Границы области (X1< X2, Y1< Y2; направление диагонали снизу вверх и вправо):
Procedure Gr_XY(X1,Y1,X2,Y2);
var Pd :byte;
begin
Pd:=0; {Pd=1 - прочитана горизонтальная линия;
Pd=2 - вертикальная}
Repeat
Читать и записать в строку параметров линию границы области, начиная с 1-й записи в файле g:
SledLine( g, 1, Nag, Xg1, Yg1, Xg2, Yg2, XCg, YCg );
Определить текущий угол:
TekUgol(Xg1, Yg1, Xg2, Yg2,U);
if U=0 or U=180 then begin
if Xg1<Xg2 then begin
X1:=Xg1; X2:=Xg2; Y:=Yg1;
end
else begin
X1:=Xg2; X2:=Xg1; Y:=Yg1;
end;
Pd:=Pd+1;
end;
f Pd=1{горизонтальная линия уже определена} and (U=90 or U=270)
then begin
if Yg1=Y tnen begin
if Yg2>Y then begin
Y1:=Y; Y2:=Yg2;
end
else begin
Y1:=Yg2; Y2:=Y;
end;
end;
if Yg2=Y tnen begin
if Yg1>Y then begin
Y1:=Y; Y2:=Yg1;
end
else begin
Y1:=Yg1; Y2:=Y;
end;
end;
Pd:=Pd+1;
end;
Until Pd=2; {прочитаны горизонтальная и вертикальная линии}
end;