Suponiendo una serie de puntos en el espacio 2d que no se intersecan, ¿cuál es un método eficiente para determinar el área del polígono resultante?
Como nota al margen, esto no es tarea y no estoy buscando código. Estoy buscando una descripción que pueda usar para implementar mi propio método. Tengo mis ideas sobre cómo extraer una secuencia de triángulos de la lista de puntos, pero sé que hay un montón de casos extremos con respecto a polígonos convexos y cóncavos que probablemente no captaré.
Respuestas:
Aquí está el método estándar , AFAIK. Básicamente, suma los productos cruzados alrededor de cada vértice. Mucho más simple que la triangulación.
Código de Python, dado un polígono representado como una lista de coordenadas de vértice (x, y), envolviendo implícitamente desde el último vértice hasta el primero:
David Lehavi comenta: Vale la pena mencionar por qué funciona este algoritmo: es una aplicación del teorema de Green para las funciones −y y x; exactamente como funciona un planímetro . Más específicamente:
Fórmula anterior =
integral_over_perimeter(-y dx + x dy) =
integral_over_area((-(-dy)/dy+dx/dx) dy dx) =
2 Area
fuente
abs()
elimina el signo.El producto cruzado es un clásico.
Si tiene un trillón de tales cálculos por hacer, pruebe la siguiente versión optimizada que requiere la mitad de multiplicaciones menos:
Utilizo un subíndice de matriz para mayor claridad. Es más eficaz utilizar punteros. Aunque los buenos compiladores lo harán por usted.
Se asume que el polígono está "cerrado", lo que significa que copia el primer punto como punto con subíndice N. También asume que el polígono tiene un número par de puntos. Agregue una copia adicional del primer punto si N no es par.
El algoritmo se obtiene desenrollando y combinando dos iteraciones sucesivas del algoritmo clásico de productos cruzados.
No estoy tan seguro de cómo se comparan los dos algoritmos con respecto a la precisión numérica. Mi impresión es que el algoritmo anterior es mejor que el clásico porque la multiplicación tiende a restaurar la pérdida de precisión de la resta. Cuando está limitado a usar flotadores, como con GPU, esto puede marcar una diferencia significativa.
EDITAR: "Área de triángulos y polígonos 2D y 3D" describe un método aún más eficiente
fuente
Esta página muestra que la fórmula
se puede simplificar a:
Si escribe algunos términos y los agrupa de acuerdo con factores comunes de
xi
, la igualdad no es difícil de ver.La suma final es más eficiente ya que solo requiere
n
multiplicaciones en lugar de2n
.Aprendí esta simplificación de Joe Kington, aquí .
Si tiene NumPy, esta versión es más rápida (para todas las matrices, excepto las muy pequeñas):
fuente
Un conjunto de puntos sin ninguna otra restricción no necesariamente define de forma única un polígono.
Entonces, primero debe decidir qué polígono construir desde estos puntos, ¿quizás el casco convexo? http://en.wikipedia.org/wiki/Convex_hull
Luego triangula y calcula el área. http://www.mathopenref.com/polygonirregulararea.html
fuente
Para expandir el triangular y sumar áreas de triángulo, funcionan si tiene un polígono convexo O si elige un punto que no genera líneas a todos los demás puntos que se cruzan con el polígono.
Para un polígono general que no se interseca, debe sumar el producto cruzado de los vectores (punto de referencia, punto a), (punto de referencia, punto b) donde ayb están "próximos" entre sí.
Suponiendo que tiene una lista de puntos que definen el polígono en orden (el orden son los puntos i e i + 1 que forman una línea del polígono):
Suma (producto cruzado ((punto 0, punto i), (punto 0, punto i + 1)) para i = 1 an - 1.
Toma la magnitud de ese producto cruzado y tienes el área de superficie.
Esto manejará polígonos cóncavos sin tener que preocuparse por elegir un buen punto de referencia; cualesquiera tres puntos que generen un triángulo que no esté dentro del polígono tendrán un producto cruzado que apunte en la dirección opuesta a cualquier triángulo que esté dentro del polígono, por lo que las áreas se suman correctamente.
fuente
Para calcular el área del polígono
fuente
O haz una integral de contorno. El teorema de Stokes le permite expresar una integral de área como una integral de contorno. Una pequeña cuadratura de Gauss y Bob es tu tío.
fuente
solución independiente del idioma:
DADO: un polígono SIEMPRE puede estar compuesto por n-2 triángulos que no se superponen (n = número de puntos O lados). 1 triángulo = polígono de 3 lados = 1 triángulo; 1 cuadrado = polígono de 4 lados = 2 triángulos; etc ad nauseam QED
por lo tanto, un polígono se puede reducir "cortando" triángulos y el área total será la suma de las áreas de estos triángulos. Pruébelo con un papel y unas tijeras, es mejor si puede visualizar el proceso antes de seguir.
Si toma 3 puntos consecutivos en una ruta de polígonos y crea un triángulo con estos puntos, tendrá uno y solo uno de los tres escenarios posibles:
solo nos interesan los casos que caen en la primera opción (totalmente contenido).
cada vez que encontramos uno de estos, lo cortamos, calculamos su área (fácil, no explicaré la fórmula aquí) y hacemos un nuevo polígono con un lado menos (equivalente al polígono con este triángulo cortado). hasta que solo nos quede un triángulo.
cómo implementar esto programáticamente:
Cree una matriz de puntos (consecutivos) que representen la ruta ALREDEDOR del polígono. comience en el punto 0. ejecute la matriz formando triángulos (uno a la vez) desde los puntos x, x + 1 y x + 2. transforma cada triángulo de una forma a un área e interseca con el área creada a partir de un polígono. SI la intersección resultante es idéntica al triángulo original, entonces dicho triángulo está totalmente contenido en un polígono y se puede cortar. elimine x + 1 de la matriz y comience de nuevo desde x = 0. de lo contrario (si el triángulo está fuera [parcial o completamente] del polígono), muévase al siguiente punto x + 1 en la matriz.
Además, si está buscando integrarse con el mapeo y está comenzando desde geopuntos, debe convertir de geopuntos a puntos de pantalla PRIMERO. esto requiere decidir un modelo y una fórmula para la forma de la tierra (aunque tendemos a pensar en la tierra como una esfera, en realidad es un ovoide irregular (forma de huevo), con abolladuras). hay muchos modelos por ahí, para más información wiki. una cuestión importante es si considerará o no que el área es un plano o una curva. en general, las áreas "pequeñas", donde los puntos están separados hasta algunos kilómetros, no generarán un error significativo si se consideran planas y no convexas.
fuente
Una forma de hacerlo sería descomponer el polígono en triángulos , calcular el área de los triángulos y tomar la suma como el área del polígono.
fuente
fuente
Mejor que sumar triángulos es sumar trapezoides en el espacio cartesiano:
fuente
La implementación de la fórmula de Shoelace se podría realizar en Numpy. Asumiendo estos vértices:
Podemos definir la siguiente función para encontrar el área:
Y obteniendo resultados:
Evitar el bucle hace que esta función sea ~ 50 veces más rápida que
PolygonArea
:Nota: había escrito esta respuesta para otra pregunta , solo menciono esto aquí para tener una lista completa de soluciones.
fuente
Mi inclinación sería simplemente comenzar a cortar triángulos. No veo cómo otra cosa podría evitar ser terriblemente peluda.
Tome tres puntos secuenciales que componen el polígono. Asegúrese de que el ángulo sea inferior a 180. Ahora tiene un nuevo triángulo que no debería ser un problema para calcular, elimine el punto medio de la lista de puntos del polígono. Repite hasta que solo te queden tres puntos.
fuente
C forma de hacer eso:
fuente
Código Python
Como se describe aquí: http://www.wikihow.com/Calculate-the-Area-of-a-Polygon
Con pandas
fuente
fuente
cp
toma dos argumentos, pero lo estás llamando con uno.