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 области данных.

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

Эффективное использование вычислителей кривой и поверхности

Чтобы получать максимальную эффективность от кривой и поверхностных вычислителей, Вы должны многократно использовать AcGePointOnCurve2d, AcGePointOnCurve3d, и объекты AcGePointOnSurface в максимально возможной степени, когда Вы выполняете много оценок на той же самой кривой или поверхности. Например, предположите, что func1 и func2 и исполняют оценки на той же самой поверхности srf, и func1 вызывает func2. Тогда объект AcGePointOnSurface, что func1 использования для оценок нужно пройти к func2:

void func1 (const AcGeSurface& srf)

{

AcGePointOnSurface pntOnSrf (srf);

.

. // Evaluate some points and derivatives.

.

func2 ( pntOnSrf );

.

.

}

void func2 (AcGePointOnSurface& pntOnSrf)

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132