【面】计算任意二维图形的面积

计算几何中的三角形面积

在计算几何里,我们知道,△ABC的面积就是“向量AB”和“向量AC”两个向量叉积的绝对值的一半。其正负表示三角形顶点是在右手系还是左手系。

所以得到三角形面积:

$$
area(A,B,C)
= 1/2 * \vec{AB} × \vec{AC}
= 1/2 * \begin{bmatrix}
x_b-x_a&y_b-y_a\
x_c-x_a&y_c-y_a\
\end{bmatrix}
$$

注意:该方法得到是有向面积(有正负),有向面积A比面积S其实更本质!

由三角形推广到任意多边形

任意一个n边形可以被分成n个三角形

三角形面积:

$$
area(P_0,P_i,P_{i + 1})
= 1/2 * \begin{bmatrix}
x_i-x_0&y_i-y_0\
x_{i + 1}-x_0&y_{i + 1}-y_0\
\end{bmatrix}
$$

将$P_0$点作为坐标原点,可以化简为

$$
area(P_0,P_i,P_{i + 1})
= 1/2 * \begin{bmatrix}
x_i&y_i\
x_{i + 1}&y_{i + 1}\
\end{bmatrix}
= 1/2 * (x_i * y_{i + 1} - x_{i + 1} * y_i)
$$

所以有如下公式:

假设有n个角点,坐标分别为($x_1$,$y_1$)……($x_n$,$y_n$)那角点依次连线围成的面积就是

$$S=((x_1y_2-x_2y_1)+(x_2y_3-x_3y_2)+…+(x_ny_1-x_1y_n))/2$$

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def get_area(locations):
area = 0.0

for i in range(len(locations)):
lat = locations[i][0] # 纬度
lng = locations[i][1] # 经度

if i == len(locations)-1:
lat1 = locations[0][0]
lng1 = locations[0][1]
else:
lat1 = locations[i+1][0]
lng1 = locations[i+1][1]

area += (lat*lng1 - lng*lat1)/2.0

return abs(area)

if __name__ == '__main__':

locations = [[116.568627,39.994879],[116.564791,39.990511],[116.575012,39.984311]]
print(get_area(locations))
0%