llsheng_73 发表于 2014-1-14 10:50:07

两位高手的切磋让我看得眼花脖子酸,把这一句最关键的(trans (mapcar '- p p1) 0 (mapcar '- p2 p1))抱走了

highflybir 发表于 2014-1-14 16:02:34

我也来一段代码,速度似乎快一点:
(defun LINE:P-t (p p1 p2 / a b c)
(setq a (distance p1 p2))
(setq b (distance p p1))
(setq c (distance p p2))
(> (* a a) (abs (* (+ b c) (- b c))))
)

自贡黄明儒和Qjchen的速度差不多。

自贡黄明儒 发表于 2014-1-14 16:18:21

本帖最后由 自贡黄明儒 于 2014-1-14 16:58 编辑

highflybir 发表于 2014-1-14 16:02 http://bbs.mjtd.com/static/image/common/back.gif
我也来一段代码,速度似乎快一点:
(defun LINE:P-t (p p1 p2 / a b c)
(setq a (distance p1 p2))


大师又出马了
前面求三边长a b c ,highflybir就是高

highflybir 发表于 2014-1-14 18:47:27



如果定义了 Line:angle函数

(defun Line:Angle (P0 P1 P2 / an)
(setq an (abs (- (angle p0 P1) (angle P0 P2))))
(if (> an pi)
    (- (+ pi pi) an)
    an
)
)


那么下面的代码速度也还不错:

(defun LINE:p-t-2 (p p1 p2 / a)
(and
    (< (Line:angle P1 P0 P2) (* pi 0.5))
    (< (Line:angle P2 P0 P1) (* pi 0.5))
)
)


cnks 发表于 2014-1-14 19:28:30

为什么狂刀怎么结了婚就消失了?

自贡黄明儒 发表于 2014-1-15 08:50:40

highflybir 发表于 2014-1-14 18:47 static/image/common/back.gif
如果定义了 Line:angle函数




那么这样也行呀
;;(perIn2p (getpoint) (getpoint)(getpoint))
(defun perIn2p (P p1 p2)
(setq pt (mapcar '+ (MAT:Rot90 (mapcar '- p1 p2)) p));highflybir论矩阵
(setq pt (inters p1 p2 p pt nil));垂点
(equal (+ (distance p1 pt) (distance p2 pt)) (distance p1 p2) 1e-8)
)

自贡黄明儒 发表于 2014-1-15 08:53:17

本帖最后由 自贡黄明儒 于 2014-1-15 13:07 编辑

qjchen 发表于 2014-1-13 12:24 http://bbs.mjtd.com/static/image/common/back.gif
挺好的代码啊,建议代码不长的话,直接贴出代码会否更好些。

假如不考虑直线实体,只考虑 p点投影是否在 ...

不考虑直线实体,适于任何曲线了,这具有重要意义,楼主可以把直线改为曲线了
;;164.47.2 [功能] pt到曲线的垂点不在延长线上,返回T
;;(HH:perPtIn (getpoint) (car(entsel)))
(defun HH:perPtIn (p curve / P1 P2 PA)
(setq p1 (vlax-curve-getClosestPointTo curve p))
(setq pa (vlax-curve-getParamAtPoint curve P1))            ;参数
(setq p2 (mapcar '+ (vlax-curve-getFirstDeriv curve pa) p1)) ;切线上一点
(equal (caddr (trans (mapcar '- p p1) 0 (mapcar '- p2 p1))) 0 1e-5)
)

edata 发表于 2014-1-15 12:12:13

初步测试总结:
以下个人观点,仅供参考,如有疑问,不要找我。
一楼可以,
二楼要改1e-5 为1e-8才准一点
三楼可以
八楼 垂点在端点无效
十二楼 还在测试,有时候可以,有时候垂点在直线端点无效。
十四楼,貌似也是垂点在直线端点无效
十六楼 可以
十七楼 改1e-5 为1e-8才准一点
补上十四楼笔误

[*]http://bbs.mjtd.com/source/plugin/imc_colorcode/images/jssc_none.gif(defun LINE:p-t-2 (p0 p1 p2 / a) ;第一参数与下面的取值变量不一致p改p0或p0改p

[*]http://bbs.mjtd.com/source/plugin/imc_colorcode/images/jssc_none.gif(and

[*]http://bbs.mjtd.com/source/plugin/imc_colorcode/images/jssc_none.gif    (< (Line:angle P1 P0 P2) (* pi 0.5))

[*]http://bbs.mjtd.com/source/plugin/imc_colorcode/images/jssc_none.gif    (< (Line:angle P2 P0 P1) (* pi 0.5))

[*]http://bbs.mjtd.com/source/plugin/imc_colorcode/images/jssc_none.gif)

[*]

http://bbs.mjtd.com/source/plugin/imc_colorcode/images/jssc_none.gif)
十六楼缺少的函数(defun MAT:Rot90 (vec)
(vl-list* (- (cadr vec)) (car vec) (cddr vec))
)

老大的鸭梨 发表于 2014-12-25 12:09:11

为嘛不用osnap?

老大的鸭梨 发表于 2014-12-25 12:11:19

各位大神,不好意思,唐突了,我小白一个 。osnap可以取到垂足的点。。。
页: 1 [2] 3
查看完整版本: 通用函数 【点到直线垂足是否在直线上】