My old program to create a matrix of reflection, an arbitrary plane.
You may need...
(defun v_norm_2v (v1 v2)
;; ElpanovEvgeniy
;; 10.01.07
;; Функция вычисления вектора нормали по двум векторам
;; The function calculating the normal vector of two vectors
;; (v_norm_2v v1 v2)
;; (v_norm_2v '(5. 10. 0.) '(1. 2. 3.))
((lambda (a b)
(mapcar (function (lambda (a1 b1 a2 b2) (- (* a1 b1) (* a2 b2)))) a (cdr b) b (cdr a))
) ;_ lambda
(list (cadr v1) (caddr v1) (car v1) (cadr v1))
(list (cadr v2) (caddr v2) (car v2) (cadr v2))
)
)
(defun vxv (v1 v2) (apply (function +) (mapcar (function *) v1 v2)))
(defun mxv (m v) (mapcar (function (lambda (r) (vxv r v))) m))
(defun Matrix-Symmetry-Plane (vpt v / P V1)
;|
;; ElpanovEvgeniy
;; 08.10.06
;; Вычисление матрицы (4*4) симметрии точки, относительно плоскости
;; заданной точкой и вектором нормали
vpt - точка на плоскости для симметрии
v - вектор нормали к плоскости для симметрии
;; ElpanovEvgeniy
;; 08.10.06
,; Calculation of the matrix (4 * 4) symmetry points in the plane
,; Given point and normal vector
vpt - a point on the plane for symmetry
v - vector normal to the plane of symmetry for
(setq vpt '(1. 2. 3.)
v '(1. 1. 0.)
)
(Matrix-Symmetry-Plane vpt v)
(Matrix-Symmetry-Plane '(-1. 0. 0.) '(1. 1. 0.))
|;
(setq v1 (vxv v v))
(mxm (list (list 1. 0. 0. (car vpt))
(list 0. 1. 0. (cadr vpt))
(list 0. 0. 1. (caddr vpt))
'(0. 0. 0. 1.)
) ;_ list
(mxm (list (list (/ (apply (function +) (mapcar (function *) v v '(-1. 1. 1.))) v1)
(/ (* -2. (car v) (cadr v)) v1)
(/ (* -2. (car v) (caddr v)) v1)
0.
) ;_ list
(list (/ (* -2. (car v) (cadr v)) v1)
(/ (apply (function +) (mapcar (function *) v v '(1. -1. 1.))) v1)
(/ (* -2. (cadr v) (caddr v)) v1)
0.
) ;_ list
(list (/ (* -2. (car v) (caddr v)) v1)
(/ (* -2. (cadr v) (caddr v)) v1)
(/ (apply (function +) (mapcar (function *) v v '(1. 1. -1.))) v1)
0.
) ;_ list
'(0. 0. 0. 1.)
) ;_ list
(list (list 1. 0. 0. (- (car vpt)))
(list 0. 1. 0. (- (cadr vpt)))
(list 0. 0. 1. (- (caddr vpt)))
'(0. 0. 0. 1.)
) ;_ list
) ;_ multiply-matrix
) ;_ multiply-matrix
) ;_ defun
test:
(defun test-mirror (/ L M P1 P2 P3)
;;(test-mirror)
(setq l (vl-remove-if (function listp) (mapcar (function cadr) (ssnamex (ssget))))
p1 (getpoint "\n specify the first point on the mirror plane")
p2 (getpoint "\n specify the second point on the mirror plane")
p3 (getpoint "\n specify the third point on the mirror plane")
m (vlax-tmatrix (Matrix-Symmetry-Plane
p1
(v_norm_2v (mapcar (function -) p1 p2) (mapcar (function -) p1 p3))
) ;_ Matrix-Symmetry-Plane
) ;_ vlax-tmatrix
) ;_ setq
(foreach a l (vla-TransformBy (vlax-ename->vla-object a) m))
(princ)
) ;_ defun