Точка принадлежит объекту
 

Отношение предназначено для определения геометрического места собственной точки вещественной плоскости на Объекте (точке, прямой, окружности, контуре, кривой Безье, сплайне, конике а также в полях производных объектах, соответствующих перечисленным ранее типам) в соответствии со значением числового Параметра.

Если тип объекта, указанного в любом из входных параметров, оказывается несовместимым с типом этого параметра, то при установленном флажке NIL в выходной параметр заносится значение NIL-объекта.

Инцидентность точки с точкой: Точка всегда будет инцидентна любой точке с произвольным вещественным значением параметра.

Инцидентность точки с прямой: Геометрическое место точки, инцидентной с прямой, находится в зависимости от стиля прямой.

1. В том случае, если прямая является ограниченной (отрезком), то длина этого отрезка принимается за единицу измерения параметрического числа. Начальная точка отрезка соответствует нулевому значению параметрического числа, конечная – единичному. Параметрическое число для любой промежуточной точки отрезка выражает результат отношения расстояния, измеренного от начальной точки до промежуточной, к общей длине отрезка. При значениях параметрического числа, меньших 0 и больших 1, значение инцидентной точки не определено и в выходной параметр Точка заносится значение NIL-объекта.

2. Для неограниченных линий параметрическое число соответствует единице измерения длины этой линии, причем нулевое значение параметрическое число получает в точке, соответствующей первой определяющей точке прямой, а направление возрастания значений параметрических чисел соответствует направлению, задаваемому ориентацией прямой. Единичному значению параметра условно соответствует 100 единиц длины. Образуемая в результате операции точка перед занесением в выходной параметр проверяется на принадлежность внутренней области прямой, определяемой ее стилем. Если точка не принадлежит внутренней области, то в список выходных значений Точка заносится NIL-объект.

Отрицательное значение Параметра задает противоположную ориентацию правила размещения точки.

Инцидентность точки с окружностью:

1. В том случае, если точка принадлежит дуге окружности, то положение инцидентной точки определяется из отношения длины дуги между этой точкой и начальной точки исходной дуги к общей длине исходной дуги. За 0 принимается такое значение параметрического числа, которое совмещает инцидентную точку с начальной точкой дуги, за 1 – с конечной точкой дуги. При значениях параметрического числа, меньших 0 и больших 1, значение инцидентной точки не определено и в выходной параметр точка заносится значение NIL-объекта.

2. В случае инцидентности точки с неограниченной окружностью за точку, соответствующую значению 0 параметрического числа принимается точка с координатами: X=Xc+R, Y=Yc, где Xc, Yc – координаты точки центра окружности, R - радиус окружности. Параметрическое число равно 1 соответствует одному полному обороту точки вокруг центра окружности в направлении против часовой стрелки. Промежуточные значения определяются, исходя из соотношения длины дуги между базовой и инцидентной точками к длине окружности.

Отрицательное значение Параметра задает противоположную ориентацию правила размещения точки.

Инцидентность точки с контуром:

Местоположение точки на контуре определяется позвенно. При целочисленных значениях параметра Точка располагается в узловых точках контура, причем нулевому значению параметра соответствует начальная точка первого звена контура, а единичному - его конечная точка и т.д. Таким образом, максимальному допустимому значению величины параметра соответствует количество звеньев контура. Местоположение точки внутри звена определяется соответственной дробной частью параметра и подчиняется правилу размещения точек на отрезках прямых и дугах окружностей.

При значениях параметрического числа, меньших 0 и превышающих количество звеньев контура, значение инцидентной точки не определено и в выходной параметр Точка заносится значение NIL-объекта.

Инцидентность точки с кривой Безье:

Местоположение точки на кривой Безье определяется на основе расчета значений координат точки, исходя из параметрического уравнения, задающего кривую Безье. При нулевом значении параметра Точка совпадает с начальной точкой кривой Безье, при единичном - с конечной точкой.

В том случае, если кривая Безье ограничена, значения параметров, при которых Точка может быть построена находится в пределах от 0 до 1.

Если атрибуты, задающие стиль кривой Безье, переводят ее в неограниченную форму, то значение параметра может быть произвольным вещественным числом, а местоположение точки определяется в результате расчета параметрического уравнения, определяющего кривую.

Инцидентность точки со сплайном:

