Работа с универсальными плоскими объектами: различия между версиями

Материал из K3-Macro
(Новая страница: «Категория:Макро В системе имеется список двухмерных универсальных объектов. Над этим...»)
 
Нет описания правки
Строка 201: Строка 201:


Пример:
Пример:
<source lang="lua">
<syntaxhighlight lang="lua">
  defarr li1[4],ar1[6]; // Создаем массивы под объекты
  defarr li1[4],ar1[6]; // Создаем массивы под объекты
   
   
Строка 247: Строка 247:
  }   
  }   
  exit;
  exit;
</source>
</syntaxhighlight>


== Сервисные функции ==
== Сервисные функции ==

Версия от 20:34, 30 июля 2021

В системе имеется список двухмерных универсальных объектов. Над этими объектами можно производить различные операции (поиск точки пересечения, поиск точки касания и пр). Эти операции могут возвращать числовые значения (координаты), могут порождать новые универсальные объекты и добавлять их в список и пр.

Каждый элемент в этом списке имеет свой уникальный номер. После удаления объекта номер не может быть использован.

При добавлении объекта возвращается номер, который однозначно идентифицирует объект.

Добавление, получение и удаление объекта

AddUnObj2D

INT AddUnObj2D(INT <Type>, INT <CreType>, ARRAY <Array>)

Функция добавляет в список созданных объектов объект типа <Type> способом задания <CreType> и данными из массива <Array>.

Функция возвращает номер созданного объекта в списке.


Возможные типы объектов <Type>:


  • 0 - точка

способы задания <CreType> (они будут пополняться):

0 - по декартовым координатам

<Array>[1] - Координата X

<Array>[2] - Координата Y

1 - по полярным координатам

<Array>[1] - Радиус

<Array>[2] - Угол


  • 1 - отрезок

способы задания <CreType>:

0 — по декартовым координатам начала и конца отрезка

<Array>[1] - Координата X начала отрезка

<Array>[2] - Координата Y начала отрезка

<Array>[3] - Координата X конца отрезка

<Array>[4] - Координата Y конца отрезка


  • 2 - дуга

способы задания <CreType>:

0 - по декартовым координатам трех точек дуги

<Array>[1] - Координата X начала дуги

<Array>[2] - Координата Y начала дуги

<Array>[3] - Координата X конца дуги

<Array>[4] - Координата Y конца дуги

<Array>[5] - Координата X точки на дуге

<Array>[6] - Координата Y точки на дуге

1 - по декартовым координатам начала и конца дуги и радиусу

<Array>[1] - Координата X начала дуги

<Array>[2] - Координата Y начала дуги

<Array>[3] - Координата X конца дуги

<Array>[4] - Координата Y конца дуги

<Array>[5] - Радиус дуги. Если радиус >0, строится малая дуга. Иначе - большая дуга

<Array>[6] - Ориентация дуги. Если ориентация =1 - положительное направление (против часовой стрелки). Иначе - по часовой.


  • 3 - окружность

способы задания <CreType>:

0 - по декартовым координатам точки центра, радиусу и ориентации

<Array>[1] - Координата X центра окружности

<Array>[2] - Координата Y центра окружности

<Array>[3] - Радиус окружности

<Array>[4] - Координата ориентация (1 - положительная - против часовой стрелки, 0 - отрицательная - по часовой стрелке)

GetUnObj2D

INT GetUnObj2D(INT <Num>, INT <Type>, ARRAY <Array>)

Функция заполняет массив <Array> данными об объекте с номером <Num> в списке и возвращает в переменную <Type> тип возвращаемого объекта.

Функция возвращает число заполненных элементов массива.


Возможные типы объектов <Type>:


  • 0 - точка

<Array>[1] - Координата X

<Array>[2] - Координата Y


  • 1 - отрезок

<Array>[1] - Координата X начала отрезка

<Array>[2] - Координата Y начала отрезка

<Array>[3] - Координата X конца отрезка

<Array>[4] - Координата Y конца отрезка


  • 2 - дуга

<Array>[1] - Координата X начала дуги

<Array>[2] - Координата Y начала дуги

<Array>[3] - Координата X конца дуги

<Array>[4] - Координата Y конца дуги

<Array>[5] - Координата X точки на дуге

<Array>[6] - Координата Y точки на дуге


  • 3 - окружность

<Array>[1] - Координата X центра окружности

<Array>[2] - Координата Y центра окружности

<Array>[3] - Радиус окружности

<Array>[4] - Координата ориентация (1 - положительная - против часовой стрелки, 0 - отрицательная - по часовой стрелке)

FreeUnObj2D

LOGICAL FreeUnObj2D(INT <Num>)

Функция удаляет из списка объект с номером <Num>.

Функция возвращает единицу в случае успешного удаления и ноль — в случае ошибки.

Построение дуги, касательной к объектам

INT ArcTTUnObj2D(INT <Num1>, INT <Num2>, DOUBLE <R>[, DOUBLE <X>, DOUBLE <Y>])

Функция ArcTTUnObj2D строит дугу радиуса <R>, касательную к объектам с номерами <Num1> и <Num2>. Если радиус <R> отрицательный, дуга строится по часовой стрелке. Иначе - против часовой стрелки. Необязательные параметры <X> и <Y> задают желательный центр дуги касания (для однозначности)

Функция возвращает номер построенного объекта. Если ничего построить не удалось, функция возвращает 0.

Деление объекта точкой

INT Div2UnObj2D(INT <Num>, DOUBLE <X>, DOUBLE <Y>)

Функция Div2UnObj2D делит объект с номером <Num> точкой с координатами <X> и <Y>. В результате деления образуются два новых объекта, один из которых может быть точкой. Функция возвращает номер первого образовавшегося объекта (от начала до точки деления). Номер второго объекта (от точки деления до конца) имеет следующий порядковый номер. В случае, если точка не лежит на объекте <Num>, функция возвращает 0.

