Функции геометрических вычислений
Команды IntPoint, Fillet, Scrug, InOutTest, PntObj, GetPntPos, DistPntToObj, DistObjToObj, LineTest, CompareObj, RectInGrid, Penetrate, SurfSquare
IntPoint
INT IntPoint(object <Obj1>,object <Obj2>, double array <Arr[6]>)
Функция заполняет массив <Arr[6]> координатами точек пересечения объектов <Obj1> и <Obj2>. Функция применяется только для объектов типа «Отрезок», «Окружность», «Дуга». Возвращает количество точек пересечения.
| Если установлен режим привязки "К продолжению объекта", то функция находит не только точки пересечения объектов, но и точки пересечения продолжений объектов. |
Fillet
INT Fillet(object <Obj1>,object <Obj2>, double <R>, double array <PS[9]>)
INT Skrug(object <Obj1>,object <Obj2>, double <R>, double array <PS[9]>)
Обе функции вычисляют точки дуги скругления двух отрезков <Obj1> и <Obj2> радиусом <R>. Координаты трех точек дуги заносятся в массив <PS[9]>: Координаты точек даются в ГСК. Для преобразования точек в ПСК можно воспользоваться функцией PTransCS
PS[1]-PS[3]— точка начала дуги на первом отрезке
PS[4]-PS[6]— точка конца дуги на втором отрезке
PS[7]-PS[9]— внутренняя точка на дуге скругления
Отрезки должны иметь общую вершину.
Функция возвращает:
- 0 — ошибка (не те параметры, при вычислении габаритов отрезков и т.д.)
- 1 — дуга сопряжения может быть построена
- -1 — заданные отрезки не смежные (не имеют общей вершины)
- -2 — заданные отрезки параллельны друг другу
- -3 — первый отрезок короче, чем необходимо
- -4 — второй отрезок короче, чем необходимо
- -5 — первый отрезок вырожденный (имеет нулевую длину)
- -6 — второй отрезок вырожденный
- -7 — вектор вырожденный (при нормализации вектора)
- Функция Skrug вместо кодов -1, -2, -3 и -4 возвращает соответствующую строку с описанием ошибки.
- При вызове функции из Python надо использовать Skrug, так как Fillet совпадает с одноименной командой Fillet.
Пример:
RazmerR=50; // Радиус скругления
defarr Ps[9]; // Массив для результата скругления</nowiki>
#l1 line 0,300,0 200,300,0 done;
#l2 line 200,0,0 200,300,0 done;
a=Fillet(l1,l2,RazmerR,Ps); // Скругляем
// Преобразуем в ПСК
PTransCS(3,0,Ps[1],Ps[2],Ps[3],Ps[1],Ps[2],Ps[3]) ;
PTransCS(3,0,Ps[4],Ps[5],Ps[6],Ps[4],Ps[5],Ps[6]) ;
PTransCS(3,0,Ps[7],Ps[8],Ps[9],Ps[7],Ps[8],Ps[9]) ;
// Удаляем исходные отрезки
delete l1,l2 done;
// Рисуем новые
#l1 line 0,300,0 ps[1],ps[2],ps[3] done;
arc ps[1],ps[2],ps[3] ps[4],ps[5],ps[6] ps[7],ps[8],ps[9]
#l2 line 200,0,0 ps[4],ps[5],ps[6] done;
Skrug
INT Skrug(object <Obj1>,object <Obj2>, double <R>, double array <PS[9]>)
Функция вычисляет точки дуги скругления двух отрезков <Obj1> и <Obj2> радиусом <R>. Координаты трех точек дуги заносятся в массив <PS[9]>: Координаты точек даются в ГСК. Для преобразования точек в ПСК можно воспользоваться функцией PTransCS
PS[1]-PS[3]— точка начала дуги на первом отрезке
PS[4]-PS[6]— точка конца дуги на втором отрезке
PS[7]-PS[9]— внутренняя точка на дуге скругления
Отрезки должны иметь общую вершину.
Функция возвращает:
- 0 — ошибка (не те параметры, при вычислении габаритов отрезков и т.д.)
- 1 — дуга сопряжения может быть построена
- -1 — заданные отрезки не смежные (не имеют общей вершины)
- -2 — заданные отрезки параллельны друг другу
- -3 — первый отрезок короче, чем необходимо
- -4 — второй отрезок короче, чем необходимо
- -5 — первый отрезок вырожденный (имеет нулевую длину)
- -6 — второй отрезок вырожденный
- -7 — вектор вырожденный (при нормализации вектора)
Пример на макроязыке:
RazmerR=50; // Радиус скругления
defarr Ps[9]; // Массив для результата скругления
#l1 line 0,300,0 200,300,0 done;
#l2 line 200,0,0 200,300,0 done;
a=Skrug(l1,l2,RazmerR,Ps); // Скругляем
// Преобразуем в ПСК
PTransCS(3,0,Ps[1],Ps[2],Ps[3],Ps[1],Ps[2],Ps[3]) ;
PTransCS(3,0,Ps[4],Ps[5],Ps[6],Ps[4],Ps[5],Ps[6]) ;
PTransCS(3,0,Ps[7],Ps[8],Ps[9],Ps[7],Ps[8],Ps[9]) ;
// Удаляем исходные отрезки
delete l1,l2 done;
// Рисуем новые
#l1 line 0,300,0 ps[1],ps[2],ps[3] done;
arc ps[1],ps[2],ps[3] ps[4],ps[5],ps[6] ps[7],ps[8],ps[9]
#l2 line 200,0,0 ps[4],ps[5],ps[6] done;
Пример на языке Python:
import k3
RazmerR = 50 # Радиус скругления
ps = k3.VarArray(9) # Массив для результата скругления
l1 = k3.line(0, 300, 0, 200, 300, 0)
l2 = k3.line(200, 0, 0, 200, 300, 0)
a = k3.skrug(l1, l2, RazmerR, ps) # Скругляем
# Преобразуем в ПСК
k3.ptranscs(3, 0, ps[0], ps[1], ps[2],
ps[0], ps[1], ps[2])
k3.ptranscs(3, 0, ps[3], ps[4], ps[5],
ps[3], ps[4], ps[5])
k3.ptranscs(3, 0, ps[6], ps[7], ps[8],
ps[6], ps[7], ps[8])
# Удаляем исходные отрезки
k3.delete(l1, l2)
# Рисуем новые
k3.line(0, 300, 0,
ps[0].value, ps[1].value, ps[2].value)
k3.arc(ps[0].value, ps[1].value, ps[2].value,
ps[3].value, ps[4].value, ps[5].value,
ps[6].value, ps[7].value, ps[8].value)
k3.line(200, 0, 0,
ps[3].value, ps[4].value, ps[5].value)
InOutTest
INT InOutTest(object <Obj>, double <X>, double <Y>, double <Z>)
INT InOutTest(object <Obj>, double array <Arr[3]>)
Функция определяет положение точки с координатами <X>, <Y>, <Z> или координатами в массиве <Arr[3]>, заданными в ГСК, относительно объекта <Obj> типа «Тело» или объекта типа «Группа», содержащего один или несколько объектов типа «Тело» (точка внутри одного из «тел» или снаружи всех «тел»).
Функция возвращает:
- -1 — снаружи всех тел,
- 0 — на поверхности тела,
- 1 — внутри тела.
PntObj
Logical PntObj(OBJECT <Obj>, double ARRAY <Arr[3]>)
Функция проверяет, принадлежит ли точка с координатами в массиве <Arr> линейному объекту <Obj>. Объект <Obj> должен быть линией, дугой или окружностью. Функция возвращает:
- 1 — если точка принадлежит объекту
- 0 — если точка не принадлежит объекту
GetPntPos
Logical GetPntPos(double <X>, double <Y>, double <Z>, object <Obj>, int <Result>)
Функция находит положение точки с координатами {<X>,<Y>,<Z>}, заданными в ГСК, относительно тела <Obj>. Код положения тела заносится в переменную <Result>:
- 0 — точка лежит на объекте
- 1 — точка лежит внутри объекта
- -1 — точка лежит вне объекта
Функция возвращает
- 1 — успешно,
- 0 — ошибка.
Пример:
#c1 sphere 0,0,0 10; s=0; =GetPntPos(0,0,0,c1,s); 1 =s; 1 =GetPntPos(0,10,0,c1,s); 1 =s; 0 =GetPntPos(0,100,0,c1,s); 1 =s; -1
DistPntToObj
Double DistPntToObj(double array <Pnt[3]>, object <Obj>, varname array <Vector[3]>)
Функция вычисляет вектор минимального расстояния от точки с координатами, заданными массивом <Pnt> до объекта <Obj>. Результат записывается в массив <Vector>. Функция возвращает длину вектора в массиве <Vector>.
Пример:
Defarrays pnt[3], vector[3]; #c1 circle 100,0,0 10; =DistPntToObj(pnt,c1,vector); 90 =vector[1]; 90 =rrr[2]; 0 =rrr[3]; 0
DistObjToObj
INT DistObjToObj(OBJECT <Obj1>, OBJECT <Obj2>, varname ARRAY <Arr1[3]>, varname ARRAY <Arr2[3]>);
Функция вычисляет и возвращает расстояние между объектами <Obj1> и <Obj2>. В массив <Arr1> заносятся координаты ближайшей к объекту <Obj2> точки на объекте <Obj1>. В массив <Arr2> заносятся координаты ближайшей к объекту <Obj1> точки на объекте <Obj2>. Таким образом, отрезок от точки с координатами <Arr1> до точки с координатами <Arr2> – минимальный отрезок между объектами. Если объекта пересекаются – функция возвращает -1 (минус единицу), а в массивы <Arr1> и <Arr2> записываются нули.
Пример:
#obj1 circle 0,0,0 100; #obj2 circle 200,100,20 50; defarrays arr1[3],arr2[3]; =DistObjToObj(obj1,obj2,arr1,arr2); 76.574 #obj3 line arr1[1],arr1[2],arr1[3] arr2[1],arr2[2],arr2[3]; =arr1[1]; 89.819 =DistObjToObj(obj1,obj3,arr1,arr2); -1 =arr1[1]; 0
LineTest
Int LineTest(double array <FirtstLine1[3]>, double array <FirtstLine2[3]>, double array <SecondLine1[3]>, double array <SecondLine2[3]>)
Функция определяет взаимное расположение прямых в пространстве, заданных координатами точек, через которые эти прямые проходят. В массивах <FirtstLine1> и <FirtstLine2> содержатся соответственно координаты первой и второй точек первой прямой, а в массивах <SecondLine1> и <SecondLine2> соответственно координаты первой и второй точек второй прямой. Функция возвращает:
- 1 — прямые совпадают
- 2 — прямые параллельны
- 3 — прямые пересекаются
- 4 — прямые скрещиваются
- 0 — ошибка
CompareObj
Logical CompareObj(object <Obj1>, object <Obj2>)
Функция проверяет, на один ли объект указывают ссылки <Obj1> и <Obj2>. Функция возвращает
- 0 — Объекты различны
- 1 — Объекты идентичны.
| Данная функция полезна при сравнении переменных объектного типа, поскольку операция проверки на равенство (===) к ним не применима. |
RectInGrid
Int RectInGrid(int <N>, int <M>, double array <GMin[2]>, double array <GMax[2]>, double array <RMin[2]>, double array <RMax[2]>, varname array <IndArr[n,m]>)
Функция возвращает номера клеток двумерной «решетки», в которых лежит прямоугольник, заданный своими габаритными координатами. Входные параметры:
<N>— число строк «решетки»;<M>— число столбцов «решетки»<GMin>— координаты «начала» (минимальные габаритные координаты угла) «решетки»<GMax>— координаты «конца» (максимальные габаритные координаты угла) «решетки»<RMin>— координаты «начала» (минимальные габаритные координаты угла) прямоугольника<RMax>— координаты (максимальные габаритные координаты угла) прямоугольника<IndArr>— двумерный массив для результата.
Выходные параметры:
<IndArr[i][j]> = 1 если в пересечении i-го столбца и j-ой строки «решетки» есть часть прямоугольника; иначе <IndArr[i][j]> = 0
Функция возвращает:
- >0 — прямоугольник лежит внутри «решетки»;
- 0 — ошибка
- -1 — прямоугольник (или его часть) лежит вне «решетки»
Пример:
Пусть есть «Решетка» и прямоугольник. Они обозначены на рисунке зеленым.
Габаритные координаты «решетки» — (0,0) и (100,100). Прямоугольника — (30,30) и (60,60). Разобьем «решетку» на 100 частей – 10 строк и 10 столбцов.
// Массив под результат Defarrays Ind[10,10]; // Массивы под координаты «решетки» и прямоугольника Defarrays gmin[2], gmax[2], rmin[2],rmax[2]; // Габариты «решетки» gmin[1]=0; gmin[2]=0; gmax[1]=100; gmax[2]=100; // Габариты прямоугольника rmin[1]=30; rmin[2]=30; rmax[1]=60; rmax[2]=60; // Заполняем массив Ind =GridInRect(10,10,gmin,gmax,rmin,rmax,Ind); 16 =Ind[1,1]; 0 =Ind[3,3]; 1 =Ind[2,1]; 0
| В макропрограммах этой функцией пользоваться не рекомендуется, поскольку существуют более мощные функции определения положения одного объекта относительно другог |
Penetrate
INT Penetrate(OBJECT <Object1>, OBJECT <Object2>)
Функция определяет взаимное положение объектов <Object1> и <Object2>. Объекты <Object1> и <Object2> могут быть любыми, в том числе и группами, но анализируются только входящие в них объекты типа "Тело". Функция возвращает:
- 0 — не определено;
- 1 — объекты вне друг друга и не касаются друг друга;
- 2 — объекты касаются друг друга, но не пересекаются;
- 3 — объекты проникают друг в друга или пересекаются. Возможно, один объект внутри другого;
- -1 — ошибка.
SurfSquare
DOUBLE SurfSquare(OBJECT <Object>)
Функция вычисляет площадь поверхности объекта <Object> в квадратных метрах. Объект <Object> может быть любым. В результат вычисляется сумма площадей поверхностей всех поверхностей и тел (BRep), входящих в состав объекта <Object>.