I\'m trying a solve an exercise from Exploring Python book. But, I guess I don\'t understand concept of the recursion. I\'ve written some Recursively function. Therefore I k
The implementation of your formula is flawed. It looks ahead to values in your x, y lists that haven't been set yet with (x[i]*y[i+1] - x[i+1]*y[i])
If you put a print statement inside your try-except block you will see that you are simply multiplying by zero and getting zero area:
try:
x[i], y[i] = polygon[i]
area += (x[i]*y[i+1] - x[i+1]*y[i])
print x[i], y[i+1], x[i+1], y[i]
except IndexError, e:
return area/2
#1 0 0 2
#2 0 0 5
Also, you are not returning the results of your recursive call to areaofpolygon, so you will never get that area/2. You want: return areaofpolygon(polygon, i+1). And make sure you actually divide by 2.0 so that you get float precision since your points are ints.
Try just using the formula you found or that was suggested in another question.
Update
Here is a fixed version of your code:
#!/usr/bin/env python
from random import randint
from shapely.geometry import Polygon
area = 0
def areaofpolygon(polygon, i):
global area
if i == 0:
area = 0
try:
x1, y1 = polygon[i]
x2, y2 = polygon[i+1]
area += (x1*y2) - (x2*y1)
except IndexError, e:
x1, y1 = polygon[0]
x2, y2 = polygon[-1]
area += (x2*y1) - (x1*y2)
return abs(area/2.0)
return areaofpolygon(polygon, i+1)
def main():
mypolygon = [(randint(0, 100), randint(0, 100)) for _ in xrange(10)]
print mypolygon
area = areaofpolygon(mypolygon, 0)
assert area == Polygon(mypolygon).area
print "Test passed."
return 0
if __name__ == '__main__':
main()
### Output ###
$ ./test.py
[(29, 76), (85, 49), (27, 80), (94, 98), (19, 1), (75, 6), (55, 38), (74, 62), (0, 25), (93, 94)]
Test passed.
$ ./test.py
[(13, 37), (98, 74), (42, 58), (32, 64), (95, 97), (34, 62), (34, 59), (21, 76), (55, 32), (76, 31)]
Test passed.
$ ./test.py
[(38, 67), (66, 59), (16, 71), (53, 100), (64, 52), (69, 31), (45, 23), (52, 37), (27, 21), (42, 74)]
Test passed.
Notice that you didn't need global x,y lists. And you also missed the last part of the equation where you use the last point and the first point.