La voie la plus rapide à la formule de lacet
j'ai fait une fonction qui calcule la zone polygone avec Lacet.
cela fonctionne parfaitement mais en ce moment je me demande s'il n'y a pas un moyen plus rapide d'avoir le même résultat. Je veux savoir que parce que cette fonction doit travailler plus vite avec polygone avec beaucoup de coordonnées.
ma fonction:
def shoelace_formula(polygonBoundary, absoluteValue = True):
nbCoordinates = len(polygonBoundary)
nbSegment = nbCoordinates - 1
l = [(polygonBoundary[i+1][0] - polygonBoundary[i][0]) * (polygonBoundary[i+1][1] + polygonBoundary[i][1]) for i in xrange(nbSegment)]
if absoluteValue:
return abs(sum(l) / 2.)
else:
return sum(l) / 2.
mon polygone:
polygonBoundary = ((5, 0), (6, 4), (4, 5), (1, 5), (1, 0))
résultat:
22.
des idées?
j'essaie avec Numpy : C'est le plus rapide, mais vous devez d'abord convertir vos coordonnées.
import numpy as np
x, y = zip(*polygonBoundary)
def shoelace_formula_3(x, y, absoluteValue = True):
result = 0.5 * np.array(np.dot(x, np.roll(y, 1)) - np.dot(y, np.roll(x, 1)))
if absoluteValue:
return abs(result)
else:
return result
1 réponses
Voici une version qui utilise 1/2 fois plus de multiplications: https://stackoverflow.com/a/717367/763269
si vous avez besoin de performances encore plus grandes, Vous pouvez envisager de le faire dans une extension Python C. C peut être beaucoup plus rapide que Python, surtout pour les opérations mathématiques -- parfois 100-1000x.