本帖最后由 ashleytgg 于 2018-3-14 16:33 编辑
参照《计算机图形学原理教程》编著 ——李建平 , 电子科技大学出版社, 中其次坐标的图形变换原理,写了几个lisp 函数。
绘制了正12面体, 觉得非常有趣,在此和大家飞享下。 其中也也引用了 high_fly_bird 的一个小函数矢量叉积。
 - ;;定义一个坐标系重置函数,把一个已知坐标系,原点重置为point_A ,Z轴设置方向point_A->point_B
- (defun reset_coordinate_system (group point_A point_B / x_A
- y_A z_A x_B y_B z_B
- P_1 P_2 cos_a sin_a cos_b
- sin_b P1->P2 A->B T_ry T_rx
- T_综合
- )
- (setq T_m (list
- (list 1 0 0 (* (car point_A) -1))
- (list 0 1 0 (* (cadr point_A) -1))
- (list 0 0 1 (* (caddr point_A) -1))
- (list 0 0 0 1)
- )
- )
- (mapcar 'set
- '(x_A y_A z_A x_B y_B z_B)
- (append point_A point_B)
- )
- (setq P_1 (list y_A Z_A)
- P_2 (list y_B Z_B)
- P1->P2 (distance p_1 P_2)
- )
- (if (> P1->P2 1e-8)
- (setq
- cos_a (/ (- z_B z_A) P1->P2)
- sin_a (/ (- y_B y_A) P1->P2)
- )
- (setq cos_a 1
- sin_a 0
- )
- )
- (setq T_rx (list
- (list 1 0 0 0)
- (list 0 cos_a (* -1 sin_a) 0)
- (list 0 sin_a cos_a 0)
- (list 0 0 0 1)
- )
- )
- (setq
- A->B (distance point_A point_B)
- cos_b (/ P1->P2 A->B)
- sin_b (/ (- x_B x_A) A->B)
- )
- (setq T_ry (list
- (list cos_b 0 (* -1 sin_b) 0)
- (list 0 1 0 0)
- (list sin_b 0 cos_b 0)
- (list 0 0 0 1)
- )
- )
- (setq T_综合
- (mapcar '(lambda (lst)
- (setq lst (mxv T_m lst)
- lst (mxv T_rx lst)
- lst (mxv T_ry lst)
- )
- )
- (list
- '(1 0 0 0)
- '(0 1 0 0)
- '(0 0 1 0)
- '(0 0 0 1)
- )
- )
- ;; 对T_综合 进行装置
- T_综合 (list (mapcar 'car T_综合)
- (mapcar 'cadr T_综合)
- (mapcar 'caddr T_综合)
- (mapcar 'cadddr T_综合)
- )
- )
- (mapcar '(lambda (u)
- (mxv T_综合 U)
- )
- group
- )
- )
- ;; (reset_coordinate_system group point_A point_B )
|