找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1600|回复: 7

[研讨] 判断鼠标移动点是否从直线的一侧变成另一侧

[复制链接]

已领礼包: 27个

财富等级: 恭喜发财

发表于 2021-3-13 21:18:57 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 被承包的东子 于 2021-3-13 21:37 编辑

今天写了一个判断函数,用来判断一个鼠标点是否从直线的一侧移动到了另外一侧,写完了确实能达到效果,但是总感觉判断的逻辑太low,因为不知道怎么用准确的描述去搜索论坛里的做法,所以直接贴出来给各位看看,能不能帮我看看怎么改,或者怎么写才能简洁高效,谢谢
以下红代码就是一个判断过程,望各位帮帮忙改进下


(defun c:cs()
(vl-load-com)

(setq en(car (setq en_pt (entsel "\n选择一根直线"))) inpt (cadr en_pt ) ed (entget en))
(setq pt1 (cdr (assoc 10 ed)) pt2 (cdr (assoc 11 ed))  )
(setq mid_pt (mapcar '(lambda (x y) (* 0.5 (+ x y))) pt1 pt2)   )
(if (and pt1 pt2)
(progn
(setq ang_mi (angle pt1 pt2))
(if (< ang_mi pi)
(setq ang_l  ang_mi   ang_h (+ pi ang_mi))
(setq ang_l (-  ang_mi pi)   ang_h ang_mi)
)
(setq inpt2 (Polar mid_pt 0 1))
(setq en_lin2 (entmakex (list '(0 . "LINE") (cons 10 mid_pt) (cons 11 inpt2))))
(setq pt0 (getpoint "\n 点取直线的一侧")   )
(setq ed2 (entget en_lin2)   )
(setq   vlu 0 vlu_2 0)

(while
(and (setq gr (grread 5)) (= (car gr) 5))
(setq gr_pt (cadr gr) gr_ang (angle inpt gr_pt) )
(setq new_pt (cons 11 gr_pt))
(setq ed2 (subst new_pt (Assoc 11 ed2) ed2  ))
(entmod ed2)

(if (< vlu 1)
(cond
((and (< gr_ang ang_h ) (> gr_ang ang_l ))(setq vlu 1))
((or (> gr_ang ang_h ) (< gr_ang ang_l ))(setq vlu 2) )
)
(cond
((and (< gr_ang ang_h ) (> gr_ang ang_l ))(setq vlu_2 1))
((or (> gr_ang ang_h ) (< gr_ang ang_l ))(setq vlu_2 2))
)

)
)

(if (and (> vlu_2 0) (/= vlu_2  vlu))
(princ"\n鼠标点已经跨过直线!")
(princ"\n鼠标点没有跨过直线!")
)

;(princ vlu)
;(princ vlu_2)
(princ)
(entdel en_lin2)
)


)
(princ)
)


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

已领礼包: 3个

财富等级: 恭喜发财

发表于 2021-3-13 21:51:49 | 显示全部楼层
  1. ;;判断两点是否在曲线同侧
  2. ;@晨曦 2021.3
  3. ;输入参数:curve --- 曲线 图元名ENAME
  4. ;          p0    --- 已知的点
  5. ;          p     --- 需判断的点
  6. ;输出参数:1 --- p与p0在直线同一侧
  7. ;          0 --- p与p0不在直线同一侧
  8. (defun lineside(curve p0 p / re)
  9.          (if(null (inters p0 p (vlax-curve-getclosestpointto curve p0) (vlax-curve-getclosestpointto curve p)))
  10.                  ;同侧
  11.      (setq re 1)
  12.                  ;两侧
  13.      (setq re 0))
  14.         )
  15. )

  1. ;测试
  2. (defun c:tt(/)
  3.         (setq curve(car(entsel "选择一根直线")))
  4.         (setq p0(getpoint "\n 点取直线的一侧"))
  5.         (while (setq p(getpoint))
  6.                 (if (= (lineside curve p0 p) 1)
  7.                         (alert "同侧")
  8.                         (alert "异侧")
  9.                 )
  10.                 )
  11. )

点评

构思太妙了,不过有个小bug,如果第二个点与第一点的连线垂直于所选择的直线,那么判断就会出现错误,可能还要加个判断,我想了一个判断逻辑,但是还是不完美,不知道你有没有新的秒点子  详情 回复 发表于 2021-3-14 16:56
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 1 反对 0

使用道具 举报

已领礼包: 27个

财富等级: 恭喜发财

 楼主| 发表于 2021-3-14 16:56:58 | 显示全部楼层

构思太妙了,不过有个小bug,如果第二个点与第一点的连线垂直于所选择的直线,那么判断就会出现错误,可能还要加个判断,我想了一个判断逻辑,但是还是不完美,不知道你有没有新的秒点子
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2021-3-15 09:25:45 | 显示全部楼层
参考一下我这个帖子:
http://bbs.xdcad.net/thread-727744-1-1.html
  1. ;;;--------------------------------------------
  2. ;;;判断点在曲线方向(正方向、反方向、在曲线上)代码如下:
  3. ;;;适用包含直线、圆弧、样条曲线的任意曲线
  4. (defun PT-AtDirOfCurve (E P / P0 V)
  5.   (setq P0 (vlax-curve-getClosestPointTo E P)
  6.         V  (vlax-curve-getFirstDeriv E (vlax-curve-getParamAtPoint E P0))
  7.   )
  8.   (car (trans (mapcar '- P P0) 0 V))
  9. )

;;测试代码1
(defun C:TT1 (/ E GR1 GR2)
  (if (setq E (car (entsel "\n选择封闭曲线: ")))
    (while
      (progn
        (setq GR1 (grread T 15 0)
              GR2 (cadr GR1)
              GR1 (car GR1)
        )
        (if (or (= GR1 5) (= GR1 3))
          (if (> (PT-AtDirOfCurve E GR2) 0)
            (princ "\r在正方向")
            (princ "\r在反方向")
          )
        )
        (not (member GR1 '(3 11)))
      )
    )
  )
  (princ)
)
;;;--------------------------------------------

点评

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

使用道具 举报

已领礼包: 27个

财富等级: 恭喜发财

 楼主| 发表于 2021-3-15 10:56:14 | 显示全部楼层
Longfin 发表于 2021-3-15 09:25
参考一下我这个帖子:
http://bbs.xdcad.net/thread-727744-1-1.html

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

使用道具 举报

已领礼包: 756个

财富等级: 财运亨通

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

使用道具 举报

已领礼包: 146个

财富等级: 日进斗金

发表于 2021-4-12 07:50:54 | 显示全部楼层
不錯的程式 學習中 感謝樓主分享
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 756个

财富等级: 财运亨通

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-26 06:46 , Processed in 0.204554 second(s), 55 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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