分类: 虚拟化
2015-08-21 15:29:15
转自http://www.cppblog.com/shiming413/archive/2007/08/21/30494.html
一、点。
l 点的坐标A(x1, y1),B(x2, y2)
二、向量。
l 向量AB = (x2-x1, y2-y1) = (x3,y3) ,CD = (x4, y4)。
l 向量的模|AB| = sqrt(x3*x3 + y3*y3) 即向量的长度。
三、点积。
l 点积的结果为一个数值。
l 数值计算方法AB * CD = x3*x4 + y3*y4。
l 几何意义AB * CD = |AB| * |CD| * cos(a),a为向量AB逆时针转向CD的角度,0<=a<360,也可以认为是两向量的夹角,0<=a<=180。一般用于求夹角,a = acos( (AB * CD) / (|AB| * |CD|) )。也可:|CD| * cos(a) = AB * CD / |AB|,即向量CD在AB上的投影。
四、叉积。
l 叉积的结果为一个向量。
l AB×CD数值= x3*y4 – x4*y3。
l 方向由右手螺旋定则判定。
l 几何意义:AB×CD = |AB| * |CD| * sin(a),取绝对值即是以AB和CD为边的平行四边形面积。
五、线段相交的判定(判定线段AB和线段CD是否相交,属于哪种相交)。
l 规范相交:交点只有一个,且不是线段的端点。
1、充要条件:点A和点B在CD的两侧并且点C和点D在AB的两侧。
2、如何判断点A在向量CD的左侧还是右侧:CA×CD的数值大于0则左侧,小于0则右侧。于是CA×CD的数值和CB×CD的数值异号,点A和点B在CD的两侧,同理可判断点C和点D是否在AB的两侧(注意,必须严格异号)。
l 不规范相交:交点为某个线段的端点,甚至两线段有一段重合。
1、充要条件,一条线段的一个端点在另一条线段上。即A在CD上或B在CD上或C在AB上或D在AB上。
2、A在线段CD上的充要条件:
a) AC×AD = 0,几何意义,AC和AD组成的平行四边形的面积为0,即A、C、D三点共线。
b) A点在CD之间,A.x处于C.x和D.x之间并且A.y处于C.y和D.y之间