Поверхности
Ориентацию поверхности частично определяют ее оцененные нормальные векторы.
Параметрическая поверхность имеет два параметра, 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();