Здесь стандартный метод , AFAIK. В основном суммируйте поперечные произведения вокруг каждой вершины. Гораздо проще, чем триангуляция.
Код Python, заданный многоугольником, представленным в виде списка (x, y) вершинных координат, неявно обертывающих от последней вершины к первому:
def area(p):
return 0.5 * abs(sum(x0*y1 - x1*y0
for ((x0, y0), (x1, y1)) in segments(p)))
def segments(p):
return zip(p, p[1:] + [p[0]])
Дэвид Лехави комментирует: стоит упомянуть, почему работает этот алгоритм: это применение теоремы Грина для функций -y и x; точно так же работает планиметр . Более конкретно:
Формула выше = integral_over_perimeter(-y dx + x dy) =
integral_over_area((-(-dy)/dy+dx/dx) dy dx) =
2 Area
Был «порт» класса Java BigDecimal
(я думаю, что он находится здесь: http://freshmeat.net/projects/js_bigdecimal/ ) в течение длительного времени. Я долго смотрел на него, и это казалось очень громоздким и огромным, но (если это тот, о котором я думаю), он использовался как часть некоторых инструментов криптографии, поэтому есть приличный шанс, что он работает нормально.
Поскольку криптография является вероятной областью для генерации необходимости в таких вещах, это хороший способ отследить такие пакеты.
edit: Спасибо @Daniel (комментарий к вопросу) для этого более старый вопрос SO: https://stackoverflow.com/questions/744099/javascript-bigdecimal-library
Поскольку это, похоже, не упоминается, вот другой . Я еще не использовал его (пока), поэтому я обновляю сообщение после того, как попробую.
Как автор, я рекомендую bignumber.js или big.js , «небольшую, быструю библиотеку Javascript для арифметики с произвольной точностью с десятичными числами».
Для более зрелой библиотеки рекомендуется также ICU4J BigDecimal .