J'ai un objet de pièce défini par une collection de segments de ligne en boucle dont j'ai besoin pour calculer l'aire. Les classes peuvent être décrites comme suit (en pseudo-code):
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();
}
Les murs d'une pièce ne peuvent jamais se croiser n'importe où, mais aux extrémités des segments et les "sous-boucles" créées seront également séparées dans une nouvelle pièce. La solution n'a pas besoin d'être parfaitement précise (une marge d'erreur de 10% est acceptable) et n'est pas non plus calculée très souvent (<1 / s).
Room
de contenir une liste dePoint
s, puis d'obtenir les segments en connectant chaque point ensemble, puis en le bouclant. Sinon, avec votre configuration actuelle, il est très à l'est d'obtenir des valeurs incorrectes (par exemple une pièce non fermée, une pièce avec un mur au milieu, etc.). Ce serait la meilleure option.Room
s soit toujours complet, et ce ne sera peut-être pas le cas si je demande au joueur de construire lesRoom
s en utilisantSegment
s. De plus, une fonction de pièce fermée est facile à définir (il suffit de parcourir lesSegment
s et de s'assurer qu'ils créent une pièce).Réponses:
Vous pouvez utiliser la formule de lacet de Gauss :
Vous devez prendre la coordonnée x de chaque point, les multiplier par la coordonnée y du point suivant, puis soustraire la coordonnée y du point actuel multipliée par la coordonnée x du point suivant du résultat et les ajouter à la zone totale. Après avoir fait cela pour chaque point, divisez par deux la surface totale pour obtenir la surface réelle du polygone. Si le point actuel est le dernier, alors le suivant est le premier.
la source
A
est annulée. Selon l'objectif, unA = |A|
peut être nécessaire. Avec un code de zone négatif, vous pouvez trouver la zone sur un beignet irrégulier en utilisant la liste de points intérieure et extérieure (une dans l'ordre opposé).Nous pourrions également utiliser une méthode de Monte Carlo.
Tracez un rectangle autour de la forme arbitraire. Prenez une source PRNG uniformément distribuée, par exemple. mersenne twister, puis a lié la sortie par les longueurs X, Y du rectangle à l'aide de la fonction modulo. Comptez le non. de points aléatoires qui atterrissent à l'intérieur de votre forme. Divisez par le nombre total de points générés. Multipliez ce quotient par la zone du rectangle. À chaque itération, vous convergerez vers la vraie zone. L'algorithme est ridiculement parrallélisable et peut être utilisé pour calculer des volumes de forme dimensionnelle arbitraires, tant que vous pouvez déterminer si une coordonnée R ^ N tombe dans la limite R ^ N de la forme..
la source
Une autre approche: ne le faites pas.
Au lieu:
Fondamentalement, coupez un triangle. L'aire d'un triangle est simple et, ce faisant, nous avons réduit le nombre de segments du reste d'une unité. Répétez jusqu'à ce que ce qui reste soit un triangle.
la source