AcGeLineSeg3d::intersectWith中的错误
嗨,我使用Autocad已经有几天了,但是我刚刚发现了一个错误。
这是关于函数intersectWith。
如果我得到两个线段,它们有一个共同点,这个函数有时返回true,有时返回false。
下面是一个例子。我得到第一段是[ 300.0 0.0 0.0] ,另一段是 。当我用在区间内变化的间隙做一段时间,用比值1/10^10,res有时为真(相交),有时为假(不相交)。
AcGePoint3d pt 1 ADL(0.00000000,0.0000000+gap,0.00000000);
acgepoint 3d pt 1 bdl(100.0000000,0.0000000,0.0000000);
AcGePoint3d pt 2 ADL(300.00000000,0.00000000,0.0000000);
AcGePoint3d pt 2 bdl(100.00000000,0.00000000,0.0000000);
AcGeLineSeg3d lSeg1dl(pt1Adl,pt 1 bdl);
AcGeLineSeg3d lSeg2dl(pt2Adl,pt 2 bdl);
RES = lseg 1 dl . intersect with(lseg 2 dl,ptInsd1,tol);
这很奇怪。我使用tol=0.1的公差,有时是0.01。有人(数学家)能帮我理解这是怎么回事吗?
预先感谢任何帮助
**** Hidden Message ***** 不是错误。
您的线是平行的,因此唯一可能的交点是终点相交的地方。 可能我写得不对。我再说一遍
如果间隙>0,间隙非常小,即使它们在(100:0)中相交,我也不会得到任何交点
之后,从另一个间隙开始,报告线再次相交
我的误解是为什么intersectWith报告在小间隔内没有相交。
关于使用并行测试的想法,这里有一个我写的测试函数。
奇怪,对我来说,它返回不同的结果!有一些情况是报告的线是平行的,同时它们有一个共同点!
请问有人测试一下吗?
bool
my func(acgelineseg 3d x,AcGeLineSeg3d y,AcGeTol tol)
{
acgevector 3d v1 = x . endpoint()。asVector() - x.startPoint()。as vector();
AcGeVector3d v2 = y.endPoint()。asVector() - y.startPoint()。as vector();
acgevector 3d nul vec = acgevector 3d::kid entity;
v1 . normalize();
v2 . normalize();
acgevector 3d sum = v1+v2;
acgevector 3d dif = v1-v2;
AcGeTol zeroTol
zero tol . setequalpoint(0.0);
zero tol . setequalvector(0.0);
if((sum = = nul vec)| |(dif = = nul vec))
返回false
//if(sum . is equal to(nul vec,zeroTol) dif.isEqualTo(nulvec,zeroTol))
//返回true
返回!(v1.isParallelTo(v2,tol));
}
void acgelineseg 3d test::intersection()
{
AcGeTol tell;
double dtold = 0.1
tell . setequalpoint(dtold);
//tell . set equal point(1.0);
tell . setequalvector(dtold);
//tell . setequalvector(0.01);
AcGePoint3d ptInsd1
Adesk::Boolean retdx = Adesk::k true,ret D1 = Adesk::k true;
double deltad = 1e-5,gap = 0.0
无符号long long x=0,NN = 100000
x = NN
while(x -!= 1)
{
acgepoint 3d pt 1 ADL(0.0,0.0+gap,0.0);
AcGePoint3d pt1Bdl(100.0,0.0,0.0);
AcGePoint3d pt2Adl(0.0,0.0,0.0);
AcGePoint3d pt2Bdl(100.0,0.0,0.0);
AcGeLineSeg3d lSeg1dl(pt1Adl,pt 1 bdl);
AcGeLineSeg3d lSeg2dl(pt2Adl,pt 2 bdl);
retdx = lseg 1 dl . intersect with(lseg 2 dl,ptInsd1,tell);
retd1 = myfunc(lSeg1dl,lSeg2dl,tell);
如果((retd1!= retdx))
break;
gap+= deltad;
//pt1Ad.set(pt1Ad.x+gap,pt1Ad.y,pt1ad . z);
//lSeg1d.set(pt1Ad,pt1Bd);
}
CPPUNIT_ASSERT(!x);
x = NN
while(x -!= 1)
{
acgepoint 3d pt 1 ADL(0.00000000,0.0000000+gap,0.0000000);
acgepoint 3d pt 1 bdl(100.0000000,0.0000000,0.0000000);
AcGePoint3d pt 2 ADL(300.00000000,0.00000000,0.0000000);
AcGePoint3d pt 2 bdl(100.00000000,0.00000000,0.0000000);
AcGeLineSeg3d lSeg1dl(pt1Adl,pt 1 bdl);
AcGeLineSeg3d lSeg2dl(pt2Adl,pt 2 bdl);
ret D1 = lseg 1 dl . intersect with(lseg 2 dl,ptInsd1,tell);
retdx = myfunc(lSeg1dl,lSeg2dl,tell);
if(retdx!= ret D1)
break;
gap+= deltad;
//pt1Ad.set(pt1Ad.x+gap,pt1Ad.y,pt1ad . z);
//lSeg1d.set(pt1Ad,pt1Bd);
}
CPPUNIT_ASSERT(!x);
返回;
没有太多时间玩...做了一个快速测试(A2010),你的代码没有返回任何交集-如果可以的话,稍后会尝试。 没有错误,我贴了一张图片。:生气:
谢谢。在我的一个测试中,它会返回不同的结果。
页:
[1]