在NX二次开发中,并没有直接的函数判断两条曲线是否重合,那么我们自己有没有办法判断两条曲线是否重合呢,自然是有的,那么首先我们得定义一下什么叫做重合,几乎重合的曲线算重合吗,这里就涉及到一个容忍度的问题。
我这里采用一个并不是严格判断重合的办法,但是日常用问题不大。
思路就是对两条曲线分别采样,当采样点的距离接近的时候认为两条曲线重合,否则认为不重合,注意因为曲线的方向可能不同,所以要正反两个方向采样,只要有一个方向满足条件,则认为两条曲线重合,具体代码如下,仅供参考。
//author:autumoon
//邮箱:9506@163.com
//日期:2023-07-06
bool IsTwoCurvesCoincide(Curve *ipCurveF, Curve *ipCurveS, int inSamplePtCount /*= 5*/, double dTolerance /*= 0.001*/)
{
if (ipCurveF == nullptr || ipCurveS == nullptr || inSamplePtCount < 2 || dTolerance < 0.0)
{
return false;
}
double dSampleProp = 1.0 / (inSamplePtCount - 1);
AUTUMOONMathPoint3d ptF1, ptS1;
AUTUMOONMathVector3d vecF1, vecS1;
bool bPosTest = true;
for (double dSamplePos = 0.0; dSamplePos < 1.0; dSamplePos += dSampleProp)
{
AUTUMOONNXCurve::AskCurveProps(ipCurveF->Tag(), dSamplePos, &ptF1, &vecF1);
AUTUMOONNXCurve::AskCurveProps(ipCurveS->Tag(), dSamplePos, &ptS1, &vecS1);
if (ptF1.Distance(ptS1) > dTolerance || !vecF1.IsParallel(vecS1, dTolerance))
{
bPosTest = false;
break;
}
}
bool bNegTest = true;
if (!bPosTest)
{
for (double dSamplePos = 0.0; dSamplePos < 1.0; dSamplePos += dSampleProp)
{
AUTUMOONNXCurve::AskCurveProps(ipCurveF->Tag(), 1.0 - dSamplePos, &ptF1, &vecF1);
AUTUMOONNXCurve::AskCurveProps(ipCurveS->Tag(), dSamplePos, &ptS1, &vecS1);
if (ptF1.Distance(ptS1) > dTolerance || !vecF1.IsParallel(vecS1, dTolerance))
{
bNegTest = false;
break;
}
}
}
return bPosTest || bNegTest;
}
项目原因部分不重要的代码实现无法公开,可以自己考虑实现,或者查阅资料,调用UG自带的函数。
欢迎交流与讨论。