Функции геометрических вычислений
Команды IntPoint, Fillet, 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]>)
Функция вычисляет точки дуги скругления двух отрезков <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=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; // Рисуем новые 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;
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>
.