Я сделал функцию, которая вычисляет площадь многоугольника с помощью Shoelace.
Это работает отлично, но сейчас мне интересно, нет ли более быстрого способа получить тот же результат. Я хочу знать это, потому что эта функция должна работать быстрее с полигоном с большим количеством координат.
Моя функция:
def shoelace_formula(polygonBoundary, absoluteValue = True):
nbCoordinates = len(polygonBoundary)
nbSegment = nbCoordinates - 1
l = [(polygonBoundary[i+1][0] - polygonBoundary[i][0]) * (polygonBoundary[i+1][1] + polygonBoundary[i][1]) for i in xrange(nbSegment)]
if absoluteValue:
return abs(sum(l) / 2.)
else:
return sum(l) / 2.
Мой полигон:
polygonBoundary = ((5, 0), (6, 4), (4, 5), (1, 5), (1, 0))
Результат :
22.
Любые идеи?
Я пытаюсь с Numpy: это быстрее всего, но сначала вам нужно преобразовать свои координаты.
import numpy as np
x, y = zip(*polygonBoundary)
def shoelace_formula_3(x, y, absoluteValue = True):
result = 0.5 * np.array(np.dot(x, np.roll(y, 1)) - np.dot(y, np.roll(x, 1)))
if absoluteValue:
return abs(result)
else:
return result
numpy
должно помочь. stackoverflow.com/a/30408825/5666087 - person jakub   schedule 10.12.2016shoelace_formula_3
работал в два раза быстрее (115 микросекунд), чемshoelace_formula
(321 микросекунда). - person jakub   schedule 10.12.2016x, y = zip(*polygonBoundary)
вне функции и включаетеx
иy
в качестве параметров функции, она выполняется за 93,7 микросекунды. И импортируйтеnumpy
вне функции. - person jakub   schedule 10.12.20160.5 * np.abs(np.dot(x[:-1], y[1:]) + x[-1]*y[0] - np.dot(y[:-1], x[1:]) - y[-1]*x[0])
- person Ariel   schedule 08.08.2019