请教前辈两线交点问题
现有p1 p2 p3 p4 p5p1和p2 可以画一条线
p3和p4可以画一条线
p5为两线交点。
我想让p1 和p5 画一条线,p3和p5画一条线。
请教前辈,p5这点怎么求? 本帖最后由 wyl219 于 2019-10-18 17:12 编辑
(defun c:tt ()
(setq p1 (getpoint "\n请指定第一点:"))
(setq p2 (getpoint p1"\n请指定第二点:"))
(setq l1
(entmakex (list
(cons 0 "line")
(cons 10 p1)
(cons 11 p2))));生成辅助线
(setq p3 (getpoint "\n请指定第三点:"))
(setq p4 (getpoint p3"\n请指定第四点:"))
(setq l2 (entmakex (list
(cons 0 "line")
(cons 10 p3)
(cons 11 p4))));生成辅助线
(setq tp (inters p1 p2 p3 p4 nil))
(entdel l1)
(entdel l2);删除两个辅助线
(entmake
(list
(cons 0 "line")
(cons 10 (if (< (distance p1 tp) (distance p2 tp) )
p2
p1
));判断真正的起点
(cons 11 tp))
)
(entmake
(list
(cons 0 "line")
(cons 10 (if (< (distance p3 tp) (distance p4 tp) )
p4
p3
))
(cons 11 tp))
)
)
直接用上面获取的p1到p4生成后面的线,当四个点的选择顺序并不是从远离交点的顶点开始时,会出错,需要判断最远点.现在的代码如果两个线的交点在其中一条线上,那么就可能出现不符合意图的情况,这里是按照保留较长部分的,如果有需要,可以增加一个判断并提示用户选择.
如果是需要框两条直线并倒角,难度并不大,用(ssget '((0 . "line")))获取选择集,并判断选择集是否只有两个对象,之后用组码10和组码11(pline没有组码11,会麻烦些)代替上面的getpoint获取p1到p4,剩下的不用变.
如果需要框选多个直线就很麻烦了,因为你需要对对象排序,获取正确的对应关系.如果是两组平行线,建议用栏选来解决,能降低不小的难度..
本帖最后由 lisperado 于 2019-10-20 16:05 编辑
为避免画四条线,干嘛不用瞬态?
注意:inters函数只合适2D平面,如果四个点3D不同高度将无法得到交叉点?所以修改以下lisp所画的交点都只限于平面: (x y 0.0)
(defun c:tt (/ pt1 pt2 pt3 pt4 pt5 xy)
(defun xy (p)(mapcar '* '(1. 1.) p))
(and (setq pt1 (getpoint "\nFirst line\n1st point.. "))
(setq pt2 (getpoint "\n2nd point" pt1))
(not (grdraw pt1 pt2 2 1))
(setq pt3 (getpoint "\nSecond line\n1st point"))
(setq pt4 (getpoint "\n2nd point" pt3))
(not (grdraw pt3 pt4 2 1))
;;; (setq pt5 (inters pt1 pt2 pt3 pt4 nil))
(setq pt5 (apply 'inters (reverse (cons nil (mapcar 'xy (list pt4 pt3 pt2 pt1))))))
(foreach x (list pt1 pt3)
(entmakex
(cons '(0 . "LINE") (mapcar '(lambda (a b) (cons a (xy (trans b 1 0)) )) '(10 11) (list x pt5)))
)
)
)
(redraw)
(princ)
)
(setq pt1 (getpoint)
pt2 (getpoint)
pt3 (getpoint)
pt4 (getpoint)
pt5 (inters pt1 pt2 pt3 pt4))
;;只创建点,不显示点
(entmake
(list '(0 . "line")
(cons 10 pt1)
(cons 11 pt5)))
(entmake
(list '(0 . "line")
(cons 10 pt3)
(cons 11 pt5))) 前辈看到请留步指教 (inters p1 p2 p3 p4)
或
(inters p1 p2 p3 p4 nil)
查看inters函数帮助 好的谢谢。。。。 本帖最后由 柴月二号 于 2019-10-18 11:19 编辑
http://www.mjtd.com/static/image/common/emp.gif
(defun c:tt ()
(setq p1 (getpoint "\n请指定第一点:"))
(setq p2 (getpoint p1"\n请指定第二点:"))
(command "PLINE" p1 p2 "")
(setq p3 (getpoint "\n请指定第三点:"))
(setq p4 (getpoint p3"\n请指定第四点:"))
(command "PLINE" p3 p4 "")
(setq tp (inters p1 p2 p3 p4 nil))
(command "PLINE" p2 tp "")
(command "PLINE" p4 tp "")
) 本帖最后由 柴月二号 于 2019-10-18 11:20 编辑
http://www.mjtd.com/static/image/common/emp.gif小伙伴优化一下或者有更好的方法,一起来试试 可以试一下直接0倒角 你这样做,画出来的其实是四条线,用倒角的方式是出两条线(PLINE对象倒角后就变成一条PLINE了),看你具体的需求是什么.
另外,建议用entmake或者entmod来代替command,会好用点.
再有,PLINE对象操作起来麻烦点,如果不是必须的,可以用line代替. 其实你可以说明白你的需求,或许有更好的解决流程, wyl219 发表于 2019-10-18 12:05
你这样做,画出来的其实是四条线,用倒角的方式是出两条线(PLINE对象倒角后就变成一条PLINE了),看你具体的需 ...
上面两个command句子去掉就不会是四条线了,这里有点多余,主要功能是代替外观交点。如果能拾取两个闭合图形边自动生成相交线就更方便了。