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

       

Классы cпециальной оценки


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

Параметрическая кривая определена непрерывной функцией, которая отображает некоторый интервал реальной линии (возможно полная реальная линия) или в 2D

или  3D пространство, в зависимости от того, является ли кривая 2D или 3D. Параметрическая поверхность определена непрерывной функцией, которая отображает некоторое связанное подмножество uv

плана (возможно полный uv план) в пространство 3D. Точка на параметрической кривой или поверхности, которая соответствует специфическому значению параметра, может быть получена,  оценивая функцию в том значении параметра. Для кривых значение параметра - скаляр, и для поверхностей,  значение параметра - точка 2D.

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

Иногда вычислители содержат дополнительные параметры для требования и возвращения нормального вектора в специфическом значении параметра.

В дополнение к таким функциям вычислителя (методы вызвал evalPoint ()) для каждой кривой и поверхностного класса, AcGe библиотека содержит вычислитель, классифицирует AcGePointOnCurve2d, AcGePointOnCurve3d, и AcGePointOnSurface, через который к  кривой и поверхностные вычислители можно обращаться. К  кривой и поверхностные вычислители можно также обращаться через AcGePointOnCurve2d, AcGePointOnCurve3d, и классы AcGePointOnSurface. Эти классы обслуживают две основных цели:

§         Они формируют всю геометрическую информацию относительно специфической точки на кривой или поверхности типа значения параметра, координат пространства модели, производных, и искривления.


§         Они обеспечивают интерфейс к кривой и поверхностным вычислителям, который является более простым и более эффективным чем традиционный интерфейс вычислителя большинства систем АВТОМАТИЗИРОВАННОГО ПРОЕКТИРОВАНИЯ.

Общественный интерфейс к AcGePointOnCurve2d, AcGePointOnCurve3d, и классам AcGePointOnSurface идентичен если бы не незначительные различия в именах функции элемента. Например, AcGePointOnCurve3d класс содержит функцию deriv (), который возвращает производный вектор, в то время как AcGePointOnSurface класс содержит две функции, uDeriv () и vDeriv (), возвращать u и v частные производные. Остаток от этого раздела описывает, как использовать AcGePointOnSurface класс, но это описание обращается к AcGePointOnCurve2d и классам AcGePointOnCurve3d также, потому что их интерфейс очень похож к таковому AcGePointOnSurface класса.

Чтобы использовать AcGePointOnSurface класс, чтобы оценить точки и производные, Вы должны определить, которая поверхность должна быть оценена и значение параметра, в котором оценка должна быть сделана. Следующий две функции элемента устанавливают поверхность и значение параметра объекта AcGePointOnSurface:

AcGePointOnSurface& setSurface (const AcGeSurface&);



AcGePointOnSurface& setParameter (const AcGePoint2d&);

После того, как Вы вызываете setSurface (), все последующие оценки выполнены на той поверхности, пока Вы не вызываете setSurface () снова для различной поверхности. Точно так же после того, как Вы вызываете setParameter (), все последующие функции запроса возвращают информацию, имеющую отношение к тому значению параметра, пока setParameter () не вызван{*назван*} снова для различного значения параметра. Например, рассмотрите,является ли srf

объект AcGeSurface, param - объект AcGePoint2d, и pntOnSrf - объект AcGePointOnSurface, то следующий код оценивает точку, и первые производные на srf

в параметре оценивают param:

pntOnSrf.setSurface (srf);

pntOnSrf.setParameter (param);



AcGePoint3d pnt3d = pntOnSrf.point();

AcGeVector3d uFirstPartial = pntOnSrf.uDeriv(1), vFirstPartial = pntOnSrf.vDeriv(1);

Практически, Вы редко, если когда-либо, вызываете setSurface () или setParameter () непосредственно.

Вместо этого Вы вызываете эти функции косвенно через функции элемента AcGePointOnSurface класса. Например, point() функция, которая возвращает точку пространства модели в специфическом значении параметра, имеет три различных сигнатуры:

AcGePoint3d point () const;

AcGePoint3d point (const AcGePoint2d& param);

AcGePoint3d point (

const AcGeSurface& srf,

const AcGePoint2d& param);

Первая сигнатура не берет никакие параметры и предполагает, что поверхность и значение параметра уже были установлены предыдущим, вызывает к setSurface () и setParameter (). Вторая сигнатура предполагает, что поверхность уже была установлена предыдущим запросом к setSurface (), но это вызывает setParameter (param), чтобы установить значение параметра перед оценкой. Третья сигнатура вызывает setSurface (srf) и setParameter (param), чтобы установить поверхность и значение параметра перед оценкой. Только функция левой части объявлена как константа; другой два изменяют объект,  устанавливая поверхность и-или значение параметра. Прямой вызов к setSurface () и setParameter () может теперь быть удален из предыдущего кода следующим образом:

AcGePoint3d pnt3d = pntOnSrf.point ( srf, param );

