Параметры выделенной области

Под выделенной областью следует понимать часть площади чертежа, ограниченную произвольной замкнутой линией. Как любой элемент область

 

 

имеет параметры, позволяющие работать внутри области: измерять длины и углы. К ним относятся: 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;