Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Произвольный контур

Читайте также:
  1. D) звездчатый контур, спикулоподобные тяжи
  2. Контура скорости
  3. Контуры местного уровня регуляции.
  4. Обоснование кондиций и выбор контура месторождения
  5. Ограничение тока якоря одноконтурной СУЭП с положительной обратной связью по току якоря. Функциональная схема. Формирование статических характеристик.
  6. Одинаковой температуре, то результирующая термо-ЭДС, действую-щая в контуре, не изменяется. Электроизмерительный прибор
  7. Одноконтурная СУЭП с отрицательной обратной связью по скорости, (функциональная схема, формирование статических характеристик в одноконтурной СУЭП).

‘Укажите курсором линию контура’ 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 | Нарушение авторских прав


Читайте в этой же книге: Длина отрезка и текущий угол. | Взаимное положение отрезков. | Точки пересечения прямой и дуги. | Пересечение дуг. | Направление дуги. | Взаимное положение линий чертежа. | Определение отрезков прямых, расположенных в области |
<== предыдущая страница | следующая страница ==>
Определение дуг, расположенных в области| МАТЕРИЯ

mybiblioteka.su - 2015-2024 год. (0.009 сек.)