Поскольку сплайн в системе Симплекс является совокупностью взаимосвязанных кривых Безье, построенных на узловых точках, то принцип построения Точки, инцидентной со сплайном, по значению Параметра аналогичен принципу построения точки на контуре. Положение точки внутри звена определяется дробной частью соответственного параметрического числа и рассчитывается так же, как и в случае инцидентности точки с ограниченной кривой Безье.

При значениях параметрического числа, меньших 0 и превышающих количество звеньев сплайна, значение инцидентной точки не определено и в выходной параметр Точка заносится значение NIL-объекта.

Инцидентность точки с коникой:

Для определения положения точки на конике выполняется следующее построение:

1. Рассчитывается точка центра коники.
2. Из полученного центра проводится луч в направлении, определяемом величиной угла между направлением, параллельным с осью OX, как доля полного оборота вокруг центра, принятого за единицу измерения параметра.

Инцидентность точки со шкалой:

Местоположение точки на шкале определяется в соответствии со значением ведущего параметра, задающего параметрический алгоритм построения шкалы.

При значениях параметрического числа, при которых алгоритм построения шкалы распадается, в выходной параметр Точка заносится значение NIL-объекта.

Инцидентность точки в полях производных объектов:

Местоположение точки, инцидентной объектам полей производного объекта, определяется в соответствии с правилами, соответствующими типам этих объектов.

Интерактивные способы задания точек, инцидентных с объектами

Точку, принадлежащую объекту линейного типа, можно задать интерактивно. Для этой цели служит инструмент . Такой способ задания удобен в тех случаях, когда конкретное значение параметра принадлежности несущественно, а важен лишь сам факт принадлежности точки к объекту.

Ввод значений параметров отношения осуществляется в результате указания перекрестием курсора на место расположения точки на выбранном объекте, при этом в параметры панели ввода отношения заносятся имя выбранного объекта и автоматически рассчитанное значение параметра положения точки на этом объекте. Для единовременного множественного ввода точек, инцидентных объекту, следует удерживать нажатой клавишу Shift.

Динамическое редактирование положения точек, инцидентных объектам

Динамическое изменение положения точек, инцидентных объектам, осуществляется инструментом "шейпер" . Динамическое редактирование и автоматический расчет параметров положения осуществим в тех случаях, если в система будет способна свести предысторию образования Параметра к заданию числа отношением C0 .

Присоединение свободной точки, заданной отношением P0 , к объекту с изменением типа порождающего отношения на P9 .

Точку, заданную отношением можно сделать инцидентной с объектом, если в процессе динамического редактирования поместить шейпер над этим объектом при удержании нажатой клавиши Shift. В момент отпускания левой кнопки мыши система автоматически рассчитает значение параметра в месте присоединения точки и выполнит замену отношения для редактируемой точки на P9 .

Отсоединение инцидентной с объектом точки, заданной отношением P9 , с изменением типа порождающего отношения на P0 .

Точку, инцидентную с объектом (заданную отношением P9 ), можно сделать свободной, если в процессе динамического редактирования ее положения на объекте вывести шейпер за пределы объекта при удержании нажатой клавиши Shift. В момент отпускания левой кнопки мыши система автоматически рассчитает значение координат в месте нового расположения точки и выполнит замену отношения для редактируемой точки на P0 .


 
 
 
Клавиша
Предварительно
выделено:
Действие
Выделение после действия:
m, M Объект Построение множества точек принадлежащих объекту, с параметром принадлежности [0~1~12]; согласование множественное Выделяются полученные точки
p Отрезок + Построение точек, расположенных на концах отрезка Выделяются построенные точки,
выделение отрезка снимается
P Отрезок (прямая) + Построение точек, расположенных на прямой с параметрами положения -0.25 и 1.25 (выход за пределы отрезка) Выделяются построенные точки,
выделение отрезка снимается
 
 
Параметры
Типы объектов
Функциональное назначение параметров
Точка
Точка
Точка, инцидентная c указанным объектом, геометрическое место которой на этом объекте определяется параметром положения
Объект
Прямая, окружность, контур, кривая Безье, сплайн, шкала, коника
Объект, являющийся носителем инцидентной точки
Параметр
Величина, размер
Величина параметра положения искомой точки на объекте
 

Прототип команды: P9 Согласование Точка ; {-}Объект {-}Параметр .

 

Пример 1:

Построить точку, принадлежащую отрезку, с параметром принадлежности 0.60998712.

