;上面的dividepnt,应该也可以这么写的--
;(dividept '(1 0 0) '(11 12 13) 5);返回
(3.0 2.4 2.6) (5.0 4.8 5.2) (7.0 7.2 7.8) (9.0 9.6 10.4))
(defun dividept(p1 p2 n / pts m tmpp)
(setq p1->p2(-> p1 p2));获得向量------
(setq m(/ 1 (float n)))
(while (> (setq n(1- n)) 0)
(setq tmpp (r&> (* n m) p1->p2)
tmpp (>+> p1 tmpp)
pts (cons tmpp pts)
)
)
)
;|三点共线即两个向量平行,则可以推导出另外一个判断三点共线--
;z1/z2=x1/x2=y1/y2=scale,推理出x1*y2-y1*x2=0=x1*z2-x2*z1
;(3pinline '(0 0 0) '(1 2 3) '(2 4 6)) ;返回t|;
(defun 3pinline(p1 p2 p3 / p1->p2 p1->p3)
(setq p1->p2(-> p1 p2)
p1->p3(-> p1 p3))
(= 0 (- (* (car p1->p2)(cadr p1->p3))(* (cadr p1->p2)(car p1->p3)))
(- (* (car p1->p2)(caddr p1->p3))(* (caddr p1->p2)(car p1->p3))))
)
;从矢量的叉乘意义知道,两个矢量叉乘的矢量的模就是以两个矢量为邻边的平行四边形的面积--
;实际应用:计算三角形的面积.-
;(areas '(0 0 0) '(1 2 0) '(1 3 0));返回:0.5
;(areas '(0 0 0) '(0 0 0) '(0 0 0));返回:0.0
(defun areas(p1 p2 p3 / p1->p2 p1->p3)
(setq p1->p2(-> p1 p2)
p1->p3(-> p1 p3))
(/ (|| (>*> p1->p2 p1->p3)) 2.0);两个向量叉乘再求模再除以2------------------------
)
;函数更改为
(defun >tomatrix(p)
(append p '(1.0))
)
;矩阵转换中的--我当时还是在cad系统里面测试,没有认真考虑到变换坐标系,更改后就可以了~
(defun >prlmatrix(matrix p / e1 e2 e3)
;根据上面的理解,我们可以计算了------------------------
;(setq p(list (car p)(cadr p)(caddr p) 1.0))
(setq e1(car matrix)
e2(cadr matrix)
e3(caddr matrix))
(setq p(-> (list (last e1) (last e2) (last e3))
p))
(list (/ (prl p (list (car e1)(cadr e1)(caddr e1)))(|| (list (car e1)(cadr e1)(caddr e1))))
(/ (prl p (list (car e2)(cadr e2)(caddr e2)))(|| (list (car e2)(cadr e2)(caddr e2))))
(/ (prl p (list (car e3)(cadr e3)(caddr e3)))(|| (list (car e3)(cadr e3)(caddr e3))))
)
)
;|
什么是矩阵?---
不管它了,还是先看坐标系的转换-----------------------------
首先,向量的坐标表示是向量在标架的定义{o e1 e2 e3}的一个表达-----
也就是说,其实,,,,任何对象都是向量?和书上的概念不同?管他呢!
让我们来看一看向量的基础----------------------------------
同一个标架上(O i j k):
假设向量A表达为(1 2 3),向量B表达为(4 5 6),向量C(3 3 3),,,,
则根据向量基本计算法则有:向量AB表达为(3 3 3),那么向量c和AB是什么关系呢???
向量C和向量AB在该标架下的坐标表示是一样的,也就是相等.
而实质是:向量A=矩阵{1 2 3}乘标架矩阵{O i j k}
向量B=矩阵{4 5 6}乘标架矩阵{O i j k}
向量C=矩阵{3 3 3}乘标架矩阵{O i j k}
向量AB=矩阵{3 3 3}乘标架矩阵{向量A i j k}
从这里应该可以看见,把向量C变换为向量B其实就是向量C乘{向量A i j k}
那么转换坐标系其实很简单了;;;
假设我们定义一个坐标系:坐标原点(1 2 3),i(10 0 0),j(0 10 0),k(0 0 10)
设向量C在世界标架为(3 3 3),转换到新定义的坐标系的实质就是该向量乘新--
的坐标系矩阵-----------------
((1 2 3)(10 0 0)(0 10 0)(0 0 10))
((10 0 0 1)(0 10 0 2)(0 0 10 3)(0 0 0 1))
(>*matrix '((10 0 0 1)(0 10 0 2)(0 0 10 3)(0 0 0 1)) '(1 2 3))
;返回
11.0 22.0 33.0)
;转换到世界坐标------------------------------------------
;世界坐标如何转化为该坐标呢?-----------------------------
(>prlmatrix '((10 0 0 1)(0 10 0 2)(0 0 10 3)(0 0 0 1)) '(11.0 22.0 33.0))
;返回
1.0 2.0 3.0)
可是仔细看,,其实我们的>*matrix函数就是一个矩阵相乘------------
我们的向量(0.2 0.1 0.0)看成是{0.2 0.1 0.0}矩阵
坐标系看成是{(10 0 0 1)(0 10 0 2)(0 0 10 3)(0 0 0 1)}矩阵
那么坐标系转换的过程其实说到底还是矩阵的相乘在操作着----------
注意看,在转换前后我们的向量的坐标发生了变化,,,,,,,,,,,,,,,,,,,
抛弃我们在进行坐标系转换的看法,,,
从另外一个角度看,向量和坐标系的矩阵的相乘,竟然会使向量从(0.2 0.1 0.0)变到了(3.0 3.0 3.0)
也就是说在经过一个矩阵乘法以后,向量(这费解的东西)竟然变换了---
难道矩阵的功能就是使向量进行变换或者说生长????----------------
也就是说矩阵可以操作坐标系转换也可以变换向量??????????????????
|;
;定义矩阵的相乘-----------------------------------
;矩阵C(i, j) =(矩阵A的第i行)点乘(B的第j列)
;显然就是矩阵A的行矢量叉乘矩阵的列矢量------------
;我们把矩阵B转化为列序,然后进行点乘---------------
(defun mat*mat(mat1 mat2 / p)
(setq p(apply 'mapcar (cons 'list mat2)))
(mapcar '(lambda(x)(mapcar '(lambda(y)(>&> x y)) p))mat1)
)
;构建平移,缩放,旋转矩阵这些相对简单,甚至可以抄就好了~~呵呵,何必学习~~~~~
;至于矩阵的概念???,,,,,,,,