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;
}

posted @ 2020-09-16 19:41  Craftsman-lee  阅读(567)  评论(0)    收藏  举报