AcGePoint2d
AcGeCurve2d::evalPoint(double param) const;
AcGePoint2d
AcGeCurve2d::evalPoint(
double param, int numDeriv,
AcGeVector2dArray& derivArray) const;
AcGePoint3d
AcGeCurve3d::evalPoint(double param) const;
AcGePoint3d
AcGeCurve3d::evalPoint(
double param, int numDeriv,
AcGeVector3dArray& derivArray) const;
Вырождение
Некоторые операции могут приводить к созданию выродившихся примитивов. Выродившееся означает, что, хотя заканчивающийся объект принадлежит специфическому классу, его геометрия больше не может соответствовать требованиям того класса. Например, если Вы начинаете с круговой дуги и затем устанавливаете ее угол начала, равняются ее конечному углу, Вы фактически имеете точку вместо круговой дуги. Геометрически, объект - точка, но ее тип во время выполнения - все еще круговая дуга. Вы можете использовать один из isDegenerate () функции, чтобы определить, является ли объект выродившимся. Первая версия каждой пары функций возвращает тип. Вторая версия возвращает невыродившийся объект различного типа во время выполнения. В предыдущем примере, это возвратило бы точку:
Adesk::Boolean
AcGeCurve2d::isDegenerate(
AcGe::EntityId& degenerateType,
const AcGeTol&=AcGeContext::gTol) const;
Adesk::Boolean
AcGeCurve2d::isDegenerate(
AcGeEntity2d*& pConvertedEntity,
const AcGeTol&=AcGeContext::gTol) const;
Adesk::Boolean
AcGeCurve3d::isDegenerate(
AcGe::EntityId& degenerateType,
const AcGeTol&=AcGeContext::gTol) const;
Adesk::Boolean
AcGeCurve3d::isDegenerate(
AcGeEntity3d*& pConvertedEntity,
const AcGeTol&=AcGeContext::gTol) const;
Поверхности
Ориентацию поверхности частично определяют ее оцененные нормальные векторы.
Параметрическая поверхность имеет два параметра, u и v, каждое представляет направление параметрических линий на поверхности. Если Вы берете векторное произведение u касательного вектора и v касательного вектора в той же самой точке, Вы получаете вектор, который является нормальным к поверхности. Этот вектор - естественная нормаль поверхности в той точке. Вы можете полностью изменять ориентацию поверхности, вызывая следующую функцию:
AcGeSurface&
AcGeSurface::reverseNormal()
Поверхностный вычислитель возвращает или естественную нормаль или ее инверсию, в зависимости от того, был ли reverseNormal () вызван четный или нечетное число времен. Следующая функция возвращает значение "ИСТИННО", если ориентация поверхности - напротив естественной ориентации:
Adesk::Boolean
AcGeSurface::isNormalReversed() const
Этот пример создает круг и проектирует это на план XY. Тип проектируемого примитива тогда проверен, чтобы видеть какой примитив, в который это проектировалось:
AcGePlane plane; // Constructs XY-plane.
AcGePoint3d p1(2,3,5);
AcGeVector3d v1(1,1,1);
AcGeCircArc3d circ (p1, v1, 2.0);
AcGeEntity3d *projectedEntity = circ. project(plane, v1);
if (projectedEntity->type() == AcGe::kEllipArc3d)
...
else if (projectedEntity->type() == AcGe::kCircArc3d)
...
else if (projectedEntity->type() == AcGe::kLineSeg3d)
...
Следующий пример создает НЕОДНОРОДНЫЙ РАЦИОНАЛЬНЫЙ В-СПЛАЙН, изгибают, и находит самую близкую точку на кривой к сути p1. Самая близкая точка возвращена как объект AcGePointOnCurve3d, от которого координаты и значение параметра получены:
AcGeKnotVector knots;
AcGePoint3dArray cntrlPnts;
AcGePointOnCurve3d pntOnCrv;
AcGePoint3d p1(1,3,2);
knots. append (0.0);
knots. append (0.0);
knots. append (0.0);
knots. append (0.0);
knots. append (1.0);
knots. append (1.0);
knots. append (1.0);
knots. append (1.0);
cntrlPnts. append (AcGePoint3d(0,0,0));
cntrlPnts. append (AcGePoint3d(1,1,0));
cntrlPnts. append (AcGePoint3d(2,1,0));
cntrlPnts. append (AcGePoint3d(3,0,0));
AcGeNurbCurve3d nurb (3, knots, cntrlPnts);
nurb. getClosestPointTo(p1,pntOnCrv);
p2 = pntOnCrv. point();
double param = pntOnCrv. parameter();
Классы 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 класса следуют за тем же самым образцом наличия трех различных сигнатур:
|
Из за большого объема этот материал размещен на нескольких страницах:
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 |


