Opencascade等分曲线
//通过Geom_Curve和等分点数来等分圆锥曲线,本文是等分椭圆
//等分的点数
int nDivide = nPoint;
Handle(Geom_Curve) geomCurve;
try
{
OCC_CATCH_SIGNALS
myEllipse aEllipse(...)
//椭圆的中心
gp_Pnt center(aEllipse.center.x, aEllipse.center.y, aEllipse.center.z);
//构造过原点的轴axis
gp_Ax1 axis(gp_Pnt(0, 0, 0), gp_Dir(0, 0, 1));
//构造向量vec,并旋转angle弧度,angle是椭圆和水平轴的角
double angle = aEllipse.angle / 180.0 * M_PI;
gp_Vec vec(1, 0, 0);
vec.Rotate(axis, angle);
//构造过椭圆中心,法向和z正方向一致,x方向为gp_Dir(vec)的轴axis2
gp_Ax2 axis2(center, gp_Dir(0, 0, 1), gp_Dir(vec));
//构造椭圆
GC_MakeEllipse ellips(gp_Elips(axis2, aEllipse.lradius, aEllipse.sradius));
geomCurve = ellips.Value();
//曲线的起始参数
double firstParameter = geomCurve->FirstParameter();
//曲线的终止参数
double lastParameter = geomCurve->LastParameter();
//计算整段曲线的参数
double Delta = lastParameter - firstParameter;
//计算等分后每一段的参数跨度
Delta = Delta / (nDivide - 1);
int i = 0;
double u = 0.0;
for (u = firstParameter, i = 1; i <= nDivide; i++, u += Delta)
{
//计算每个等分点的世界坐标
gp_Pnt point = geomCurve->Value(u);
Eigen::Vector3d vec(point.X() , point.Y(), point.Z());
vecPoints.push_back(vec);
}
}
catch (Standard_Failure const& exception)
{
Standard_SStream stream;
stream << "An exception was caught: " << exception << std::ends;
}

浙公网安备 33010602011771号