for( int i = 0; i < npoints; i++ )
{
将轮廓点转换为浮点型
Point2f p = is_float ? ptsf[i] : Point2f((float)ptsi[i].x, (float)ptsi[i].y);
a00 += (double)prev.x * p.y - (double)prev.y * p.x;//向量叉乘
prev = p;
}
a00 *= 0.5;
if( !oriented )
a00 = fabs(a00);
其中(double)prev.x * p.y - (double)prev.y * p.x;不是很好理解.
可以看作(prev,x,prev.y)和(x,y)两个向量,那么上式就可以看作两向量的叉乘,含义就是这两个点和原点围成的面积的2倍。
举例说明哈:
(1)轮廓点为:A(1,1)、B(1,2)、C(2,2)、D(2,1)
(2)首先选取A和B两点,根据上面解释,根据向量OA和OB的叉乘可以求出三角形OAB面积(带方向),注意:向量叉乘是有方向的(右手准则)!叉乘的模是平行四边形面积!
(3)再选取B和C两点,可计算OBC的面积(带方向);
(4)三角形OAB和OBC的带方向的面积差就是三角形ABC的面积;
(5)后续计算同理;
(6)不要忘了最后还要乘以0.5哈!
计算过程:
①(A,B):1*2-1*1=1;
②(B,C):1*2-2*2=-2;
③(C,D):2*1-2*2=-2;
④(D,A):2*1-1*1=1;
⑤ S=(1-2-2+1)/2;