santalin 发表于 2012-2-26 17:38:51

求写一函数判断两点是否在曲线同一侧

(defun curve-pt-side (entcurve pt1 pt2)

)

如果是同一侧返回T

求解啊!!!

Gu_xl 发表于 2012-2-26 21:42:37


(defun curvesidep (curve p1 p2 / a b)
(setq a (vlax-curve-getclosestpointto curve p1)
        b (vlax-curve-getclosestpointto curve p2)
        )
(not (inters a b p1 p2 ) )
)
;;;测试
(defun c:tt(/ curve p1 p2)
(while (not (setq curve (car (entsel "\n**选择曲线:")))))
(while (not (setq p1 (getpoint "\n 第一点:"))))
(while (not (setq p2 (getpoint "\n 第二点:"))))
(if (curvesidep curve p1 p2)
    (princ "\n两点在曲线同侧.")
    (princ "\n两点在曲线两侧.")
    )
(princ)
)

cabinsummer 发表于 2012-2-26 22:57:25

Gu_xl 发表于 2012-2-26 21:42 static/image/common/back.gif



顾版程序不完全正确,拿此图形一试便知。曲线选spline,两点选直线的端点。

caoyin 发表于 2012-2-27 00:50:32

本帖最后由 caoyin 于 2012-2-27 01:40 编辑

参考:
http://space.mjtd.com/blog-213172-306.html

(lt:curve-getDistancePtTo ENTCURVE PT1)
(lt:curve-getDistancePtTo ENTCURVE PT2)
以上2者返回,如果同为正值或同为负值则表明2点在曲线的同一侧,反之则在不同侧

santalin 发表于 2012-2-27 13:12:33

多谢各位高手的热心回答!

Gu_xl 发表于 2012-2-27 16:39:10

本帖最后由 Gu_xl 于 2012-2-27 19:06 编辑

cabinsummer 发表于 2012-2-26 22:57 static/image/common/back.gif
顾版程序不完全正确,拿此图形一试便知。曲线选spline,两点选直线的端点。
修改了下,再测试下这个!

;;;判断两点是否曲线同侧
(defun curvesidep(curve p1 p2 / a a1 b b1 a2 b2)
(cond ((equal p1
(setq a (vlax-curve-getclosestpointto curve p1))
1e-6
) ;_ p1在曲线上的最近点
nil
)
((equal p2
(setq b (vlax-curve-getclosestpointto curve p2))
1e-6
) ;_ p2在曲线上的最近点
nil
)
(t
(setq a1   (mapcar '+
       a
       (vlax-curve-getFirstDeriv
         curve
         (vlax-curve-getParamAtPoint curve a)
       )
      ) ;_ p1在曲线上最近点的切线方向点
      ang1 (+ (* 0.5 pi) (angle a a1)) ;_ p1在曲线上最近点的法线方向
      a2   (inters a a1 p1 (polar p1 ang1 1) nil) ;_ p1在曲线上的垂足点
      b1   (mapcar '+
       b
       (vlax-curve-getFirstDeriv
         curve
         (vlax-curve-getParamAtPoint curve b)
       )
      ) ;_ p2在曲线上最近点的切线方向点
      ang2 (+ (* 0.5 pi) (angle b b1)) ;_ p2在曲线上最近点的法线方向
      b2   (inters b b1 p2 (polar p2 ang2 1) nil) ;_ p2在曲线上的最近点
)
(if (> ang1 (* pi 2))
    (setq ang1 (- ang1 pi pi))
)
(if (> ang2 (* pi 2))
    (setq ang2 (- ang2 pi pi))
)
(equal (equal ang1 (angle a2 p1) 1e-6)
(equal ang2 (angle b2 p2) 1e-6)
)
)
)
)


fxxpleasure 发表于 2013-3-8 12:33:31

Gu_xl 发表于 2012-2-27 16:39 static/image/common/back.gif
修改了下,再测试下这个!

谢谢版主,借用了。

zwf100 发表于 2022-5-29 10:56:20

版主威武
页: [1]
查看完整版本: 求写一函数判断两点是否在曲线同一侧