2010-03-31 6 views
8

Tengo un conjunto de puntos que se encuentra en la imagen. Estos conjuntos de puntos forman una forma cerrada irregular. Necesito encontrar el área de esta forma. ¿Algún cuerpo que sea el algoritmo normal usado para calcular el área? ¿O hay alguna ayuda disponible en bibliotecas como boost? Estoy usando C++.Área de forma irregular

+0

La próxima vez pruebe Math Overflow (http://mathoverflow.net/) y luego vuelva aquí con una pregunta sobre la implementación del mejor algoritmo que le brindan. Probablemente obtendrás mejores resultados. – Ricket

+12

@Ricket: Math Overflow es para preguntas de investigación de nivel superior y superior. Esta pregunta es muy fácil y sería rechazada. – Brian

+0

puede probar este enlace: http://www.wikihow.com/Calculate-the-Area-of-a-Polygon Espero que ayude –

Respuesta

19

Si polígono es simple (que no tiene ningún punto en común con excepción de los pares de segmentos consecutivos), entonces Wikipedia trata de ayudarle a:

La fórmula para el área es

alt text

(se supone que el último punto es el mismo de la primera)

que se pueden implementar fácilmente como

float area = 0.0f; 

for (int i = 0; i < numVertices - 1; ++i) 
    area += point[i].x * point[i+1].y - point[i+1].x * point[i].y; 

area += point[numVertices-1].x * point[0].y - point[0].x * point[numVertices-1].y; 

area = abs(area)/2.0f; 

de vértices curso deben ser ordenados de acuerdo con su continuación natural en el polígono ..

+0

Ha olvidado el último segmento. – Beta

+0

usted era, correcto: porque la fórmula asume ese punto [n] == punto [0]. Agregó el último paso al algoritmo. – Jack

+0

En la penúltima línea, el punto [0] no especifica si está utilizando X o Y. Supongo que X, dado el código en el forloop. Además, adjuntaré el forloop entre paréntesis para que sea más fácil de leer. –

1

Es posible que desee para ser más precisos, posiblemente, incluso proporcionando un ejemplo gráfico.

Por ejemplo, si los puntos que tiene son simplemente píxeles, entonces el número de píxeles es igual al área. Pero si los puntos son las esquinas de un polígono, entonces el área del polígono no es tan fácil de determinar. Utilizaría triangulación de polígono y sumar las áreas de los triángulos obtenidos.

0

Nota: Si no conoce el orden de los puntos y no puede garantizar que su polígono sea convexo, no es posible determinar el orden de la forma, ya que puede haber más de un orden posible los puntos que produce un polígono Si sabe que el polígono es convexo, es fácil determinar el orden de los puntos. Simplemente clasifique los puntos por el ángulo de un punto particular. El primer punto es el que forma una línea entre sí mismo y el punto inicial, de modo que todos los otros puntos estén en el mismo lado de la línea. Los triángulos formados por este proceso también se pueden usar para calcular el área.

0

Hay soporte para el cálculo del área de polígonos en Boost.Geometry (que aún no se acepta en boost y que es muy confuso de usar). De lo contrario, primero tendría que determinar el polígono definido por sus puntos. Por lo que se ve, todos tus puntos son vértices del polígono, así que esto es simplemente una cuestión de ordenar tus conjuntos de puntos correctamente. Otra posibilidad es que esté buscando el casco convexo de su conjunto de puntos (consulte http://en.wikipedia.org/wiki/Convex_hull_algorithms).

0

Sin modestia, lo remito a mi respuesta a otra pregunta Combined area of overlapping circles. Monte Carlo es robusto, fácil de paralelar y, eventualmente, le dará una respuesta a la precisión que necesita.

+2

En este caso, calcular el área exacta es menos costoso que realizar * una * prueba de Monte Carlo. – Beta

+0

Averiguar si un punto está dentro de un polígono no es más fácil que simplemente calcular el área. – Brian

0

La manera más simple de hacer esto es probablemente triangular su forma y calcular el área de los triángulos. Dave Eberly tiene una biblioteca llamada (licencia Boost) que puede ayudar con la triangulación; hay más información here. Busque TriangulateEC, por ejemplo.

Cuestiones relacionadas