本帖最后由 qjchen 于 2011-3-17 07:24 编辑
如gu_xl版主所说,两根不相交的空间直线要投影到某个平面上才可以求夹角,立体几何中是这么定义的
下面的代码利用矢量点乘的方法,计算空间(也可以是平面上的)两直线间的交角,没有太多的容错
较短的写法如下
- ;;;Two line angle
- (defun q:geo:2line:ang2(p1 p2 p3 p4)
- ((lambda(x) (atan (sqrt (- 1.0 (* x x))) x))
- (/ (apply '+ (mapcar '* (mapcar '- p2 p1) (mapcar '- p4 p3))) (distance p1 p2) (distance p3 p4))
- )
- )
- ;;;test
- (q:geo:2line:ang2 (setq p1 (list 0 0 0)) (setq p2 (list 1 1 1))(setq p3 (list 0 1 0))(setq p4 (list 1 0 0)))
比较清晰的写法如下(都一样的)
- ;;;Arccos
- (defun acos(z)
- (atan (sqrt (- 1.0 (* z z))) z)
- )
- ;;;;vec dot product
- (defun q:vec:dot*(v1 v2)
- (apply '+ (mapcar '* v1 v2))
- )
- ;;; Two line angle
- (defun q:geo:2line:ang(p1 p2 p3 p4)
- (acos (/ (q:vec:dot* (mapcar '- p2 p1) (mapcar '- p4 p3)) (distance p1 p2) (distance p3 p4)) )
- )
- ;;;test
- (q:geo:2line:ang (setq p1 (list 0 0 0)) (setq p2 (list 1 1 1))(setq p3 (list 0 1 0))(setq p4 (list 1 0 0)))
|