Perimeter of a polygon
Now, let's consider the problem of computing the length of the perimeter of a polygon. The input is a structure of vertices, encoded as a list of lists of two values (as like[[1, 2], [3.4, 7.6], [-4.4, 3]]). Here is the ?rst attempt:
def perim(vertices):
result = 0
for i in range(len(vertices)-1):
result = result + math.sqrt((vertices[i][0]-vertices[i+1][0])**2 + \ (vertices[i][1]-vertices[i+1][1])**2)
return result + math.sqrt((vertices[-1][0]-vertices[0][0])**2 + \ (vertices[-1][1]-vertices[0][1])**2)
Again, this works, but it ain't correct. The basic cause is that someone reading the code doesn't immediately see what all that subtraction and squaring is about. We caould be fixed that by de?ning another procedure:
def perim(vertices):
result = 0
for i in range(len(vertices)-1):
result = result + pointDist(vertices[i],vertices[i+1])
return result + pointDist(vertices[-1],vertices[0])
def pointDist(p1,p2):
return math.sqrt(sum([(p1[i] - p2[i])**2 for i in range(len(p1))]))
Now, we've de?ned a new procedure pointDist, which calculates the Euclidean distance be tween two positions. And, in fact, we've written it usually enough to work on points of any dimension (not just two). Just for fun, here's another example to calculate the distance, which some people would use and others would not.
def pointDist(p1,p2):
return math.sqrt(sum([(c1 - c2)**2 for (c1, c2) in zip(p1, p2)]))
For this to make sense, you have to understand zip. Here's a program of how it works:
> zip([1, 2, 3],[4, 5, 6])
[(1, 4), (2, 5), (3, 6)]