Алгоритм "Главный"
1
Точка p1 задана координатами -119.5 и -19.5 .
2
Точка p2 задана координатами 47.5 и 64.5 .
3
Прямая o1 задана точками p1 и p2 .
4
Точка p3 принадлежит объекту o1 с параметром принадлежности 0.60998712 .


Пример 2:

Построить точку, принадлежащую неограниченной прямой, с параметром принадлежности 0.60998712.

Алгоритм "Главный"
1
Точка p1 задана координатами -142.5 и -38.5 .
2
Прямая o1 задана точкой p1 и углом 12.08 к оси OX.
3
Точка p2 принадлежит объекту o1 с параметром принадлежности 1.7083599 .

 

 

 

 

 

 

 

 

 

procedure CalcP9_O(X: TObj; U:complex; var E,F: complex; var Prizn: boolean);
var X1,Y1,X2,Y2,AX,AY,BX,BY : real;
    X1i,Y1i,X2i,Y2i,AXi,AYi,BXi,BYi : real;
    AAX,BBX,AAY,BBY: complex;
begin
     X1:=TOLine(X).X1.Re;
     Y1:=TOLine(X).Y1.Re;
     X2:=TOLine(X).X2.Re;
     Y2:=TOLine(X).Y2.Re;
     X1i:=TOLine(X).X1.Im;
     Y1i:=TOLine(X).Y1.Im;
     X2i:=TOLine(X).X2.Im;
     Y2i:=TOLine(X).Y2.Im;

     Ax:=X2-X1;
     Ay:=Y2-Y1;
     BX:=AX*U.Re;
     BY:=AY*U.Re;
     Axi:=X2i-X1i;
     Ayi:=Y2i-Y1i;
     BXi:=AXi*U.Re;
     BYi:=AYi*U.Re;

     E:=MCompl(X1+BX,X1i+BXi);
     F:=MCompl(Y1+BY,Y1i+BYi);

     AAX:=CompSub(TOLine(X).X2,TOLine(X).X1);
     AAY:=CompSub(TOLine(X).Y2,TOLine(X).Y1);
     BBX:=CompMul(AAX,U);
     BBY:=CompMul(AAY,U);
     E:=CompSum(TOLine(X).X1,BBX);
     F:=CompSum(TOLine(X).Y1,BBY);

end; // CalcP9_O 

 

procedure CalcP9_S(X: TObj; U: real; var E,F: complex; var prizn: boolean);
var X1,Y1,UU: real;

begin
     UU:=U+1;
     TOSpline(X).CalcP9(UU,X1,Y1);
     E:=MCompl(X1,0);
     F:=MCompl(Y1,0);
end; // CalcP9_S 

 

procedure CalcP9_D(X: TObj; U:real; var E,F: complex; var prizn: boolean);
var X1,Y1,X2,Y2: complex;
    R,Pi2,Ast,Aen,Fi: real;
begin
     if TODuga(X).Vid in [circ_full,drw_Empty,drw_Incidented] then
     begin
          with TODuga(X) do StartStop(Xc.Re,Yc.Re,X1,Y1,X2,Y2,R.Re,Ast,Aen);
          Pi2:=2*Pi;
          X1:=TODuga(X).Xc;
          Y1:=TODuga(X).Yc;
          R:=TODuga(X).R.Re;
          E.Im:=X1.Im+TODuga(X).R.Im*Cos((Pi2*U+{Ast}+TODuga(X).Laba/360*Pi2));
          F.Im:=Y1.Im+TODuga(X).R.Im*Sin((Pi2*U+{Ast}+TODuga(X).Laba/360*Pi2));
          E.Re:=X1.Re+Abs(R)*Cos((Pi2*U+{Ast}+TODuga(X).Laba/360*Pi2)*Sgn(R));
          F.Re:=Y1.Re+Abs(R)*Sin((Pi2*U+{Ast}+TODuga(X).Laba/360*Pi2)*Sgn(R));
     end;

     if TODuga(X).Vid in [circ_Arc,circ_NArc] then
     begin

          if X.OAtt.Lv=0 then with TODuga(X) do StartStop(Xc.Re,Yc.Re,X1,Y1,X2,Y2,R.Re,Ast,Aen);
          if X.OAtt.Lv=2 then with TODuga(X) do StartStop(Xc.Re,Yc.Re,X2,Y2,X1,Y1,R.Re,Ast,Aen);

          if TODuga(X).R.Re>0 then
          begin
               Fi:=Ast+U*(Aen-Ast);
               X1:=TODuga(X).Xc;
               Y1:=TODuga(X).Yc;
               R:=Abs(TODuga(X).R.Re);
               E.Im:=0;
               F.Im:=0;
               E.Re:=X1.Re+R*Cos(Fi);
               F.Re:=Y1.Re+R*Sin(Fi);
          end;

          if TODuga(X).R.Re<0 then
          begin
               while Aen<ASt do Aen:=Aen+2*Pi;
               Fi:=Aen+U*(Ast-Aen);
               X1:=TODuga(X).Xc;
               Y1:=TODuga(X).Yc;
               {R:=Abs(TODuga(X).R);}
               R:=(TODuga(X).R.Re);
               E.Im:=0;
               F.Im:=0;
               E.Re:=X1.Re-R*Cos(Fi);
               F.Re:=Y1.Re-R*Sin(Fi);
          end;

     end;

