如何用向量的叉积来计算一个多边形的面积?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用向量的叉积来计算一个多边形的面积?相关的知识,希望对你有一定的参考价值。

例如一个五边形,其5个顶点坐标如下:1(0,0),2(0,2),3(1,2),4(2,4),5(0,4),他的面积具体是怎样计算的?

对多边形A1A2A3、、、An(顺或逆时针都可以),设平面上有任意的一点P,则有:
S(A1,A2,A3,、、、,An)
= abs(S(P,A1,A2) + S(P,A2,A3)+、、、+S(P,An,A1))

P是可以取任意的一点,用(0,0)时就是下面的了:

设点顺序 (x1 y1) (x2 y2) ... (xn yn)
则面积等于
|x1 y1| |x2 y2| |xn yn|
0.5 * abs( | | + | | + ...... + | | )
|x2 y2| |x3 y3| |x1 y1|

其中
|x1 y1|
| |=x1*y2-y1*x2
|x2 y2|
因此面积公式展开为:

|x1 y1| |x2 y2| |xn yn|
0.5 * abs( | | + | | + ...... + | | )=0.5*abs(x1*y2-y1*x2+x2*y3-y2*x3+...+xn*y1-yn*x1)
|x2 y2| |x3 y3| |x1 y1|
参考技术A 向量的叉积的模就是以两个向量为边所组成的平行四边形面积

二维坐标系中的点积叉积多边形面积

二维坐标系中的点积、叉积、多边形面积

点积定义

设有向量 (vec{a})(vec{b}) ,定义点积 (vec{a}cdot vec{b})实数 ,其值为 向量 (vec{a}) 在向量 (vec{b}) 上投影的长度乘以向量 (vec{b}) 的模

技术图片

点积性质

满足交换律,结合律

点积计算

直接计算

[ |vec{a}cdot vec{b}| = |vec{a}| imes |vec{b}| imes cos<vec{a}, vec{b}> ]

坐标系中计算

放在坐标系中,设 (vec{a} = (x_{1}, y_{1}), vec{b} = (x_{2}, y_{2}))

那么 (vec{a}cdot vec{b} = x_{1}x_{2} + y_{1}y_{2})

叉积定义

设有向量 (vec{a})(vec{b}) ,定义叉积 (vec{a} imes vec{b}) 为新的 向量
其模长为 (vec{a})(vec{b}) 所围成的平行四边形面积。
方向与 (vec{a})(vec{b}) 均垂直。
(vec{b})(vec{a}) 逆时针方向,即呈现左手系,那么 (vec{a} imes vec{b}) 为正;反之为负。

技术图片

叉积性质

叉积模即为平行四边形面积,所以在直角坐标系中求一个三角形的面积可以用叉积来计算,即

[ S_{OAB} = frac{1}{2}|vec{a} imes vec{b}| ]

叉积不满足交换律,因为方向会发生变化,即
[ vec{a} imes vec{b} = - vec{b} imes vec{a} ]

二维叉积模的计算

直接计算

[ |vec{a} imes vec{b}| = |vec{a}| imes |vec{b}| imes sin<vec{a}, vec{b}> ]

坐标系中计算

放在坐标系中,设 (vec{a} = (x_{1}, y_{1}), vec{b} = (x_{2}, y_{2}))

经过推导得到 (|vec{a} imes vec{b}| = |x_{1}y_{2} - x_{2}y_{1}|)

去掉绝对值便得到 有向面积

若值为正,说明 (vec{b})(vec{a}) 逆时针方向;若值为负,说明说明 (vec{b})(vec{a}) 顺时针方向。

多边形面积计算

基本思想是把多边形划分成多个三角形,然后叉积计算面积。这个思想对于凹凸多边形都成立。

记多边形顶点逆时针排列为 (P_{0}, P_{1}, .., P_{n - 1})

为了方便计算,选取坐标原点 (O(0, 0)) 作为源点,逐一计算 (vec{OP_{i}} imes vec{OP_{i + 1}}) ,累计求和即可。

公式为

[ sum_{i = 0}^{n - 1}(x_{i}y_{i + 1} - x_{i + 1}y_{i}) ]

(i = n - 1) 时,下一个坐标要回到 ((x_{0}, y_{0})) ,这里可以特判,也可以取模运算。

复杂度 (O_{n})

由于叉积面积的有向性,多余的面积会被抵消掉,所以这个算法是正确的,此处省略严格证明。

(code)

int n;
struct Cor
{
    int x, y;
}cor[105];

inline int read()
{
    char c = getchar();
    int ans = 0, f = 1;
    while(!isdigit(c)) {if(c == '-') f = -1; c = getchar();}
    while(isdigit(c)) {ans = ans * 10 + c - '0'; c = getchar();}
    return ans * f;
}

int main()
{
    while(scanf("%d", &n) && n) {
        for(int i = 0; i < n; ++i)
            cor[i].x = read(), cor[i].y = read();
        double ans = 0.0;
        for(int i = 0; i < n; ++i){
            ans += 0.5 * (cor[i % n].x * cor[(i + 1) % n].y - cor[i % n].y * cor[(i + 1) % n].x);
        }
        printf("%.1f
", ans);
    }
    return 0;
}

以上是关于如何用向量的叉积来计算一个多边形的面积?的主要内容,如果未能解决你的问题,请参考以下文章

改革春风吹满地 HDU - 2036 计算几何-----利用叉积计算多边形的面积

EOJ 1127. 多边形面积(计算几何)

二维坐标系中的点积叉积多边形面积

POJ - 1654 利用叉积求三角形面积 去 间接求多边形面积

叉积与点积

有关多边形面积的总结