AcGeVector3d uFirstPartial = pntOnSrf.uDeriv(1),

vFirstPartial = pntOnSrf.vDeriv(1);

Первые операторные причины setSurface (srf) и setParameter (param), чтобы быть вызван перед оценкой выполнены. Последующие оценки выполнены на той же самой поверхности и в том же самом значении параметра, пока setSurface () или setParameter () не вызван снова, или непосредственно или косвенно.

Поэтому, вторая инструкция не должна повторно определить или srf

или param параметры. Все функции оценки AcGePointOnSurface класса следуют за тем же самым образцом наличия трех различных сигнатур:



AcGeVector3d uDeriv (int order) const;

AcGeVector3d uDeriv (int order, const AcGePoint2d& param);

AcGeVector3d uDeriv (

int order, const AcGeSurface& srf,

const AcGePoint2d& param);

AcGeVector3d vDeriv (int order) const;

AcGeVector3d vDeriv (int order, const AcGePoint2d& param);

AcGeVector3d vDeriv (

int order, const AcGeSurface& srf,

const AcGePoint2d& param);

AcGeVector3d mixedPartial () const;

AcGeVector3d mixedPartial (const AcGePoint2d& param);

AcGeVector3d mixedPartial (

const AcGeSurface& srf,

const AcGePoint2d& param);

AcGeVector3d normal () const;

AcGeVector3d normal (const AcGePoint2d& param);

AcGeVector3d normal (

const AcGeSurface& srf,

const AcGePoint2d& param);

Точно так же имеются три конструктора для AcGePointOnSurface класса:

AcGePointOnSurface ();

AcGePointOnSurface (const AcGeSurface& srf);

AcGePointOnSurface (

const AcGeSurface& srf,

const AcGePoint2d& param);

При использовании первого конструктора, Вы не определяете значение параметра или поверхность. Возможно, Вы устанавливаете поверхность и значение параметра перед первой оценкой. Чтобы предотвращать построение неинициализированного объекта, первый конструктор устанавливает поверхность в AcGePlane:: kXYPlane, который является только планом XY, и устанавливает значение параметра в значение по умолчанию (0,0). Второй конструктор вызывает setSurface (srf) и устанавливает значение параметра в значение по умолчанию (0,0). Третий конструктор вызывает setSurface (srf) и setParameter (param). Второй конструктор особенно полезен в функциях

В котором в поверхность пропускают как параметр:

void func (const AcGeSurface& srf)

{

AcGePointOnSurface

pntOnSrf (srf);

.

.

.

}

Конструктор вызывает setSurface (srf) так, чтобы все последующие оценки в этой функции были выполнены на srf.

Поскольку AcGePointOnSurface класс формирует, и параметрический и информация пространства модели относительно специфической точки на поверхности, это полезно для функций, которые должны возвратить информацию относительно одних или более отличных точек на поверхности. Например, AcGeSurface класс содержит функцию элемента:



void getClosestPointTo (

const AcGePoint3d& pnt3d,

AcGePointOnSurface& closestPoint,

const AcGeTol& =AcGeContext::gTol) const;

Эта функция возвращает самую близкую точку на поверхности к точке ввода pnt3d. Самая близкая точка возвращена как объект AcGePointOnSurface, который содержит значение параметра, точку пространства модели, и другую информацию относительно той специфической точки на поверхности. Все функции в AcGe

библиотеке, которые возвращают объект AcGePointOnSurface как параметр вывода (не-константа),  уже вызвали setSurface () и setParameter () для того параметра. Поэтому, после запроса такой функции, Вы не должны сбросить значение параметра или поверхность. Например, следующий код получает значение параметра, точку пространства модели, и первые производные самой близкой точки на поверхности srf к сути pnt3d:

// Вычислить самую близкую точку на поверхности к pnt3d.

AcGePointOnSurface closestPoint;

srf.getClosestPointTo (pnt3d, closestPoint);

// Получить значение параметра, точку пространства модели, и первую производную

// Векторы самой близкой точки.

AcGePoint2d param = closestPoint.parameter ();

AcGePoint3d pnt3d = closestPoint.point ();

AcGeVector3d uFirstPartial = closestPoint.uDeriv (1),

vFirstPartial = closestPoint.vDeriv (1);

Ни один из вызывов point (), uDeriv (), или vDeriv () не должен определить поверхность или значение параметра, потому что они были уже установлены getClosestPointTo(). Вообще, setSurface () и setParameter () не должен быть вызван, если Вы явно не намереваетесь изменить поверхность или значение параметра объекта AcGePointOnSurface. Например, первая инструкция в следующем коде косвенно вызывает setSurface () и setParameter (). Вторые и третьи инструкции неэффективны, потому что они делают ненужным, вызывает к setSurface () и setParameter (), используя точный те же самые параметры как первая инструкция.

AcGePoint3d pnt3d = pntOnSrf.point (srf, param);

AcGeVector3d uFirstPartial = pntOnSrf.uDeriv (1, srf, param);



