柴月二号 发表于 2019-10-18 01:54:03

请教前辈两线交点问题

现有p1 p2 p3 p4    p5
p1和p2 可以画一条线
p3和p4可以画一条线

p5为两线交点。

我想让p1 和p5 画一条线,p3和p5画一条线。
请教前辈,p5这点怎么求?

wyl219 发表于 2019-10-18 16:59:28

本帖最后由 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 15:40:16

本帖最后由 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)
)







WWYYBB1015 发表于 2019-10-18 12:27:07

(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)))

柴月二号 发表于 2019-10-18 01:55:06

前辈看到请留步指教

caoyin 发表于 2019-10-18 02:13:14

(inters p1 p2 p3 p4)

(inters p1 p2 p3 p4 nil)

查看inters函数帮助

柴月二号 发表于 2019-10-18 06:33:10

好的谢谢。。。。

柴月二号 发表于 2019-10-18 11:16:45

本帖最后由 柴月二号 于 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:17:37

本帖最后由 柴月二号 于 2019-10-18 11:20 编辑

http://www.mjtd.com/static/image/common/emp.gif小伙伴优化一下或者有更好的方法,一起来试试

669423907 发表于 2019-10-18 11:31:50

可以试一下直接0倒角

wyl219 发表于 2019-10-18 12:05:31

你这样做,画出来的其实是四条线,用倒角的方式是出两条线(PLINE对象倒角后就变成一条PLINE了),看你具体的需求是什么.
另外,建议用entmake或者entmod来代替command,会好用点.
再有,PLINE对象操作起来麻烦点,如果不是必须的,可以用line代替.

wyl219 发表于 2019-10-18 12:09:44

其实你可以说明白你的需求,或许有更好的解决流程,

柴月二号 发表于 2019-10-18 12:17:33

wyl219 发表于 2019-10-18 12:05
你这样做,画出来的其实是四条线,用倒角的方式是出两条线(PLINE对象倒角后就变成一条PLINE了),看你具体的需 ...

上面两个command句子去掉就不会是四条线了,这里有点多余,主要功能是代替外观交点。如果能拾取两个闭合图形边自动生成相交线就更方便了。
页: [1] 2 3
查看完整版本: 请教前辈两线交点问题