明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2797|回复: 3

如何判断一个点是否在一条直线上?

[复制链接]
发表于 2006-11-4 12:09:00 | 显示全部楼层 |阅读模式

已知点、线,

有无函数可以判断该点是否在这条线段上,

或者求出点到这条线段的距离的函数或者方法

发表于 2006-11-4 20:19:00 | 显示全部楼层
<RE class=prog_in_0>Acad::ErrorStatus</PRE><RE class=prog_in_0>AsdkPoly::intersectWith(</PRE><RE class=prog_in_0>    const AcDbEntity* ent,</PRE><RE class=prog_in_0>    AcDb::Intersect intType,</PRE><RE class=prog_in_0>    const AcGePlane&amp; projPlane,</PRE><RE class=prog_in_0>    AcGePoint3dArray&amp; points,</PRE><RE class=prog_in_0>    int /*thisGsMarker*/,</PRE><RE class=prog_in_0>    int /*otherGsMarker*/) const</PRE><RE class=prog_in_0>{</PRE><RE class=prog_in_0>    assertReadEnabled();</PRE><RE class=prog_in_0>    Acad::ErrorStatus es = Acad::eOk;</PRE><RE class=prog_in_0>    if (ent == NULL)</PRE><RE class=prog_in_0>        return Acad::eNullEntityPointer;</PRE><RE class=prog_in_0></PRE><RE class=prog_in_0>    // The idea is to intersect each side of the polygon</PRE><RE class=prog_in_0>    // with the given entity and return all the points.</PRE><RE class=prog_in_0>    // </PRE><RE class=prog_in_0>    // For non-R12-entities, with intersection methods defined,</PRE><RE class=prog_in_0>    // we call that method for each of the sides of the polygon. </PRE><RE class=prog_in_0>    // For R12-entities, we use the locally defined intersectors,</PRE><RE class=prog_in_0>    // since their protocols are not implemented.</PRE><RE class=prog_in_0>    //</PRE><RE class=prog_in_0>    if (ent-&gt;isKindOf(AcDbLine::desc())) {</PRE><RE class=prog_in_0>        if ((es = intLine(this, AcDbLine::cast(ent),</PRE><RE class=prog_in_0>            intType, &amp;projPlane, points)) != Acad::eOk)</PRE><RE class=prog_in_0>        {</PRE><RE class=prog_in_0>            return es;</PRE><RE class=prog_in_0>        }</PRE><RE class=prog_in_0>    } else if (ent-&gt;isKindOf(AcDbArc::desc())) {</PRE><RE class=prog_in_0>        if ((es = intArc(this, AcDbArc::cast(ent), intType,</PRE><RE class=prog_in_0>            &amp;projPlane, points)) != Acad::eOk)</PRE><RE class=prog_in_0>        {</PRE><RE class=prog_in_0>            return es;</PRE><RE class=prog_in_0>        }</PRE><RE class=prog_in_0>    } else if (ent-&gt;isKindOf(AcDbCircle::desc())) {</PRE><RE class=prog_in_0>        if ((es = intCircle(this, AcDbCircle::cast(ent),</PRE><RE class=prog_in_0>            intType, &amp;projPlane, points)) != Acad::eOk)</PRE><RE class=prog_in_0>        {</PRE><RE class=prog_in_0>            return es;</PRE><RE class=prog_in_0>        }</PRE><RE class=prog_in_0>    } else if (ent-&gt;isKindOf(AcDb2dPolyline::desc())) {</PRE><RE class=prog_in_0>        if ((es = intPline(this, AcDb2dPolyline::cast(ent),</PRE><RE class=prog_in_0>            intType, &amp;projPlane, points)) != Acad::eOk)</PRE><RE class=prog_in_0>        {</PRE><RE class=prog_in_0>            return es;</PRE><RE class=prog_in_0>        }</PRE><RE class=prog_in_0>    } else if (ent-&gt;isKindOf(AcDb3dPolyline::desc())) {</PRE><RE class=prog_in_0>        if ((es = intPline(this, AcDb3dPolyline::cast(ent),</PRE><RE class=prog_in_0>            intType, &amp;projPlane, points)) != Acad::eOk)</PRE><RE class=prog_in_0>        {</PRE><RE class=prog_in_0>            return es;</PRE><RE class=prog_in_0>        }</PRE><RE class=prog_in_0>    } else {</PRE><RE class=prog_in_0>        AcGePoint3dArray vertexArray;</PRE><RE class=prog_in_0>        if ((es = getVertices3d(vertexArray))</PRE><RE class=prog_in_0>            != Acad::eOk)</PRE><RE class=prog_in_0>        {</PRE><RE class=prog_in_0>            return es;</PRE><RE class=prog_in_0>        }</PRE><RE class=prog_in_0>        if (intType == AcDb::kExtendArg</PRE><RE class=prog_in_0>            || intType == AcDb::kExtendBoth)</PRE><RE class=prog_in_0>        {</PRE><RE class=prog_in_0>            intType = AcDb::kExtendThis;</PRE><RE class=prog_in_0>        }</PRE><RE class=prog_in_0>        AcDbLine *pAcadLine;</PRE><RE class=prog_in_0></PRE><RE class=prog_in_0>        for (int i = 0; i &lt; vertexArray.length() - 1; i++) {</PRE><RE class=prog_in_0>            pAcadLine = new AcDbLine();</PRE><RE class=prog_in_0>            pAcadLine-&gt;setStartPoint(vertexArray);</PRE><RE class=prog_in_0>            pAcadLine-&gt;setEndPoint(vertexArray[i + 1]);</PRE><RE class=prog_in_0>            pAcadLine-&gt;setNormal(normal());</PRE><RE class=prog_in_0>            if ((es = ent-&gt;intersectWith(pAcadLine, intType,</PRE><RE class=prog_in_0>                projPlane, points)) != Acad::eOk)</PRE><RE class=prog_in_0>            {</PRE><RE class=prog_in_0>                delete pAcadLine;</PRE><RE class=prog_in_0>                return es;</PRE><RE class=prog_in_0>            }</PRE><RE class=prog_in_0>            delete pAcadLine;</PRE><RE class=prog_in_0>        }</PRE><RE class=prog_in_0></PRE><RE class=prog_in_0>        // All the points that we selected in this process are on</PRE><RE class=prog_in_0>        // the other curve; we are dealing with apparent</PRE><RE class=prog_in_0>        // intersection. If the other curve is 3D or is not</PRE><RE class=prog_in_0>        // on the same plane as poly, the points are not on</PRE><RE class=prog_in_0>        // poly.</PRE><RE class=prog_in_0>        // </PRE><RE class=prog_in_0>        // In this case, we need to do some more work. Project the</PRE><RE class=prog_in_0>        // points back onto the plane. They should lie on</PRE><RE class=prog_in_0>        // the projected poly. Find points on real poly</PRE><RE class=prog_in_0>        // corresponding to the projected points.</PRE><RE class=prog_in_0>        //</PRE><RE class=prog_in_0>        AcGePoint3d projPt, planePt;</PRE><RE class=prog_in_0>        AcGePoint3dArray pts;</PRE><RE class=prog_in_0>        AcGeLine3d line;</PRE><RE class=prog_in_0>        </PRE><RE class=prog_in_0>        AcGePlane polyPlane;</PRE><RE class=prog_in_0>        AcDb::Planarity plnrty;</PRE><RE class=prog_in_0>        getPlane(polyPlane,plnrty);</PRE><RE class=prog_in_0></PRE><RE class=prog_in_0>        for (i = 0; i &lt; points.length(); i++) {</PRE><RE class=prog_in_0>            // Define a line starting from the projPt and</PRE><RE class=prog_in_0>            // along the normal.  Intersect the polygon with</PRE><RE class=prog_in_0>            // that line. Find all the points and pick the</PRE><RE class=prog_in_0>            // one closest to the given point.</PRE><RE class=prog_in_0>            //</PRE><RE class=prog_in_0>            projPt = points.orthoProject(projPlane);</PRE><RE class=prog_in_0>            line.set(projPt, projPlane.normal());</PRE><RE class=prog_in_0></PRE><RE class=prog_in_0>            if ((es = intLine(this, line, pts))</PRE><RE class=prog_in_0>                != Acad::eOk)</PRE><RE class=prog_in_0>            {</PRE><RE class=prog_in_0>                return es;</PRE><RE class=prog_in_0>            }</PRE><RE class=prog_in_0></PRE><RE class=prog_in_0>            planePt = projPt.project(polyPlane,</PRE><RE class=prog_in_0>                projPlane.normal());</PRE><RE class=prog_in_0>            points = pts[0];</PRE><RE class=prog_in_0>            double length = (planePt - pts[0]).length();</PRE><RE class=prog_in_0>            double length2;</PRE><RE class=prog_in_0></PRE><RE class=prog_in_0>            for (int j = 1; j &lt; pts.length(); j++) {</PRE><RE class=prog_in_0>                if ((length2 = (planePt - pts[j]).length())</PRE><RE class=prog_in_0>                    &lt; length)</PRE><RE class=prog_in_0>                {</PRE><RE class=prog_in_0>                    points = pts[j];</PRE><RE class=prog_in_0>                    length = length2;</PRE><RE class=prog_in_0>                }</PRE><RE class=prog_in_0>            }</PRE><RE class=prog_in_0>        }</PRE><RE class=prog_in_0>    }</PRE><RE class=prog_in_0>    return es;</PRE><RE class=prog_in_end_0>}</PRE><RE class=prog_in_end_0> </PRE>
发表于 2006-11-4 20:39:00 | 显示全部楼层

已知点、线求距离

double length;

AcGePoint2d Pt;

AcGeCurve2d *ent2d;

length = ent2d->distanceTo(Pt,AcGeContext::gTol);

 楼主| 发表于 2006-11-6 12:45:00 | 显示全部楼层

我想用distanceTo(Pt,AcGeContext::gTol);来计算距离

可是我的线,点都是AcDb类型的不能用

如何才能将AcDb类型的线,点转化为AcGe类型呢?

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 21:51 , Processed in 0.158761 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表