end; // CalcP9_D 

 

procedure CalcP9_Z(X: TObj; U: real; var E,F: complex; var prizn: boolean);
var U2,U3: real;
begin
     U2:=(1-U)*(1-U);
     U3:=U2*(1-U);

     with X as TOBezje do
     begin
          E:=MCompl(U3*PX0+3*U*U2*PX1+3*U*U*(1-U)*PX2+U*U*U*PX3,0);
          F:=MCompl(U3*PY0+3*U*U2*PY1+3*U*U*(1-U)*PY2+U*U*U*PY3,0);
     end;

end; // CalcP9_Z 

 

procedure CalcP9_W(X: TObj; U: real; var E,F: complex; var prizn: boolean);
var LL: smallint;
    G: TObj;
    Bool: boolean;
    Ast,Aen,value: real;
    VX,VY: complex;

label lab1;
begin
     Prizn:=TRUE;
     LL:=TOKontur(X).L;
     if LL<=0 then goto Lab1;

     if TOKontur(X).Zamkn then
     begin
          if U>=0 then U:=U-(Trunc(U) div LL)*LL;
          if U<0 then U:=U-(Trunc(U) div LL-1)*LL;
     end;

     if (U<0) or (U>LL+Eps) then
     begin
          Prizn:=FALSE;
          goto lab1;
     end;

     if Abs(U-LL)>=Eps then
     begin
          G:=TOKontur(X).Spis[(Trunc(U))];
          if G.Obj='O' then with TOLine(G) do
          begin
               E.Re:=X1.Re+(X2.Re-X1.Re)*Frac(U);
               F.Re:=Y1.Re+(Y2.Re-Y1.Re)*Frac(U);
               {
               Out_Prm:=TOPoint.Create(E,F,1,U,Kind,Att,OW);
               Out_Prm.AssignParents([X,Y]);
               AddInc(X,Out_Prm);
               Izm:=TRUE;
               }
          end;

          if G.Obj='Z' then with TOBezje(G) do
          begin
               CalcP9_Z(TOBezje(G),Frac(U),E,F,Bool);
          end;

          if G.Obj='S' then with TOSpline(G) do
          begin
               CalcP9_S(TOSpline(G),Frac(U)*(TOSpline(G).N-1),E,F,Bool);
          end;

          if G.Obj='D' then with TODuga(G) do
          begin
               if Vid=0 then StartStop(Xc.Re,Yc.Re,X1,Y1,X2,Y2,R.Re,Ast,Aen);
               if Vid=2 then StartStop(Xc.Re,Yc.Re,X2,Y2,X1,Y1,R.Re,Ast,Aen);
               if Vid=1 then begin Ast:=0; Aen:=2*Pi; end;
               if R.Re<0 then
               begin
                    while AEn<Ast do AEn:=AEn+2*Pi;
                    Value:=Ast+(Aen-Ast)*(1-Frac(U));
                    E.Re:=Xc.Re+Abs(R.Re)*Cos(Value);
                    F.Re:=Yc.Re+Abs(R.Re)*Sin(Value);
               end
               else
               begin
                    Value:=Frac(U);
                    Value:=Ast+(Aen-Ast)*Value;
                    E.Re:=Xc.Re+Abs(R.Re)*Cos(Value);
                    F.Re:=Yc.Re+Abs(R.Re)*Sin(Value);
               end;
               {
               Out_Prm:=TOPoint.Create(E,F,1,U,Kind,Att,OW);
               Out_Prm.AssignParents([X,Y]);
               AddInc(X,Out_Prm);
               Izm:=TRUE;
               }
          end;

          (*
          AddInc(G,Out_Prm); { Внимание! }
          if Abs(Frac(U))<Eps then if U>=1 then
          begin
               G:=TOKontur(X).Spis[(Trunc(U)-1)];
               AddInc(G,Out_Prm); { Внимание! }
          end;
          *)
          goto lab1;
     end;

     if Abs(U-LL)<Eps then
     begin
          G:=TOKontur(X).Spis[Round(U)-1];
          if G.Obj='O' then with TOLine(G) do
          begin
               E:=X2;F:=Y2;
               (*
               Out_Prm:=TOPoint.Create(Vx,Vy,1,U,Kind,Att,OW);
               Out_Prm.AssignParents([X,Y]);
               AddInc(X,Out_Prm);
               AddInc(G,Out_Prm); { Внимание! }
               Izm:=TRUE;*)
          end;

          if G.Obj='Z' then with TOBezje(G) do
          begin
               E:=MCompl(PX3,0);F:=MCompl(PY3,0);
               (*
               Out_Prm:=TOPoint.Create(Vx,Vy,1,U,Kind,Att,OW);
               Out_Prm.AssignParents([X,Y]);
               AddInc(X,Out_Prm);
               AddInc(G,Out_Prm); { Внимание! }
               Izm:=TRUE;
               *)
          end;

          if G.Obj='D' then with TODuga(G) do
          begin
               E:=MCompl(X2,0);F:=MCompl(Y2,0);
               (*
               Out_Prm:=TOPoint.Create(Vx,Vy,1,U,Kind,Att,OW);
               {TOPoint(Out_Prm).Incia.Add(X); TOKontur(X).Incia.Add(Out_Prm);}
               Out_Prm.AssignParents([X,Y]);
               AddInc(X,Out_Prm);
               AddInc(G,Out_Prm); { Внимание! }
               Izm:=TRUE;
               *)
          end;
          lab1:
     end;

