你好
假设两个平面之间的角度等于这些平面法向量之间的三维角度,我认为这应该是一种更容易处理的方法。
以下是“AnglePlanePlane”例程使用的一些几何例程(可能有用),该例程需要每个平面的单个单位法向量作为参数。
- ;; AnglePlanePlane
- ;; Returns the angle (radians) between two planes (using Al Kashi theorem)
- ;; the returned angle is always between 0 and pi radians
- ;;
- ;; Arguments: the single unit normal vectors of the planes
- (defun AnglePlanePlane (nor1 nor2)
- ((lambda (d)
- (acos (/ (- 2 (* d d)) 2))
- )
- (distance nor1 nor2)
- )
- )
- ;;; Acos
- ;;; Returns the Arc Cosine of number
- ;;;
- ;;; Argument: a number between -1 and 1
- (defun acos (num)
- (cond
- ((equal num 1 1e-9) 0.0)
- ((equal num -1 1e-9) pi)
- ((< -1 num 1)
- (atan (sqrt (- 1 (expt num 2))) num)
- )
- )
- )
- ;; CrossProduct
- ;; Returns the cross product (vector) of two vectors
- ;;
- ;; Arguments: two vectors
- (defun CrossProduct (v1 v2)
- (list (- (* (cadr v1) (caddr v2)) (* (caddr v1) (cadr v2)))
- (- (* (caddr v1) (car v2)) (* (car v1) (caddr v2)))
- (- (* (car v1) (cadr v2)) (* (cadr v1) (car v2)))
- )
- )
- ;; Normalize
- ;; Returns the single unit vector of a vector
- ;;
- ;; Argument : un vecteur
- (defun Normalize (v)
- ((lambda (l)
- (if (/= 0 l)
- (mapcar (function (lambda (x) (/ x l))) v)
- )
- )
- (distance '(0 0 0) v)
- )
- )
- ;; Norm_3Points
- ;; Returns the single unit normal vector of a plane definedby 3 points
- ;;
- ;; Arguments: three points
- (defun norm_3pts (p0 p1 p2)
- (Normalize (CrossProduct (mapcar '- p1 p0) (mapcar '- p2 p0)))
- )
这是一个测试命令,提示用户在每个平面上指定3个点,并在命令行上以当前角度单位返回结果。
- (defun c:test (/ a)
- (if (vl-catch-all-error-p
- (setq a
- (vl-catch-all-apply
- '(lambda (/ p1 p2 p3 p4 p5 p6)
- (setq p1 (getpoint "\nFirst point on first plane: ")
- p2 (getpoint p1 "\nSecond point on first plane: ")
- p3 (getpoint p1 "\nThird point on first plane: ")
- p4 (getpoint "\nFirst point on second plane: ")
- p5 (getpoint p4 "\nSecond point on second plane: ")
- p6 (getpoint p4 "\nThird point on second plane: ")
- )
- (princ
- (strcat
- "\nAngle beween planes = "
- (angtos
- (AnglePlanePlane (norm_3pts p1 p2 p3) (norm_3pts p4 p5 p6))
- )
- )
- )
- )
- )
- )
- )
- (princ (strcat "\nerror: " (vl-catch-all-error-message a)))
- )
- (princ)
- )
|