AcGeVector3d vFirstPartial = pntOnSrf.uDeriv (1, param);

Этот код выполняется правильно; однако более эффективно записать это следующим образом:

AcGePoint3d pnt3d = pntOnSrf.point (srf, param);

AcGeVector3d uFirstPartial = pntOnSrf.uDeriv ();

AcGeVector3d vFirstPartial = pntOnSrf.uDeriv ();

AcGePointOnCurve2d, AcGePointOnCurve3d, и классы AcGePointOnSurface не только обеспечивают способ формировать пространство параметра и информацию пространства модели точки на кривой или поверхности, они также обеспечивают более простой и более естественный интерфейс к кривой и поверхностным вычислителям чем традиционные вычислители. Типичный вычислитель поверхности Стиля C смотрит кое-что вроде следующего:

void evaluate (

int numDeriv, double u, double v, Point& pnt,

Vector[] derivArray);

 Здесь, Вы определяете, что  значение параметра (значение параметра поверхности - точка 2D, чей координаты - u, v) и запрос, сколько производных должны быть возвращены. Вычислитель тогда вычисляет точку и требуемые производные в указанном значении параметра. При требовании производных, Вы должны знать порядок, в котором они возвращены. Например, является ли смешанным частичным сохраненным в четвертом или пятом элементе массива? Вы должны также удостовериться, что Вы не проходите в массиве, который является слишком маленьким, иначе наложение записей памяти произойдет. Это может быть проблема, когда вычислитель первоначально вызван для нулевых производных или одной производной (с размером массива 2 для derivArray) и позже измененный, чтобы возвратить две производной. Если Вы забываете увеличивать размер derivArray, то наложение записей памяти происходит, потому что вычислитель возвращает пять производных векторов (две первых производной и три вторых производной) в массив, который может только держать два вектора.

С AcGePointOnSurface классом, Вы запрашиваете точку, производную, и нормальную информацию в простом способе использовать point(), uDeriv (), vDeriv (), mixedPartial (), и normal() функции. Названия этих функций указывают ясно, который оценивает, они возвращаются, и не имеется никакой опасности наложения записей памяти. Вы не должны индексировать в массив, чтобы получить производные векторы и подверг риску создания ошибки и использования неправильного индекса для одного или большего количества векторов. AcGePointOnSurface класс обеспечивает интерфейс на поверхностный вычислитель, который результаты в более простом коде, который является также более читаемым и понятным другим программистам.



В дополнение к обеспечению более простого и более естественного интерфейса к кривой и поверхностным вычислителям, AcGePointOnCurve2d, AcGePointOnCurve3d, и классы AcGePointOnSurface обеспечивают более эффективный интерфейс также по традиционным вычислителям. Это - то, потому что каждый из этих классов содержит указатель на область данных, которая может использоваться вычислителями, чтобы сохранить информацию между оценками. Например, вычислитель НЕОДНОРОДНОГО РАЦИОНАЛЬНОГО В-СПЛАЙНА использует эту область, чтобы сохранить матрицы основания мощности, которые не сохранены как часть поверхностного определения. Используя эту область данных, вычислители могут избегать повторно вычислять те же самые данные, который был вычислен в предыдущей оценке и таким образом работать более эффективно. Эти данные - не часть кривой или поверхностных классов, потому что оценки могли бы иметь место в больше чем одной области чередующимся способом, который приведет к неэффективной потере местных данных оценки в переключении контекста.

Эта область данных также позволяет вычислителям быть намного более эффективной, когда преобразование применилось к объекту AcGePointOnSurface. Если transformBy () функция вызвана на объект AcGePointOnSurface, это заставляет последующие оценки быть преобразованным указанным преобразованием без фактически преобразования основной поверхности. Это означает, что вычислители должны применить преобразование к каждой точке, производной, и нормальному вектору, который они вычисляют. Используя область данных объекта AcGePointOnSurface, вычислители могут избегать иметь фактически, чтобы применить это преобразование для каждой оценки. Например, AcGePlane класс содержит компоненты данных mPoint, mUAxis, и mVAxis, которые определяют начало координат и оси плана. AcGePlane вычислитель оценивает точку со следующей инструкцией:

AcGePoint3d pnt3d = mPoint + param.x * mUAxis + param.y * mVAxis;

Если transformBy () запросили объект AcGePointOnSurface, то это преобразование должно примениться к pnt3d прежде, чем это возвращено вызывающей программе.

Вычислитель может избегать, чтобы  расход матрицы умножился,  сохраняя преобразованный mPoint, mUAxis, и mVAxis в AcGePointOnSurface области данных.

Тогда вышеупомянутая инструкция оценит точку в преобразованном местоположении без дополнительного расхода матрицы, умножают. Это - особенно полезная способность в приложениях типа моделирования трансляции{*блока*}, где кривые и поверхности были преобразованы в пространство{*пробел*} трансляции{*блока*} преобразованием позиционирования.


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