Площадь многоугольника (рекурсивно с использованием Python)

Я пытаюсь решить упражнение из книги "Изучение Python". Но, думаю, я не понимаю концепции рекурсии. Я написал некоторую функцию Recursively. Поэтому я знаю некоторые аспекты. Но у меня недостаточно опыта. И я перестал изучать программирование примерно на год.

В любом случае, позвольте мне задать вам полный вопрос:

Многоугольник может быть представлен списком пар (x, y), где каждая пара является кортежем: [(x1, y1), (x2, y2), (x3, y3), ... (xn, yn)]. Написать рекурсивная функция для вычисления площади многоугольника.Это может быть достигается путем «отсечения» треугольника, используя тот факт, что треугольник с углами (x1, y1), (x2, y2), (x3, y3) имеет площадь (x1y1 + x2y2 + x3y2 - y1x2 –y2x3 - y3x1) / 2.

Несмотря на то, что вопрос уже давал формулу, я использовал другую формулу. Потому что я провел небольшое исследование площади многоугольника. И если вы посмотрите на здесь , формула будет другой.

И было бы лучше описать мою программу пошагово, чтобы объяснить, чего я хочу. Хорошо, мне пришлось объявить глобальные области видимости из-за рекурсии:

area = 0
x = [0] * 3
y = [0] * 3 

А затем я создал рекурсивную функцию. В результате эта функция всегда возвращает ноль. Итак, моя настоящая проблема заключается в следующем:

def areaofpolygon(polygon, i):
    global area, x, y # My variables 
    try: # I prefered using try statement from using if-else statements. So it is the easier I guess.
        x[i], y[i] = polygon[i] # X and Y coordinates from tuple
        area += (x[i]*y[i+1] - x[i+1]*y[i]) #My formula
    except IndexError:
        return area/2

    areaofpolygon(polygon, i+1)   # Here, this is my weird recursion

И моя основная функция:

  def main():
      mypolygon = [(1,2), (2,5), (1,4)] # I declared polygon as tuples
      # I called my function and started to count from zero, and the result will be prompted.
      print(areaofpolygon(mypolygon,0))

      return 0
  if __name__ == '__main__':
      main()

А вот мой полный код без комментариев:

'''
Created on Feb 24, 2012

@author: msarialp
'''
area = 0
x = [0] * 3
y = [0] * 3
def areaofpolygon(polygon, i):
    global area, x, y
    try:
        x[i], y[i] = polygon[i]
        area += (x[i]*y[i+1] - x[i+1]*y[i])
    except IndexError:
        return area/2

    areaofpolygon(polygon, i+1)   
def main():
    mypolygon = [(1,2), (2,5), (1,4)]
    print(areaofpolygon(mypolygon,0))

    return 0
if __name__ == '__main__':
    main()

EDIT One

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

area = 0
x = [0] * 3
y = [0] * 3

Моя функция, которая делит кортеж и получает координаты x и y.

def sides_of_polygon(polygon, i):
    global x, y
    try:
        x[i], y[i] = polygon[i]
        return sides_of_polygon(polygon, i+1)
    except IndexError:
        return x, y

Моя функция вычисляет площадь многоугольника (как и раньше)

def area_of_polygon(x, y, i):
    global area
    try:
        area += x[i]*y[i+1] - x[i+1]*y[i]
        return area_of_polygon(x, y, i+1)
    except IndexError:
        return area/2.0

Моя основная функция ...

def main():
    mypolygon = [(1,2), (2,5), (1,4)]
    dx, dy = sides_of_polygon(mypolygon, 0)
    print(area_of_polygon(dx,dy,0))

    return 0
if __name__ == '__main__':
    main()

Пожалуйста, помогите мне улучшить мой код, не давая полного решения.

РЕДАКТИРОВАТЬ Два

После обсуждения с senderle я понял, в чем проблема, и решение senderle лучше моего, поэтому я предлагаю вам использовать его. Как бы то ни было, Он помог мне исправить мой код, и мне снова пришлось менять формулу.

area += x[i]*y[(i+1) % 3] - x[(i+1) % 3]*y[i]

Он также добавил, что для более длинных полигонов 3 должны быть len (вершины). Спасибо всем за уделенное время.

6
задан mustafaSarialp 26 February 2012 в 21:28
поделиться