展开,得到:
上式 = iy1z2 + jz1x2 + kx1y2 - ky1x2 - jx1z2 - iz1y2
= (y1z2 - y2z1)i + (x2z1 - x1z2)j + (x1y2 - x2y1)k
按规定,有:单位向量的模为1。可得叉积的模为:
|P1×P2| = y1z2 - y2z1 + x2z1 - x1z2 + x1y2 - x2y1
= (y1z2 + x2z1 + x1y2) - (y2z1 + x1z2 + x2y1)
①在三维的情况下,直接代入公式,可得向量B和向量C叉乘结果的模为:
|B×C| = ((y1-y0)*(z2-z0) + (z1-z0)*(x2-x0) + (x1-x0)*(y2-y0)) -
((y2-y0)*(z1-z0) + (z2-z0)*(x1-x0) + (x2-x0)*(y1-y0))
|
= |x1-x0 y1-y0 z1-z0|
|x2-x0 y2-y0 z2-z0|
x = |
然后用三维中的两点之间距离公式,求出(x,y,z)与(0,0,0)的距离,即为向量P的模,它的一半就是所要求的面积了。
以上公式都很好记:x分量由y,z分量组成,y分量由z,x分量组成,z分量由x,y分量组成,恰好是循环的。坐标平移一下就好了。
②在二维的情况下,我们可以取z = 0这个平面,即令z1 = z2 = 0,且
|P1×P2| = x1y2 - x2y1
|x1 y1|
= |
|x2 y2|
所以:
|B×C| = (x1-x0)*(y2-y0)-(x2-x0)*(y1-y0)
|x1-x0 y1-y0|
= |
|x2-x0 y2-y0|
它的一半即为所要求的三角形的面积S。
以二维的情况为例,三维亦同:
A(0,0) B(0,1) C(1,0) (A,B,C按顺时针方向给出)
S = ((x1-x0)*(y2-y0)-(x2-x0)*(y1-y0))/2;
A(1,0) B(0,1) C(0,0) (A,B,C按逆时针方向给出)
S = ((x1-x0)*(y2-y0)-(x2-x0)*(y1-y0))/2;
如果你不需要符号的话,再求一下绝对值就好了。这样也不用去管给出的点的顺序了。
以上是利用叉乘。其实还有一招,那就是海伦公式:
看起来好像比上面的都要简单…… -.-b 各位看客不要打我!
推荐:在二维的时候使用叉乘公式,三维的时候使用海伦公式~~~不过如果是需要符号的情况时,就只能使用行列式的计算公式了。
Delaunay三角剖分
http://wenku.baidu.com/view/b394f751f01dc281e53af04b.html
http://blog.youkuaiyun.com/donkeylong/article/details/4909774
http://blog.youkuaiyun.com/donkeylong/article/details/4909774
对Open CV 中的平面划分相关函数使用探索
http://wenku.baidu.com/view/b394f751f01dc281e53af04b.html
判断点是否在三角形内:http://www.blackpawn.com/texts/pointinpoly/default.html
笔记:Delaunay三角剖分(Delaunay Triangulation)相关知识
morphing method:
A review of image warping methods
Review Image warping and morphing
Image morphing: a survey:
http://css1a0.engr.ccny.cuny.edu/~wolberg/pub/vc98.pdf
http://code.google.com/p/imgwarp-opencv/
http://graphics.cs.cmu.edu/courses/15-463/2011_fall/Lectures/morphing.pdf
http://stackoverflow.com/questions/18511418/how-to-rotate-a-particualr-part-in-an-image