本帖最后由 fools 于 2017-10-19 12:50 编辑
可先将空间点投影到平面上,再对共面的4点进行判断
2017.10.19修改了PtInTriangle,避免整数除整数出错
 - ;;;测试程序
- (defun c:tt (/ A B C P)
- (setq A '(0 0 0)
- B '(10 0 -7)
- C '(5 10 15)
- P '(5 5 3)
- )
- (if (PtInTriangle (ClosestPointonPlane P A B C) A B C)
- (alert "点在三角形内")
- (alert "点在三角形外")
- )
- (princ)
- )
- ;;;http://www.blackpawn.com/texts/pointinpoly/default.html
- ;;;重心法判别点是否在三角形内
- (defun PtInTriangle (p pa pb pc / DENO U V V0 V1 V2 VV00 VV01 VV02 VV11 VV12)
- (setq v0 (MAT:v-v pc pa))
- (setq v1 (MAT:v-v pb pa))
- (setq v2 (MAT:v-v p pa))
- (setq vv00 (MATDOT v0 v0))
- (setq vv01 (MATDOT v0 v1))
- (setq vv02 (MATDOT v0 v2))
- (setq vv11 (MATDOT v1 v1))
- (setq vv12 (MATDOT v1 v2))
- (setq deno (- (* vv00 vv11) (* vv01 vv01)))
- (setq u (/ (- (* vv11 vv02) (* vv01 vv12)) deno 1.0))
- (setq v (/ (- (* vv00 vv12) (* vv01 vv02)) deno 1.0))
- (if (and (>= u 0) (>= v 0) (<= (+ u v) 1))
- T
- nil
- )
- )
- ;;;https://www.theswamp.org/index.php?topic=36786.0
- ;;;获取平面中距离空间点最近的点(空间点到平面的垂点)
- (defun ClosestPointonPlane (pt p1 p2 p3)
- ((lambda (n) (setq pt (trans pt 0 n)) (trans (list (car pt) (cadr pt) (caddr (trans p1 0 n))) n 0))
- (MAT:vxv (MAT:v-v p2 p1) (MAT:v-v p3 p1))
- )
- )
- ;;;向量差
- (defun MAT:v-v (v1 v2) (mapcar '- v1 v2))
- ;;;向量点积
- (defun MATDOT (v1 v2) (apply '+ (mapcar '* v1 v2)))
- ;;;向量叉积
- (defun MAT:vxv (u v)
- (list (- (* (cadr u) (caddr v)) (* (cadr v) (caddr u)))
- (- (* (car v) (caddr u)) (* (car u) (caddr v)))
- (- (* (car u) (cadr v)) (* (car v) (cadr u)))
- )
- )
- (princ)
|