end; // CalcP9_W 

 

function EExecXXA(in_prm1,in_prm2: TObj; var out_prm1: TObj; Att_1: TAtt; Sg1,Sg2: integer; OW1: pointer): boolean;
var
// объявление объектов-переменных 
   c1, d1, g1, g2, g3, o1, p1, p2, p3, p4, p5, p6, p7, p8, p9, x1, x2, x3, x4, y1: TObj;
   SpisG3, SpisGA: TNewList;
   Success: boolean;

// объявление величин}
   Chisl1, Chisl2, Chisl3, Chisl4, Chisl5, Chisl6, Chisl7, Chisl8, Chisl9, Chisl10, Chisl11, Chisl12, Chisl13, Chisl14, Chisl15: TOChisl;
const
     Att_p1: TAtt = ( PT:0; LT:0; LV:0; HT:7; Width:1; Chk:1; Cmp:0; Ilb:0; Comment:NIL; Layers:NIL);
     Att_p2: TAtt = ( PT:0; LT:0; LV:0; HT:7; Width:1; Chk:1; Cmp:0; Ilb:0; Comment:NIL; Layers:NIL);
     Att_p3: TAtt = ( PT:0; LT:0; LV:0; HT:7; Width:1; Chk:1; Cmp:0; Ilb:0; Comment:NIL; Layers:NIL);
     Att_p4: TAtt = ( PT:0; LT:0; LV:0; HT:7; Width:1; Chk:1; Cmp:0; Ilb:0; Comment:NIL; Layers:NIL);
     Att_p5: TAtt = ( PT:0; LT:0; LV:0; HT:7; Width:1; Chk:1; Cmp:0; Ilb:0; Comment:NIL; Layers:NIL);
     Att_y1: TAtt = ( PT:0; LT:0; LV:0; HT:7; Width:1; Chk:1; Cmp:0; Ilb:0; Comment:NIL; Layers:NIL);
     Att_c1: TAtt = ( PT:0; LT:0; LV:0; HT:7; Width:1; Chk:1; Cmp:0; Ilb:0; Comment:NIL; Layers:NIL);
     Att_x1: TAtt = ( PT:0; LT:0; LV:0; HT:7; Width:1; Chk:1; Cmp:0; Ilb:0; Comment:NIL; Layers:NIL);
     Att_x2: TAtt = ( PT:0; LT:0; LV:0; HT:7; Width:1; Chk:1; Cmp:0; Ilb:0; Comment:NIL; Layers:NIL);
     Att_x3: TAtt = ( PT:0; LT:0; LV:0; HT:7; Width:1; Chk:1; Cmp:0; Ilb:0; Comment:NIL; Layers:NIL);
     Att_g1: TAtt = ( PT:0; LT:0; LV:0; HT:7; Width:1; Chk:1; Cmp:0; Ilb:0; Comment:NIL; Layers:NIL);
     Att_g2: TAtt = ( PT:0; LT:0; LV:0; HT:7; Width:1; Chk:1; Cmp:0; Ilb:0; Comment:NIL; Layers:NIL);
     Att_g3: TAtt = ( PT:0; LT:0; LV:0; HT:7; Width:1; Chk:1; Cmp:0; Ilb:0; Comment:NIL; Layers:NIL);
     Att_x4: TAtt = ( PT:0; LT:0; LV:0; HT:0; Width:0; Chk:1; Cmp:0; Ilb:0; Comment:NIL; Layers:NIL);
     Att_p6: TAtt = ( PT:0; LT:0; LV:0; HT:7; Width:1; Chk:1; Cmp:0; Ilb:0; Comment:NIL; Layers:NIL);
     Att_d1: TAtt = ( PT:0; LT:0; LV:0; HT:7; Width:1; Chk:1; Cmp:0; Ilb:0; Comment:NIL; Layers:NIL);
     Att_p7: TAtt = ( PT:0; LT:0; LV:0; HT:7; Width:1; Chk:1; Cmp:0; Ilb:0; Comment:NIL; Layers:NIL);
     Att_o1: TAtt = ( PT:0; LT:0; LV:5; HT:7; Width:1; Chk:1; Cmp:0; Ilb:0; Comment:NIL; Layers:NIL);
     Att_p8: TAtt = ( PT:0; LT:0; LV:0; HT:7; Width:1; Chk:1; Cmp:0; Ilb:0; Comment:NIL; Layers:NIL);
     Att_p9: TAtt = ( PT:0; LT:0; LV:0; HT:7; Width:1; Chk:1; Cmp:0; Ilb:0; Comment:NIL; Layers:NIL);

