2014-01-24 2 views
2

Доброе утро, все! Мне нужно вычислить площадь многоугольника, используя python. Формула для этого дается (извините, не могу размещать фотографии еще ..)Python - область нерегулярного полигона приводит к отрицательному значению?

(х * у - у * х) + (х * у - у * х) + ... (х п-1 * у - у п-1 * х)


Это код, который я придумал. Однако это приводит к (правильному) отрицательному значению, и я понятия не имею, почему. Можно ли просто умножить время области -0,5 или что-то не так с моим кодом? Любая помощь очень ценится !!

polygon = [[0,0],[-1,5],[2,3],[1,5],[3,6],[4,5],[5,3],[8,-2],[4,-4],[2,-5]] 
area = 0.0 

n = len(polygon) 
for i in range(n): 
    i1 = (i+1)%n 
    area += polygon[i][0]*polygon[i1][1] - polygon[i1][0]*polygon[i][1]  
area *= 0.5 
print 'area = ', area 
+1

Я думаю, вы обнаружите, что знак результата просто зависит от того, стреляете ли вы по часовой стрелке или против часовой стрелки вокруг очков. Так что просто возьмите 'abs()' результата, и все будет в порядке. – Duncan

ответ

5

формула работает посредством вычисления суммы поперечных продуктов каждой пары векторов между началом и концом каждого отрезка, составляющего полигон. По существу, площадь вычисляется как разница между площадью зеленого и красного треугольников на рисунке ниже. (Обратите внимание, что красные треугольники частично под зелеными.)

illustration

Знак поперечного продукта зависит от ориентации векторов, то есть, если мы можем сделать второй вектор для приведения в соответствие с первым поворачивая его влево или вправо. Таким образом, вы получите либо отрицательную, либо положительную область в зависимости от того, заказываются ли точки в полигоне по часовой стрелке или против часовой стрелки. Решение правильное, но вам нужно применить функциюк результату, так как вам не нужен знак.

+0

спасибо за разъяснение !! – user3232357

2

Знак окончательного ответа основан на ориентации многоугольника. Вы можете проверить это, взяв обратный список многоугольника в данном примере.

polygon = [[0,0],[-1,5],[2,3],[1,5],[3,6],[4,5],[5,3],[8,-2],[4,-4],[2,-5]] 
polygon.reverse() 
... 

В этом случае вы обнаружите, что область положительная, подумал, что это по существу тот же самый многоугольник.

Вы можете узнать больше о том, почему ориентация делает область отрицательной here.

Вам просто нужно принять абсолютное значение конечного результата.

print 'area = ', abs(area) 

 Смежные вопросы

  • Нет связанных вопросов^_^