Как найти площадь многоугольника по формуле Гаусса?
Пытаюсь создать функцию Гаусса на python для расчёта площади n-го многоугольника, помогите создать данную функцию. Вот мои попытки создать её:
def func(x, y):
for i in range(1, n):
s = (1/2)*abs(sum((x[i]*y[i+1])+(x[i]*y[1]))-sum((x[i+1]*y[i])-(x[1]*y[i])))
return s
f = open('st.txt')
n = sum(1 for line in open('st.txt'))
Вот исходный файл:
1 2
2 1
3 4
5 6
Ответы (1 шт):
Автор решения: MBo
→ Ссылка
Возьмём удобную форму формулы Гаусса (shoelace) отсюда. В Python последний элемент списка можно использовать с индексом -1, что чуть упрощает дело.
from math import sin, cos, pi
def polygonArea(xlist, ylist):
area = 0
for i in range(len(xlist)):
area += xlist[i-1] * ylist[i] - ylist[i-1] * xlist[i]
return 0.5*abs(area)
#квадрат
print(polygonArea([0, 0, 2, 2], [0, 2, 2, 0]))
#невыпуклый многоугольник - звезда https://mathworld.wolfram.com/Pentagram.html
#площадь 0.31072 совпадает с A_filled
print(polygonArea([cos(pi/2 + pi*i/5)*(0.526-0.325*(i%2)) for i in range(10)],
[sin(pi/2 + pi*i/5)*(0.526-0.325*(i%2)) for i in range(10)]))
А если дан список точек, и без использования питоновской фишки с отрицательным индексом:
def polygonAreaPts(pts):
area = 0
last = len(pts) - 1
for i in range(len(pts)):
area += pts[last][0] * pts[i][1] - pts[last][1] * pts[i][0]
last = i
return 0.5*abs(area)