begin
// инициализация переменных
   c1:=nil;
   d1:=nil;
   g1:=nil;
   g2:=nil;
   g3:=nil;
   o1:=nil;
   p1:=nil;
   p2:=nil;
   p3:=nil;
   p4:=nil;
   p5:=nil;
   p6:=nil;
   p7:=nil;
   p8:=nil;
   p9:=nil;
   x1:=nil;
   x2:=nil;
   x3:=nil;
   x4:=nil;
   y1:=nil;
// объявление значений величин
   Chisl1:=TOChisl.Create(MCompl(-393,0),tc_Constant,NAtt,NIL,c_ord);
   Chisl2:=TOChisl.Create(MCompl(-88.5,0),tc_Constant,NAtt,NIL,c_ord);
   Chisl3:=TOChisl.Create(MCompl(-367,0),tc_Constant,NAtt,NIL,c_ord);
   Chisl4:=TOChisl.Create(MCompl(13.5,0),tc_Constant,NAtt,NIL,c_ord);
   Chisl5:=TOChisl.Create(MCompl(-181,0),tc_Constant,NAtt,NIL,c_ord);
   Chisl6:=TOChisl.Create(MCompl(33.5,0),tc_Constant,NAtt,NIL,c_ord);
   Chisl7:=TOChisl.Create(MCompl(-122,0),tc_Constant,NAtt,NIL,c_ord);
   Chisl8:=TOChisl.Create(MCompl(-56.5,0),tc_Constant,NAtt,NIL,c_ord);
   Chisl9:=TOChisl.Create(MCompl(-211,0),tc_Constant,NAtt,NIL,c_ord);
   Chisl10:=TOChisl.Create(MCompl(-142.5,0),tc_Constant,NAtt,NIL,c_ord);
   Chisl11:=TOChisl.Create(MCompl(1,0),tc_Constant,NAtt,NIL,c_ord);
   Chisl12:=TOChisl.Create(MCompl(2,0),tc_Constant,NAtt,NIL,c_ord);
   Chisl13:=TOChisl.Create(MCompl(3,0),tc_Constant,NAtt,NIL,c_ord);
   Chisl14:=TOChisl.Create(MCompl(0,0),tc_Constant,NAtt,NIL,c_ord);
   Chisl15:=TOChisl.Create(MCompl(100,0),tc_Constant,NAtt,NIL,c_ord);

