Revit二次开发知识分享(三) 判断点是否在一个闭合轮廓内

由于现在API没有提供此类的判断。因此,只能我们自己去封装一个方法去使用。
先上代码后讲解,Just Do It!!!

 public static bool IsInsideOutline(this XYZ TargetPoint,List<Line> lines)
        {
            bool result = true;
            int insertCount = 0;
            Line rayLine = Line.CreateBound(TargetPoint, TargetPoint.Add(XYZ.BasisX*1000)).SetZ(0);
            foreach (var areaLine in lines)
            {
                var interResult = areaLine.SetZ().Intersect(rayLine, out IntersectionResultArray resultArray);
                var insPoint = resultArray?.get_Item(0);
                if (insPoint != null)
                {
                    insertCount++;
                }
            }
            //如果次数为偶数就在外面,次数为奇数就在里面
            if (insertCount % 2 == 0)//偶数
            {
                return result = false;
            }
            return result;
        }

用的是几何的线相交的知识,通过以目标点往x轴一个方向做延长线,再判断与这一个闭合轮廓的线相交的情况,通过相交点的数量来最终得出是否在这个闭合轮廓内。下面附上两张图,大家可以理解了。
在这里插入图片描述
交点有两个,和2取余数等于0,因此判断为外面。
在这里插入图片描述
交点有三个,因此,在轮廓里面。

最终结论是,当交点数为奇数时,说明点在这个轮廓内。这里有需要注意的地方是,这一条线必须是完全穿过这个轮廓的,而且在revit中得到的线不是一定在同一个平面中,因此我在方法中用了SetZ()方法,是把线放到同一个平面上,是一个自己封装的方法,大家可以自己封装一个就好。如果确定在同一平面上那就可以不用封装这一个方法。这就是这次的分享,谢谢大家。有什么疑问和问题可以直接私信我,我看到会回复的。

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

baobao熊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值