Вычисление параметров дуги

INT GetACUnObj2D(INT <Num>, DOUBLE ARRAY <Arr>)

Функция GetACUnObj2D вычисляет параметры объекта с номером <Num> типа "дуга" и складывает в массив <Arr> последовательно вычисленные параметры:

<Arr[1]> — Координата X центра дуги

<Arr[2]> — Координата Y центра дуги

<Arr[3]> — Радиус дуги

<Arr[4]> — Ориентация дуги (1 - положительная - против часовой стрелки, 0 - отрицательная - по часовой стрелки)

<Arr[5]> — Угол до начала дуги (в радианах)

<Arr[6]> — Угол раствора дуги (в радианах)

Функция возвращает число заполненных элементов массива. Для не дуги функция возвращает 0.

Нахождение точек пересечения объектов

INT InterUnObj2D(INT <UnObj1>, LOGICAL <OnObjFlag1>, INT <UnObj2>, LOGICAL <OnObjFlag2>, { STRING <ArrName> | DOUBLE ARRAY <Arr> })

Функция InterUnObj2D находит точки объектов с номерами <UnObj1> и <UnObj2>, и записывает точки пересечения в массив с именем <ArrName> или уже созданный массив <Arr>. Если флаги <OnObjFlag1> или <OnObjFlag2> равны 1, то точка пересечения ищется только на самих объектах. Если флаги <OnObjFlag1> или <OnObjFlag2> равны 0, то точка пересечения ищется не только на объектах, но и на их продолжениях.

В массив с именем <ArrName> или уже созданный массив <Arr>'' записываются последовательно координаты точек персечения. Размерность массива равна 2*n, где n - количество найденных точек пересечения. Если точек пересечения не найдено, массив не создается.

Функция возвращает количество найденных точек пересечения или -1 в случае ошибки.

Пример:

 defarr li1[4],ar1[6]; // Создаем массивы под объекты
 
 NULLOUT=initarray(li1,0); // Инициализируем массивы
 NULLOUT=initarray(ar1,0); // Инициализируем массивы
 
 // Первый объект будет отрезок от точки (0,0) до (0,100)
 li1[1]=0;
 li1[2]=0;
 li1[3]=0;
 li1[4]=100;

 // Второй объект - окружность от точки (50,0) до (-50,0), проходит через точку (0,-50)
 ar1[1]=50;
 ar1[2]=0;
 ar1[3]=-50;
 ar1[4]=0;
 ar1[5]=0;
 ar1[6]=-50;

 // Добавляем объекты в список
 un1=addunobj2d(1,0,li1);
 un2=addunobj2d(2,0,ar1);

 // Находим точки пересечения первого отрезка с окружностью, на которой лежит вторая дуга
 
 // Массив задаем строкой
 kp=InterUnObj2D(un1,1,un2,0,"arr");
 
 if (kp&gt;0)
 {
   putmsg(arr);
 }
 
 // Находим точки пересечения прямой первого отрезка с окружностью, на которой лежит вторая дуга
 
 // Массив задаем явно
 defarr qqq[4];
 
 kp=InterUnObj2D(un1,0,un2,0,qqq);
 
 if (kp&gt;0)
 {
   putmsg(qqq)
 }  
 exit;

Сервисные функции

INT MaxUnObj2D()

Функция MaxUnObj2D возвращает максимальный номер объекта в списке.


INT TypeUnObj2D(INT <Num>)

Функция TypeUnObj2D возвращает тип объекта с номером <Num> или -1 в случае ошибки

Типы объектов:

0 - точка;
1 - отрезок;
2 - дуга;
3 - окружность;
4 - сплайн.

Пример:

// Строим сопряжение дугой двух отрезков
defarr li1[4],li2[4],ar[6],li3[4],li4[4];

// Координаты первого отрезка
li1[1]=0;
li1[2]=0;
li1[3]=100;
li1[4]=0;

// Координаты второго отрезка
li2[1]=100;
li2[2]=0;
li2[3]=100;
li2[4]=100;

// Радиус сопряжения
r=30;
 
// Добавляем объекты
u1=addunobj2d(1,0,li1);
u2=addunobj2d(1,0,li2);

// Получаем дугу сопряжения
u3=arcttunobj2d(u1,u2,r);
 

// Читаем ее координаты
NULLOUT=getunobj2d(u3,ty,ar);

// Делим первый отрезок
u4=div2unobj2d(u1,ar[1],ar[2]);

// Удаляем ненужную часть отрезка
NULLOUT=freeunobj2d(u4+1);

// Делим второй отрезок
u5=div2unobj2d(u2,ar[3],ar[4]);

// Удаляем ненужную часть отрезка
NULLOUT=freeunobj2d(u5);

// Читаем координаты
NULLOUT=getunobj2d(u4,ty,li3);
NULLOUT=getunobj2d(u5+1,ty,li4);

// Находим максимальный номер объекта
NULLOUT=maxunobj2d();

// Строим сопряжение
line li3[1],li3[2],0 li3[3],li3[4],0;
arc ar[1],ar[2],0 ar[3],ar[4],0 ar[5],ar[6],0;
line li4[1],li4[2],0 li4[3],li4[4],0;

// Удаляем объекты
NULLOUT=freeunobj2d(u1);
NULLOUT=freeunobj2d(u2);
NULLOUT=freeunobj2d(u3);
NULLOUT=freeunobj2d(u4);
NULLOUT=freeunobj2d(u5+1);

// Находим максимальный номер объекта
NULLOUT=maxunobj2d();

exit;