greatvictory 发表于 2011-9-26 14:33:29

有函数可以求点在直线上的垂足吗?

如果用数学来算那么会有误差,怎么能做到每误差?
另外我想问一下,在下面这个循环中为什么point_x会随着e2的改变而改变,即使没有重复执行赋值的语句?
(repeat (sslength test)
                  (setq e2 (entget (ssname test l)))
                  (setq e2_x1 (cadr (assoc 10 e2)))
                  (setq e2_x2 (cadr (assoc 11 e2)))
                  (setq e2_y1 (caddr (assoc 10 e2)))
                  (setq e2_y2 (caddr (assoc 11 e2)))
                  (if (= e2_x1 e2_x2)
                  (if (= point_x nil)
                      (setq point_x (list (cadr (assoc 10 e2)) centre_y))
                  )
                  )
                  (if (= e2_y1 e2_y2)
                  (if (= point_y nil)
                      (setq point_y (list centre_x (caddr (assoc 10 e2))))
                  )
                  )
                  (setq l (+ l 1))
                )
          )          

cabinsummer 发表于 2011-9-26 21:04:04

本帖最后由 cabinsummer 于 2011-9-26 21:04 编辑

(defun c:per(/ el obj cp ep)
(if (and (setq el (car (entsel "\n请选择直线:")))(= (cdr (assoc 0 (entget el))) "LINE"))
    (progn
      (setq obj (vlax-ename->vla-object el))
      (if (setq ep (getpoint "\n请选择点:"))
      (setq cp (vlax-curve-getClosestPointTo obj ep T));;;就是这一句求垂足
      )
    )
)
(princ cp)
(princ)
)

Gu_xl 发表于 2011-9-26 21:24:14


;;;计算cp到p1 p2的垂足点
(defun PerToLine(cp p1 p2 / norm)

(setq        norm (mapcar '- p2 p1)

        p1   (trans p1 0 norm)

        cp   (trans cp 0 norm)

        )

(trans (list (car p1) (cadr p1) (caddr cp)) norm 0)

)

cnks 发表于 2011-10-6 01:14:29

Gu_xl 发表于 2011-9-26 21:24 static/image/common/back.gif


这一看就是算法牛人

millermin 发表于 2012-6-22 08:15:15

(trans p1 0 norm)
请问这句这么理解?norm是一个点,在这里代表什么?谢谢。

hhbhyt 发表于 2012-6-22 16:21:06

这一看就是算法牛人

guohq 发表于 2012-8-14 12:24:16

(defun GetFootPoint1 (Pt PtA PtB / X1 Y1 X2 Y2 X3 Y3 AA BB CC DD EE FF XX YY)
;直线方程的一般形式 AX + BY+ C= 0
;Pt为第三点 Pt3
;PtA PtB 为直线上的两个点

    (setq X1 (* 1.0 (nth 0 PtA))Y1 (* 1.0 (nth 1 PtA)))
    (setq X2 (* 1.0 (nth 0 PtB))Y2 (* 1.0 (nth 1 PtB)))
    (setq X3 (* 1.0 (nth 0 Pt ))Y3 (* 1.0 (nth 1 Pt )))

    ;(y2 - y1) X + (x1 - x2) Y = x1y2 - x2y1
    ;(x2 - x1) X + (y2 - y1) Y = x2x3 - x1x3 + y2y3 - y1y3

    (setq AA(- Y2 Y1)BB (- X1 X2)CC (- (* X1 Y2) (* X2 Y1)))
    (setq DD(- X2 X1)EE (- Y2 Y1)FF (- (+ (- (* X2 X3) (* X1 X3)) (* Y2 Y3)) (* Y1Y3)))

   
    ;构成行列式
    ; |A B|   |X|   |C|
    ; |   | * | | = | |
    ; |D E|   |Y|   |F|

    (setq XX (/ (- (* CC EE) (* BB FF))    (- (* AAEE) (* BB DD))))
    (setq YY (/ (- (* AA FF) (* CC DD))    (- (* AAEE) (* BB DD))))
    (list XX YY)
    )

guohq 发表于 2012-8-14 12:25:02

(defun GetFootPoint2(Pt A B C / X3 Y3 AA BB CC DD EE FF XX YY)
;直线方程的一般形式 AX + BY+ C= 0
;Pt为第三点 Pt3
;方程1 AX + BY =-C
;方程2 BX - AY = BX3 - AY3

(setq X3 (* 1.0 (nth 0 Pt)) Y3 (* 1.0 (nth 1 Pt)))
(setq AA (* 1.0 A)BB (* 1.0 B)    CC (* -1.0 C))
(setq DD (* 1.0 B)EE (* -1.0 A)   FF (-(* BB X3) (* AA Y3)))

(setq XX (/ (- (* CC EE) (* BB FF))    (- (* AAEE) (* BB DD))))
(setq YY (/ (- (* AA FF) (* CC DD))    (- (* AAEE) (* BB DD))))
(list XX YY)
)

dajio 发表于 2013-5-29 17:05:54

millermin 发表于 2012-6-22 08:15 static/image/common/back.gif
(trans p1 0 norm)
请问这句这么理解?norm是一个点,在这里代表什么?谢谢。

代表的是目标坐标系的Z轴正方向

guankuiwu 发表于 2021-12-26 15:19:38

学习了!!
页: [1] 2
查看完整版本: 有函数可以求点在直线上的垂足吗?