外积的计算是线段方法的核心。 考虑图33-1(a )所示的矢量p1和p2。 可以将叉积解释为由点(0,0 )、p1、p2和p1p2=(x1x 2,y1 y2 )组成的平行四边形的有向面积。 与此等价,但更有效外积的定义方法之一是看作矩阵行列式:
P1p2=det [ x1 y1 x2 y2 ]=x1 y2 x2 y1=p2P1
如果p1p2的值为正,则p1相对于原点(0,0 )位于p2的顺时针方向; 如果p1p2的值为负,则p1位于p2的逆时针方向。 图(b )表示向量p的顺时针方向和逆时针方向的区域。 叉积为0时出现边界的情况; 在这种情况下,两个向量位于同一条直线上,指向同一个方向或相反的方向。
为了使有向线段p0p 1顺时针还是逆时针相对于共同端点p0接近p0p 2,以p0为原点将问题简单化。 向量p1=(x1,y1 )由p1-p0表示,其中x1=x1x 0,y1=y1 y0,这同样可以定义p2-p0。 然后,计算外积
(P1 P0 ) ) (P1 P0 ) (P1 P0 ) x1x0) y2y0 ) (x2x0 ) y1y0 ) ) ) ) ) ) ) ) ) 652
叉积的用途如下所示。
1 .相交判断线段的弯曲方式
如上图所示,可以通过计算向量的外积来判断拐点方向,即(C-B ) ) a-b )的符号。
(C-B ) ) a-b ) 0时,CB在b点顺时针得到AB
(C-B ) ) a-b ) 0时,CB在b点逆时针得到AB
(C-B ) ) a-b )=0时,a、b、c三点为同一直线。
如图所示,给定3个点a、b、c,沿着AB到BC,判断在b点是右转还是左转。 然后求出弯曲的角度。 这个先用直接叉积判断弯曲方式,然后用馀弦定理计算角度就可以了。
从180减去这个角度就是弯曲的角度。
2 .叉积还有一个重要用途。 是为了求出面积。
叉积是用来求面积的。 要求的是有向面积。 也就是说有正负符号。
但是,如果取绝对值的话,就会变成真正的面积大小。
例如求出三角形ABC的面积,先计算外积cross(a,b,c ),
面积为Fabs(cross(a,b,c ) )/2.0
为什么呢?
通过查看外积的定义可以看出,a和b的外积类型如下。
|ab|=|a||b|sin(a,b )他的几何学意思是以a和b为邻边的平行四边形的面积。
判断三点p是否在三角形内。
如果在三角形内,则必须满足S.abc=S.abp S.acp S.bcp; 如果位于三角形之外,则表达式不成立。
4 .叉积可以判断两条直线是否相交。
对于给定的两条线段A1A2、B1B2,判断他们是否相交需要分为两个阶段
(1)快速拒绝实验
设以线段A1A2和线段B1B2为对角线的矩形为m、n;
如果m、n不相交,两条线段明显不相交;
判断矩形的交点时,判断某个矩形是否有顶点即可。
因此,只有在满足第一个条件时,两条直线才可能相交。
)2)水刺实验
如果两条线段相交,两条线段一定会相互跨越对方。 如果A1A2跨越B1B2,则向量(A1 - B1 )和(A2-B1 )位于向量(B2-B1 )的两侧。
即((A1-B1 ) ) A1-B1 ) ) A1-B1 ) ) A1-B1 ) ) A1-B1 ) ) 0。
上式可以改写为((A1-B1 ) ) A1-B1 ) ) ) A1-B1 ) ) 0。
(A1-B1 ) ) B2B1)=0时,A1B1和B2B1在同一直线上,但由于先通过了高速拒绝实验,所以A1一定在B1B2上,所以判断线段A1A2是否跨越立B1B2的依据如下
(A1-B1 ) ) (A1-B1 ) ) ) A1-B1 ) ) 0。
同样地,判断线段B1B2是否跨越A1A2的根据是((B1-A1 ) )-(B1-A1 ) ) (B1-a1 ) ) ) 0。