Tengo un objeto de habitación definido por una colección de segmentos de línea en bucle para los que necesito calcular el área. Las clases se pueden describir de la siguiente manera (en pseudocódigo):
class Point {
float x;
float y;
...
float distanceFrom(Point p);
}
class Segment {
Point start;
Point end;
...
float length();
}
class Room {
List<Segment> walls;
...
float area();
}
Las paredes de una habitación nunca pueden cruzarse en ninguna parte, pero en los puntos finales de los segmentos y cualquier "sub-bucle" creado también se separará en una nueva habitación. La solución no necesita ser perfectamente precisa (se acepta un margen de error del 10%) y tampoco se calcula con mucha frecuencia (<1 / s).
Room
contener una lista dePoint
s, y luego obtener los segmentos conectando cada punto y luego volverlo a recorrer. De lo contrario, con su configuración actual, es muy oriental obtener valores incorrectos (por ejemplo, habitación no cerrada, habitación con pared en el medio, etc.). Esta sería la mejor opción.Room
s esté siempre completa, y ese puede no ser el caso si hago que el jugador construyaRoom
s usandoSegment
s. Además, una función de sala cerrada es fácil de definir (solo recorra losSegment
correos electrónicos y asegúrese de que crean una sala).Respuestas:
Puedes usar la fórmula del cordón de Gauss :
Debe tomar la coordenada x de cada punto, multiplicarlos por la coordenada y del siguiente punto, luego restar la coordenada y del punto actual multiplicada por la coordenada x del siguiente punto del resultado y agregarlos al área total. Después de hacer esto para cada punto, reduzca a la mitad el área total para obtener el área real del polígono. Si el punto actual es el último, entonces el siguiente es el primero.
fuente
A
se niega el final . Dependiendo de la meta,A = |A|
puede ser necesario. Con el código de área negativo puede encontrar el área en una dona irregular usando la lista de puntos internos y externos (uno en el orden opuesto).También podríamos usar un método de Monte Carlo.
Dibuja un rectángulo alrededor de la forma arbitraria. Tome una fuente de PRNG distribuida uniformemente, por ejemplo. mersenne twister, luego limita la salida por las longitudes X, Y del rectángulo usando la función de módulo. Cuenta el no. de puntos aleatorios que aterrizan dentro de tu figura. Dividir por la cantidad total de puntos generados. Multiplica ese cociente por el área del rectángulo. Con cada iteración convergerás al área real. El algoritmo es ridículamente paralelo y puede usarse para calcular 'volúmenes' arbitrarios de formas dimensionales, siempre que pueda determinar si una coordenada R ^ N cae dentro del límite R ^ N de la forma..
fuente
Otro enfoque: no lo hagas.
En lugar:
Básicamente, corta un triángulo. El área de un triángulo es simple y al hacerlo redujimos el recuento de segmentos del resto en uno. Repita hasta que lo que quede sea un triángulo.
fuente