ObjectARX, AutoCAD. Среда программирования библиотеки C++

       

Использование базовых геометрических типов


Следующие примеры показывают некоторых из обычно используемых функций и операторов в точке, векторе, и матричных классах. Эти примеры используют трехмерные классы, но большинство их также обращается к 2-ым классам также.

Заданный по умолчанию конструктор для точек и векторов инициализирует все координаты к 0.

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

AcGePoint3d p1 (2.0,5.0, -7.5), p2, p3 (1.0,2.0,3.0);

AcGeVector3d v1 (3.0,4.0,5.0), v2 (0.0,1.0, -1.0), v3;

Точка и векторные классы обеспечивают +, + =, -, и - = операторы. Эти операторы позволяют точки и векторы использоваться аналогичным способом, поскольку встроенные типы, типа удваиваются и целые числа. Следующее - примеры добавления и вычитания точек и векторов:

p2 = p1 + v1;          // Set p2 to sum of p1 and v1.

p1 += v1;                // Add v1 to p1.

p3 -= v1;                 // Subtract v1 from p3.

v3 = v1 + v2;          // Set v3 to sum of v1 and v2.

v1 + = v2;               // Прибавляют v2 к v1.

v3 = v1 - v2;           // Набор v3 к различию v1 и v2.

Не имеется никакого + оператор для добавления двух точек; однако, точка может быть преобразована к вектору, который может тогда быть добавлен к другой точке:

p1 + = p2.asVector ();

Следующее - примеры того, как получить негатив вектора:

v2 = -v1; // Набор v2 к негативу v1.

v1.negate (); // Это эквивалентен v1 = -v1.

Следующее - примеры различных способов масштабировать вектор:

v1 * = 2.0;               // Удваивает длину v1.

v3 = v1 / 2.0;          // Набор v3 к половине длины v1.

v1.normalize ();     // Делают v1 единичным вектором.

Точка и векторные классы содержат множество функций запроса для вычислительных расстояний и длин:

double len = v2.length();     // Длина v2.

len = p1.distanceTo (p2);    // Расстояние от p1 до p2.

Следующая функция очень полезна для вычисления угла между двумя трехмерными векторами. Следующие возвращения угол между v1 и v2, где угол принят, чтобы быть против часовой стрелки относительно v3 (v3,  приняты, чтобы быть перпендикулярными к v1 и v2):


angle = v1.angleTo (v2, v3);

Следующие функции возвращают Булево значение (TRUE или FALSE) и могут использоваться внутренние условные операторы:

if (v1.isZeroLength ())

if (v1.isParallelTo (v2))

if (v1.isPerpendicularTo (v2))

Векторный класс содержит функции для обычных векторных операций:

len = v1.dotProduct (v2);

v3 = v1.crossProduct (v2);

Заданный по умолчанию конструктор для матрицы инициализирует матрицу к единичной матрице:

AcGeMatrix3d mat1, mat2, mat3;

Следующее вращает p3 90 градусов относительно линии, определенной p1 и v1:

mat1.setToRotation (kPi/2.0, v1, p1);

p3 = mat1 * p2;

Матрица может быть инвертирована, если это не сингулярно:

if (!mat2.isSingular())

mat2.invert();

* оператор определен для связывания матриц:

mat3 = mat1 * mat2;

Следующие испытания, содержит ли матрица равное масштабирование во всех трех координатах (то есть это не изменяет форму любого примитива, к которому это применяется):

if (mat.isUniScaledOrtho ())


Содержание раздела