Функции геометрических вычислений

Материал из K3-Macro
(перенаправлено с «RectInGrid»)
Макро | Математические функции | Алгебраические и тригонометрические функции | Функции работы с матрицами | Функции аффинных преобразований | Работа с векторами | Функции геометрических вычислений | Преобразование координат точек и векторов | Работа с битовыми масками

Команды 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>. Функция применяется только для объектов типа «Отрезок», «Окружность», «Дуга». Возвращает количество точек пересечения.

I.png Если установлен режим привязки "К продолжению объекта", то функция находит не только точки пересечения объектов, но и точки пересечения продолжений объектов.


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 — Объекты идентичны.
Pluso.png Данная функция полезна при сравнении переменных объектного типа, поскольку операция проверки на равенство (===) к ним не применима.

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]>)

Функция RectInGrid

Функция возвращает номера клеток двумерной «решетки», в которых лежит прямоугольник, заданный своими габаритными координатами. Входные параметры:

<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
Eksklamacia.png В макропрограммах этой функцией пользоваться не рекомендуется, поскольку существуют более мощные функции определения положения одного объекта относительно другог

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>.


Макро | Математические функции | Алгебраические и тригонометрические функции | Функции работы с матрицами | Функции аффинных преобразований | Работа с векторами | Функции геометрических вычислений | Преобразование координат точек и векторов | Работа с битовыми масками