找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 610|回复: 1

[研讨] XDGE几何库应用 ---- 判断两曲线位置关系(5种)

[复制链接]

已领礼包: 51个

财富等级: 招财进宝

发表于 2017-2-13 20:07:34 | 显示全部楼层 |阅读模式

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

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

×
使用ARX的几何库 AcGeCurveCurveInt3d 类 判断曲线位置关系,两曲线的交点关系有如下可能:
1、相交 2、相离 3、内部 4、外部、5、相贴


AcGe::AcGeXConfig Enum
AcGeXConfig
NameDeclared ValueDescription
kNotDefined1 << 0
kUnknown1 << 1
kLeftRight1 << 2
kRightLeft1 << 3
kLeftLeft1 << 4
kRightRight1 << 5
kPointLeft1 << 6
kPointRight1 << 7
kLeftOverlap1 << 8
kOverlapLeft1 << 9
kRightOverlap1 << 10
kOverlapRight1 << 11
kOverlapStart1 << 12
kOverlapEnd1 << 13
kOverlapOverlap1 << 14


通过图示说明下

曲线位置关系.png

通过使用AcGeCurveCurveInt3d类下的getIntConfigs方法,下面写个判断两曲线关系的函数。

(defun XD::Curve:Relation (e1 e2 / config config1 g1 g2 gint i numints pos1
                              pos2 ret tf
                          )
  (if (and
        (setq g1 (xdge::Constructor e1))
        (setq g2 (xdge::Constructor e2))
        (setq gint (xdge::Constructor "kCurveCurveInt3d" g1 g2))
      )
    (progn
      (setq numints (xdge::getpropertyvalue gint "numintpoints"))
      (cond
        ((= numints 0)
          (cond
            ((xdrx_curve_isclosed e1)
              (if (xdrx_curve_isinside e1 e2)
                (setq ret "Outside")
                (progn
                  (if (xdrx_curve_isclosed e2)
                    (if (xdrx_curve_isinside e2 e1)
                      (setq ret "Inside")
                      (setq ret "Disjoint")
                    )
                    (setq ret "Disjoint")
                  )
                )
              )
            )
            (t
              (setq ret "Disjoint")
            )
          )
        )
        ((> numints 0)
          (setq tf t
                i 0
          )
          (setq config1 (xdge::getpropertyvalue gint "getintconfigs" 0 t)
                pos1 (car (xdrx_string_regexps "(?<=k)[a-zA-Z]+(?=overlap)"
                                               (car config1)
                          )
                     )
          )
          (while (and
                   tf
                   (< i numints)
                 )
            (setq config (xdge::getpropertyvalue gint "getintconfigs" i t))
            (setq i (1+ i))
            (setq pos2 (car (xdrx_string_regexps "(?<=koverlap)[a-zA-Z]+"
                                                 (car config)
                            )
                       )
            )
            (if (or
                  (and
                    (xdrx_string_regexps "right" (car config))
                    (xdrx_string_regexps "left" (car config))
                  )
                  (and
                    pos2
                    (/= pos2 "Overlap")
                    (/= pos1 pos2)
                  )
                )
              (progn
                (setq tf nil
                      ret "Intersect"
                )
              )
            )
          )
          (if (not ret)
            (setq ret "Overlap")
          )
        )
      )
    )
  )
  ret
)


曲线位置关系.gif


测试命令TT

(defun c:tt ()
  (if (and (setq e1 (car (entsel)))
           (setq e2 (car (entsel)))
      )
    (progn
      (setq pos (XD::Curve:Relation e1 e2))
      (cond
        ((= pos "Inside")
         (xdrx_prompt "\n曲线1在曲线2内部!")
        )
        ((= pos "Outside")
         (xdrx_prompt "\n曲线1在曲线2外部!")
        )
        ((= pos "Intersect")
         (xdrx_prompt "\n曲线1和曲线2相交!")
        )
        ((= pos "Disjoint")
         (xdrx_prompt "\n曲线1和曲线2相离!")
        )
        ((= pos "Overlap")
         (xdrx_prompt "\n曲线1和曲线2相贴!")
        )
      )
    )
  )
  (princ)
)



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

已领礼包: 58个

财富等级: 招财进宝

发表于 2017-8-29 14:18:22 | 显示全部楼层
本帖最后由 brainstorm 于 2017-8-29 14:25 编辑

帖子真好 正慢慢读懂
下图两曲线判断为相交?应该是相贴吧

intersection.png
intersection 02.png

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 01:02 , Processed in 0.390143 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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