doublejie 发表于 2002-5-23 10:30:00

求救:算法:已知...

已知两个AcDb2dPolyline线,求它们之间的最近距离;
请各位高手帮忙:)

icever 发表于 2002-5-24 08:38:00

:(

有点太难了,第一想到的是用扫描线,没再深想下去,你的问题没点别的限制了吗,把问题的背景说一说,也许有办法,或者是我太笨了 :)

doublejie 发表于 2002-5-25 15:39:00

呵呵:我已经想出来了,只是一个算法而已

1:首先计算了2个AcDb2dPolyline实体(特点:每一个实体只有2个顶点,在此,我称之为单位实体)之间的最小距离,这是很容易可以做到的。
2:2个普通的AcDb2dPolyline实体(不限制顶点数目)之间的最小距离,肯定落在2个单位实体之间。
3:普通实体是由单位实体组成,用一个2重循环就可以求的最小值了;

wxj351 发表于 2002-5-25 22:49:00

算法与程序见内

本帖最后由 wxj351 于 2002-5-25 22:49:24 编辑

AcGePoint3d pt11,pt12,pt21,pt22,pt31,pt32;

        AcDbLine* pLine1;       
        AcDbLine* pLine2;       

        //用户选择直线1       
        pLine1=selEnt();                       
        pt11=pLine1->startPoint();
        pt12=pLine1->endPoint();

        //用户选择直线2       
        pLine2=selEnt();               
        pt21=pLine2->startPoint();
        pt22=pLine2->endPoint();

        //直线3,新建一个与直线2平行且过直线1的起点
        AcDbLine* pClone = AcDbLine::cast(pLine2->clone());
        AcGeMatrix3d matClone;
        matClone.setCoordSystem(
                AcGePoint3d(pt11.x-pt21.x,pt11.y-pt21.y,pt11.z-pt21.z),
                AcGeVector3d(1,0,0),
                AcGeVector3d(0,1,0),
                AcGeVector3d(0,0,1));
        pClone -> transformBy(matClone);

        pt31=pClone->startPoint();
        pt32=pClone->endPoint();

        //用直线1,直线3建立一个平面
        AcGePlane *pPlane =new AcGePlane(pt11,pt12,pt32);

        //求得直线21与平面的距离,即空间异面直线的最短距离
        acutPrintf("\n%f",pPlane->signedDistanceTo(pt21));

        pLine1->unhighlight();
        pLine2->unhighlight();
       
        pLine1->close();
        pLine2->close();
        pClone->close();

icever 发表于 2002-5-26 11:50:00

对啊

是我想得太复杂了,呵呵呵......

    如果求解答案在可知的范围之内,穷举就能很简单地做出来.

wolfking 发表于 2002-7-29 09:29:00

严重错误

你还没有判断相交的情况

sinceret 发表于 2009-1-22 22:40:00

<p>在高等数学里有个坐标转换,</p><p>不知用雅克比行列式相关的知识加上求极值的方法能否可行</p>
页: [1]
查看完整版本: 求救:算法:已知...