找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1636|回复: 11

[求助] [求助]:怎样判断一个封闭图形中是否包含其它图形?

[复制链接]
发表于 2002-4-22 22:20:12 | 显示全部楼层 |阅读模式

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

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

×
怎样判断一个封闭图形中是否包含其它图形?用LISP怎样实现?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2002-4-23 06:09:24 | 显示全部楼层

方法

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-4-23 06:20:23 | 显示全部楼层

Re: [求助]:[求助]:怎样判断一个封闭图形中是否包含其它图形?

最初由 saintdog 发布
[B]怎样判断一个封闭图形中是否包含其它图形?用LISP怎样实现? [/B]


一个方法:

假如两个图形1、2,要测试2是否在1中:

把两个图形转换为REGION,然后求“并”,判断“并”后的REGION的面积是否和1的REGION相等,如等,2就在1中了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-4-24 01:13:56 | 显示全部楼层

XDSOFT:你出了个好主意!谢啦!另一个问题——

在ACAD中,HATCH命令也是用这种方法进行判断吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-4-24 01:15:35 | 显示全部楼层

XDSOFT:你出了个好主意!谢啦!另一个问题——

在ACAD中的HATCH命令也是用这种方法进行判断哪些需要填充吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-4-24 01:27:55 | 显示全部楼层

Re: XDSOFT:你出了个好主意!谢啦!另一个问题——

最初由 saintdog 发布
[B]在ACAD中的HATCH命令也是用这种方法进行判断哪些需要填充吗? [/B]


肯定不是,他们肯定会用更“低级”的图形算法,比如我们用REGION,他们完全可以从REGION的实现直接写,而不比生成REGION。

其实ARX提供了更多的方法判断是否相交的

比如:

数据库实体类的:
   AcDbEntity::intersectWith 求实体交点
     AcDbEntity::boundingBoxIntersectWith  求包围盒交点
   
几何类的: AcGeBoundedPlane::intersectWith 求有届平面交点
另外几何类对于任何一个单独的子类比如园、椭圆...都提供了求交的方法。

所以,若使用ARX开发,会有许多方法供我们选择的。很多问题,都可以构造出你的实体相对应的对象的几何数据模型,然后这个几何类就会提供大量的“图形学”算法。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-4-24 02:10:27 | 显示全部楼层

Re: Re: [求助]:[求助]:怎样判断一个封闭图形中是否包含其它图形?

最初由 XDSoft 发布
[B]

一个方法:

假如两个图形1、2,要测试2是否在1中:

把两个图形转换为REGION,然后求“并... [/B]


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

使用道具 举报

发表于 2002-4-24 02:18:57 | 显示全部楼层

Re: 方法

最初由 raven 发布
[B]ssget "wp" [/B]


这是一个好办法, 把外面的线变成 n 个紧紧相连的点.n的取值可当作参数来应用.

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-4-24 02:41:21 | 显示全部楼层

Re: Re: 方法

最初由 长清 发布
[B]

这是一个好办法, 把外面的线变成 n 个紧紧相连的点.n的取值可当作参数来应用.

关键函数.
vlax-curve-getpointatparam [/B]


修改下,直接求曲线上的每个点,效率不太高,这和精度有关,有时候图形还有较大的突变等等
用这个方法,XDRX_API的函数xdrx_getsamplept 可以方便得到“样本点”,可以给等分数或者玄高差参数,在这个应用里面,建议用玄高差参数做,这样能保证“突变”的情况。

但是上面的方法有局限性,就是只能对曲线进行操作。

下面说下更通用的方法(可以适合任何实体):

就是求实体的“包围盒”,然后求包围盒矩形框的四个顶点是否在一个图形内就可以了。这个方法效率高,大多数情况下都可以正确求得。

XDRX_API解决函数:

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-4-24 02:42:57 | 显示全部楼层

xdrx_getsamplept

89. xdrx_getsamplept

功能:按给定精度,返回AcDbCurve类曲线和AcDb2dPolyline(旧的POLYLINE)的样本点。将复杂的曲线用点组成的线段模拟。

调用格式:(xdrx_getsamplept <AcDbCurve 或 AcDb2dPolyline实体图元名> [精度控制])

说明:给定的[精度控制]值玄高差越小,精度越高,分段数越大,精度越高。
      
     精度控制只对曲线段有效,对于POLYLINE,对直线段无效,对其中的ARC段数据起做用。
  
     若不给[精度控制]参数,那么程序自己计算出相对满足视觉误差的值做为玄高差进行分段。

     [精度控制]:分两种方法
      1:给整数,按给定的整数分曲线段
      2:给实数,做为玄高差
     
     注意:对于AcDbSpline,只能给定"玄高差",若给整数值,那么程序按照计算的相对最优值做为玄高差。

返回值:若成功,返回点表,点表肯定包括曲线的开始点和终止点。(p1 p2......),失败返回NIL.

示例:用LINE模拟SPLINE
     (if (setq en (xdrx_entsel "\n请点取一个Spline<退出>:") '((0 . "spline"))))
        (progn
        (setq ed (xdrx_getsamplept (car en)))
        (apply 'command (cons "line" ed))
        (command "")
     )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-4-24 02:45:21 | 显示全部楼层
对于求内部多个图形的选择集是否在一个图形内的方法:

下面的函数是求“轮廓”

145. xdrx_searchoutline

功能:求给定选择集内的实体的连通区域的最大轮廓

调用格式:(xdrx_searchoutline <选择集> <宽度>)
         (xdrx_searchoutline <block实体名> <宽度>)
         (xdrx_searchoutline <hatch实体名> <宽度>)

说明:适用任意实体,及其由任意实体生成的BLOCK
     生成的任意比例的INSERT或嵌套的INSERT.

返回值:若不给宽度参数,则返回最大轮廓线的顶点表,可能有多个边界。
       若给宽度,且>=0 ,若找出,则用LWPOLYLINE创建最大轮廓线.返回T


或者使用 xdrx_entity_box 得到选择集的BOX,然后用

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

使用道具 举报

发表于 2002-4-24 09:29:41 | 显示全部楼层

Re: Re: 方法

最初由 长清 发布
[B]

这是一个好办法, 把外面的线变成 n 个紧紧相连的点.n的取值可当作参数来应用.

关键函数.
vlax-curve-getpointatparam [/B]


saintdog 的意思很明确,外面的东西不是矩形,因此,模拟矩形BOX的思路是解决“大多数”问题的快捷方法,但是,当曲线区域是接近45度的长宽比比较大的斜东西时,偏差太大,如果再变化一下,曲线的走势变化太大,BOX方法就很难解决问题,下图是两种情况的图样。
另外,一般情况下,如果用求曲线参数点的方法,我们可以用精度值来控制 n 的大小,比如,做测量图时,以m=10m为精度,那么,一条边界长为1000m的区域的 n 值可以这样确定,n=1000/10=100,于是,边界越长,N 越大。实际情况是,当我们得出的 n 小于500时,程序运行是很快的,如果程序中不在循环中用 求 n ,即不是计算多个区域,将是很快的。 从实际运行来看,如果控制n的大小在200以内,在计算N时的时间大约只有5 %,在SSGET时,速度和过滤条件的复杂程度成反比,不细说了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 20:10 , Processed in 0.369835 second(s), 54 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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