找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 719|回复: 1

[每日一码] 点是否在曲线内部(考虑了自交的曲线)

[复制链接]

已领礼包: 13个

财富等级: 恭喜发财

发表于 2018-1-31 10:13:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
[C#] 纯文本查看 复制代码
public static void testPointInside(Point3d inPt, ObjectId objid)
{
    Database db = HostApplicationServices.WorkingDatabase;
    Document doc = acadApp.DocumentManager.MdiActiveDocument;
    Editor ed = doc.Editor;
    using (Transaction tr = db.TransactionManager.StartTransaction())
    {
        Polyline pPoly = tr.GetObject(objid, OpenMode.ForRead, false) as Polyline;
        if (pPoly is Polyline)
        {
            if (!pPoly.Closed)
            {
                ed.WriteMessage("\n*** Curve is not closed. "); return;
            }
            Point3dCollection points = new Point3dCollection();
            pPoly.IntersectWith(pPoly, Intersect.OnBothOperands, points, 0, 0);
            if (!points.Count.Equals(pPoly.NumberOfVertices))
            {
                ed.WriteMessage("\n*** Curve self intersect!"); return;
            }
            else
            {
                Point3d P = new Point3d();
                P = Ucs2Wcs(inPt);
                Point3d ClosestPoint = pPoly.GetClosestPointTo(P, false);
                if (P.IsEqualTo(ClosestPoint))
                {
                    ed.WriteMessage("\n*** Point is on curve. "); return;
                }
                Double ClosestParam, EndParam;
                ClosestParam = pPoly.GetParameterAtPoint(ClosestPoint);
                ClosestPoint = Wcs2Ucs(ClosestPoint);
                EndParam = pPoly.EndParam;
                Double Param1 = 0.0, Param2 = dVal, Deflection = 0.0, a2;
                Point3d StartPT = pPoly.StartPoint;
                StartPT = Wcs2Ucs(StartPT);
                Double a1 = Math.Atan2(StartPT.Y - inPt.Y, StartPT.X - inPt.X);
                while (Param2 <= EndParam)
                {
                    Param2 = Math.Min(Param2, EndParam);
                    if (Param1 < ClosestParam && ClosestParam < Param2)
                    {
                        a2 = Math.Atan2(ClosestPoint.Y - inPt.Y, ClosestPoint.X - inPt.X);
                        Deflection = Deflection + delta(a1, a2);
                        a1 = a2;
                    }
                    bool test = true;
                    while (test)
                    {
                        try
                        {
                            P = pPoly.GetPointAtParameter(Param2);
                            Param2 = Param2 + dVal;
                        }
                        catch (System.Exception ex)
                        {
                            ed.WriteMessage("\nERROR = " + ex.Message);
                        }
                        finally
                        {
                            test = false;
                        }
                    }
                    P = Wcs2Ucs(P);
                    a2 = Math.Atan2(P.Y - inPt.Y, P.X - inPt.X);
                    Deflection = Deflection + delta(a1, a2);
                    a1 = a2;
                    Param1 = Param2;
                    Param2 = Param2 + dVal;
                }
                if (Math.Abs(Deflection) > 4)
                    ed.WriteMessage("\n*** Point is inside. ");
                else
                    ed.WriteMessage("\n*** Point is outside. ");
            }
        }
        tr.Commit();
    }
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 3256个

财富等级: 富可敌国

发表于 2018-3-25 13:36:09 | 显示全部楼层
大哥 少了几个函数呀?
1、 Wcs2Ucs 世界左边转换到用户坐标函数
2、 dVal 变量不存在
3、 delta变量不存在
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-17 20:45 , Processed in 0.222806 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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