// реализация программы

   Result:=TRUE;
   y1:=in_Prm1.CreateCopy(NIL);
   y1.OAtt:=in_Prm1.OAtt;
   //возможно, требуется управление от знаковго флага SG1

   c1:=in_Prm2.CreateCopy(NIL);
   c1.OAtt:=in_Prm2.OAtt;
   TOChisl(C1).C.Re:=TOChisl(C1).C.Re/2;
   //возможно, требуется управление от знаковго флага SG2

   repeat
      Success:=FALSE;
      if not Assigned(p1) then 
         Success:=EExecP0(Chisl1,Chisl2,p1,Att_p1,1,1,NIL) or Success;
      if not Assigned(p2) then 
         Success:=EExecP0(Chisl3,Chisl4,p2,Att_p2,1,1,NIL) or Success;
      if not Assigned(p3) then 
         Success:=EExecP0(Chisl5,Chisl6,p3,Att_p3,1,1,NIL) or Success;
      if not Assigned(p4) then 
         Success:=EExecP0(Chisl7,Chisl8,p4,Att_p4,1,1,NIL) or Success;
      if not Assigned(p5) then 
         Success:=EExecP0(Chisl9,Chisl10,p5,Att_p5,1,1,NIL) or Success;
      if not Assigned(x1) then 
         Success:=EExecUZ(y1,Chisl11,x1,Att_x1,1*Sg1,1,NIL) or Success;
      if not Assigned(x2) then 
         Success:=EExecUZ(y1,Chisl12,x2,Att_x2,1*Sg1,1,NIL) or Success;
      if not Assigned(x3) then 
         Success:=EExecUZ(y1,Chisl13,x3,Att_x3,1*Sg1,1,NIL) or Success;
      if not Assigned(g1) then 
         Success:=EExecGT(x1,g1,Att_g1,1,NIL) or Success;
      if not Assigned(g2) then 
         Success:=EExecGT(x2,g2,Att_g2,1,NIL) or Success;
      if not Assigned(g3) then 
         Success:=EExecGT(x3,g3,Att_g3,1,NIL) or Success;

   if not Assigned(x4) then
   begin
        SpisG3:=TNewList.Create(NIL);
        SpisG3.Add(x1);
        SpisG3.Add(g1);
        SpisG3.Add(x2);
        SpisG3.Add(g2);
        SpisG3.Add(x3);
        SpisG3.Add(g3);
        EExecG3(SpisG3,x4,Att_x4,NIL);
        SpisG3.DelDestroy;
    end;

      if not Assigned(p6) then 
         Success:=EExecP1(x4,Chisl14,Chisl15,p6,Att_p6,1,1,1,NIL) or Success;
      if not Assigned(d1) then 
         Success:=EExecD1(x4,p6,d1,Att_d1,1,1,NIL) or Success;
      if not Assigned(p7) then 
         Success:=EExecP9(d1,c1,p7,Att_p7,1,1*Sg2,NIL) or Success;
      if not Assigned(o1) then
         Success:=EExecO0(x4,p7,o1,Att_o1,1,1,NIL) or Success;
      if not Assigned(p8) and not Assigned(p9) then
         Success:=EExecPM(o1,y1,p8,p9,Att_p8,Att_p9,1,1*Sg1,NIL,NIL) or Success;
   until not Success;

   out_prm1:=p9.CreateCopy(OW1);
   out_prm1.OAtt:=att_1;
   TOPoint(out_prm1).Kind:=tp_halfFree;

 

// освобождение памяти из-под объявленных объектов

    MassFree([c1,d1,g1,g2,g3,o1,p1,p2,p3,p4,p5,p6,p7,p8,p9,x1,x2,x3,x4,y1,Chisl1,Chisl2,Chisl3,Chisl4,Chisl5,Chisl6,Chisl7,Chisl8,Chisl9,Chisl10,Chisl11,Chisl12,Chisl13,Chisl14,Chisl15]);
end; // EExecXXA