找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 921|回复: 3

[求助]:如何判定某点是否在某一封闭区域内?

[复制链接]
发表于 2003-8-22 17:10:10 | 显示全部楼层 |阅读模式

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

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

×
MFC里CRgn倒是有这种函数,arx里有类似函数吗?
或者有什么算法吗?
事实我是想找到包围某个点的所有封闭区域,当然这里区域的对象已生成了(如所有是封闭的地方都已生polyline)。我怎样找到包围这个点的那些polyline?
是否可以通过选择集的方式实现?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 145个

财富等级: 日进斗金

发表于 2003-8-22 17:12:46 | 显示全部楼层

Re: [求助]:如何判定某点是否在某一封闭区域内?

最初由 catwang_G 发布
[B]MFC里CRgn倒是有这种函数,arx里有类似函数吗?
或者有什么算法吗?
事实我是想找到包围某个点的所有封闭区域,当然这里区域的对象已生成了(如所有是封闭的地方都已生polyline)。我怎样找到包围这个点的那些polyline... [/B]


用合适的关键字,搜索ARX论坛,论坛讨论过,并给出代码的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-8-22 17:29:45 | 显示全部楼层
根据本网站提供链接:http://www.xdcad.net/forum/showt ... d=399478#post399478
提供的算法,我写的代码如下:
/*
算法的伪代码如下:
1. count ← 0;
2. 以P为端点,作从右向左的射线L;
3, for 多边形的每条边s
4. do if P在边s上
5. then return true;
6. if s不是水平的
7. then if s的一个端点在L上且该端点是s两端点中纵坐标较大的端点
9. then count ← count+1
10. else if s和L相交
11. then count ← count+1;
12. if count mod 2 = 1
13. then return true
14. else return false;
其中做射线L的方法是:设P'的纵坐标和P相同,横坐标为正无穷大(很大的一个正数),
则P和P'就确定了射线L。这个算法的复杂度为O(n)。
*/

//判断点是否在多边形的范围内
bool IsPtInPolyline(AcDbPolyline* polyline,AcGePoint3d pt)
{
        static double TOLERANCE1 =0.000001 ;//误差范围,只对本函数起作用
        if(polyline==NULL)
                return false ;
        AcGeRay3d pRay(pt,-AcGeVector3d::kXAxis) ;//射线
        AcGeTol tol;
        tol.setEqualPoint(TOLERANCE1);//设置精度

        int count(0) ;
        int numverts = polyline->numVerts() ;
        for(int i=0;i<numverts;i++)
        {
                if(polyline->segType(i)==AcDbPolyline::kLine)//直线
                {
                        AcGeLineSeg3d plineseg ;
                        if(polyline->getLineSegAt(i,plineseg)!=Acad::eOk)
                                continue ;
                        if(plineseg.isOn(pt,tol)==Adesk::kTrue)//在此边上
                                return true ;
                        AcGeVector3d vec = plineseg.direction() ;
                        if(vec.isParallelTo(AcGeVector3d::kXAxis)==Adesk::kTrue)//与X轴平行
                                continue ;
                        AcGePoint3d pntSt = plineseg.startPoint() ;
                        AcGePoint3d pntEnd = plineseg.endPoint() ;
                        if(pntSt.distanceTo(pt)<TOLERANCE1&&pntSt.y>pntEnd.y)//与起点重合
                                count++ ;//加1
                        else if(pntEnd.distanceTo(pt)<TOLERANCE1&&pntEnd.y>pntSt.y)
                                count++ ;//加1
                        else if(pRay.distanceTo(plineseg)<TOLERANCE1)//和射线相交
                                count++ ;
                }
                else if(polyline->segType(i)==AcDbPolyline::kArc)//圆弧
                {
                        AcGeCircArc3d arc;
                        if(polyline->getArcSegAt(i,arc)!=Acad::eOk)
                                continue ;
                        if(arc.isOn(pt,tol)==Adesk::kTrue)//在此边上
                                return true ;
                        AcGePoint3d pntSt = arc.startPoint() ;
                        AcGePoint3d pntEnd = arc.endPoint() ;
                        if(pntSt.distanceTo(pt)<TOLERANCE1&&pntSt.y>pntEnd.y)//与起点重合
                                count++ ;//加1
                        else if(pntEnd.distanceTo(pt)<TOLERANCE1&&pntEnd.y>pntSt.y)
                                count++ ;//加1
                        else if(pRay.distanceTo(arc)<TOLERANCE1)//和射线相交
                                count++ ;
                }
        }
        if(count%2==1)//为奇数
                return true ;
        return false ;
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-11-15 11:59:10 | 显示全部楼层
老大..你哪里搞的代码啊..语法问题太严重了吧...搞的自己要看半天才能搞定..
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-28 15:19 , Processed in 0.239911 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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