Mam obiekt pokoju zdefiniowany przez kolekcję zapętlonych segmentów linii, dla których muszę obliczyć powierzchnię. Klasy można opisać następująco (w pseudokodzie):
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();
}
Ściany pokoju nigdy nie mogą się przecinać, ale w punktach końcowych segmentów, a wszelkie utworzone „pętle podrzędne” również zostaną rozdzielone na nowe pomieszczenie. Rozwiązanie nie musi być idealnie dokładne (dopuszczalny margines błędu 10%), a także nie jest obliczane bardzo często (<1 / s).
Room
listyPoint
s, a następnie pobranie segmentów przez połączenie każdego punktu razem, a następnie zapętlenie go z powrotem. W przeciwnym razie, przy obecnej konfiguracji, otrzymanie nieprawidłowych wartości (np. Niezamknięty pokój, pokój ze ścianą pośrodku itp.) Jest bardzo na wschód. To byłaby najlepsza opcja.Room
s było zawsze kompletne, i może się tak nie zdarzyć, jeśli odtwarzacz zbuduje jeRoom
za pomocąSegment
s. Ponadto, funkcja zamkniętego pokoju jest łatwa do zdefiniowania (po prostu przejdź przezSegment
s i upewnij się, że tworzą pokój).Odpowiedzi:
Możesz użyć wzoru sznurowadła Gaussa :
Musisz wziąć współrzędną x każdego punktu, pomnożyć je przez współrzędną y następnego punktu, a następnie odjąć współrzędną y bieżącego punktu pomnożoną przez współrzędną x następnego punktu od wyniku i dodać je do całkowitego obszaru. Po wykonaniu tego dla każdego punktu, zmniejsz o połowę łączną powierzchnię, aby uzyskać rzeczywistą powierzchnię wielokąta. Jeśli bieżący punkt jest ostatnim, następny jest pierwszy.
źródło
A
zostanie zanegowany. W zależności od celuA = |A|
może być konieczne. Przy ujemnym numerze kierunkowym można znaleźć obszar na nieregularnym pączku, korzystając z wewnętrznej i zewnętrznej listy punktów (jeden w odwrotnej kolejności).Możemy również zastosować metodę Monte Carlo.
Narysuj prostokąt wokół dowolnego kształtu. Weź równomiernie rozłożone źródło PRNG, np. mersenne twister, a następnie związano wynik za pomocą długości X, Y prostokąta za pomocą funkcji modulo. Policz nie. losowych punktów, które wylądują w twoim kształcie. Podziel przez całkowitą liczbę wygenerowanych punktów. Pomnóż ten iloraz przez pole prostokąta. Z każdą iteracją zbliżasz się do prawdziwego obszaru. Algorytm jest absurdalnie paralelizowalny i może być używany do obliczania „objętości” dowolnych kształtów wymiarowych, o ile można ustalić, czy współrzędna R ^ N mieści się w granicy R ^ N kształtu..
źródło
Inne podejście: nie.
Zamiast:
Zasadniczo odetnij trójkąt. Obszar trójkąta jest prosty i dzięki temu zmniejszyliśmy liczbę pozostałych segmentów o jeden. Powtarzaj, aż pozostanie trójkąt.
źródło