Eu tenho um objeto de sala definido por uma coleção de segmentos de linha em loop para os quais preciso calcular a área. As classes podem ser descritas da seguinte maneira (em pseudo-có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();
}
As paredes de uma sala nunca podem se cruzar em lugar algum, mas nos pontos finais dos segmentos e quaisquer "sub-loops" criados também serão separados em uma nova sala. A solução não precisa ser perfeitamente precisa (margem de erro de 10% é aceitável) e também não é calculada com muita frequência (<1 / s).
Room
conter uma lista dePoint
s e, em seguida, obter os segmentos conectando cada ponto e, em seguida, repetindo-o. Caso contrário, com a sua configuração atual, é muito leste para obter valores incorretos (por exemplo, sala não fechada, sala com parede no meio, etc.). Essa seria a melhor opção.Room
s esteja sempre completa, e esse pode não ser o caso se eu tiver o jogador construindo osRoom
usandoSegment
s. Além disso, é fácil definir uma função de sala fechada (basta percorrer osSegment
se certificar-se de que eles criam uma sala).Respostas:
Você pode usar a fórmula do cadarço de Gauss :
Você precisa pegar a coordenada x de cada ponto, multiplicá-la pela coordenada y do próximo ponto e subtrair a coordenada y do ponto atual multiplicada pela coordenada x do próximo ponto do resultado e adicioná-las à área total. Depois de fazer isso para cada ponto, reduza pela metade a área total para obter a área real do polígono. Se o ponto atual é o último, o próximo é o primeiro.
fonte
A
será negada. Dependendo do objetivo, umA = |A|
pode ser necessário. Com código de área negativo, é possível encontrar a área em uma rosca irregular usando a lista de pontos interna e externa (uma na ordem oposta).Também poderíamos usar um método de Monte Carlo.
Desenhe um retângulo ao redor da forma arbitrária. Pegue uma fonte de PRNG uniformemente distribuída, por exemplo. mersenne twister, em seguida, limite a saída pelos comprimentos X, Y do retângulo usando a função modulo. Conte o não. de pontos aleatórios que caem dentro da sua forma. Divida pela quantidade total de pontos gerados. Multiplique esse quociente pela área do retângulo. Com cada iteração, você convergirá para a área verdadeira. O algoritmo é ridiculamente parrallelizable e pode ser usado para calcular 'volumes' arbitrários de formas dimensionais, desde que você possa determinar se uma coordenada R ^ N cai dentro do limite R ^ N da forma..
fonte
Outra abordagem: não.
Em vez de:
Basicamente, corte um triângulo. A área de um triângulo é simples e, ao fazer isso, reduzimos a contagem de segmentos do restante em um. Repita até que restar um triângulo.
fonte