Mam zamknięty nie przecinający się wielokąt. Jego wierzchołki są zapisywane w dwóch wektorach X i Y. Ostatecznie wartości X i Y są powiązane między 0 a 22.Jaki jest prosty sposób obliczenia nakładania się obrazu i wielokąta?
Chciałbym zbudować macierz o rozmiarze 22x22 i ustawić wartość każdego pojemnika równą true, jeśli część wielokąta pokrywa się z tym binem, w przeciwnym razie false.
Moją pierwszą myślą było wygenerowanie siatki punktów zdefiniowanych za pomocą [a, b] = meshgrid(1:22)
, a następnie użycie inpolygon
do określenia, które punkty siatki znajdowały się w wielokącie.
[a b] = meshgrid(1:22);
inPoly1 = inpolygon(a,b,X,Y);
Jednak to tylko zwraca true jeśli jeśli środek pojemnika zawarta jest w wieloboku, czyli zwraca czerwony kształt na obrazku poniżej. Jednak to, co jest potrzebne, jest bardziej zbliżone do zielonego kształtu (choć nadal jest to rozwiązanie niepełne).
Aby uzyskać zieloną plamę, wykonałem cztery połączenia z numerem inpolygon
. Dla każdego porównania przesunąłem siatkę punktów NE, NW, SE lub SW o 1/2. Jest to równoważne sprawdzeniu, czy rogi kosza znajdują się w wielokącie.
inPoly2 = inpolygon(a-.5,b-.5,X,Y) | inpolygon(a+.5,b-.5,X,Y) | inpolygon(a-.5,b+5,X,Y) | inpolygon(a+.5,b+.5,X,Y);
Mimo to daje mi częściowe rozwiązanie to nie działa w przypadku, gdy wierzchołek znajduje się zawierać w kosza, ale żaden z kosza rogach są.
Czy istnieje bardziej bezpośredni sposób na zaatakowanie tego problemu, najlepiej za pomocą rozwiązania, które zapewnia bardziej czytelny kod?
Wykres ten został sporządzony z:
imagesc(inPoly1 + inPoly2); hold on;
line(a, b, 'w.');
line(X, Y, 'y);
Należy odejść od komputera, ale uznałem, że oferuję ogólne rozwiązanie, które może pomóc. Najpierw skaluj siatkę mesh do wielokrotności 22, aby zdefiniować obszar o gęstości równej lub większej niż ta, której używasz dla wierzchołków - to usunie problem z narożnikiem. Następnie, aby wrócić do siatki o wymiarach 22 na 22, możesz po prostu podzielić ten sam współczynnik, do którego przeskalujesz, piętrząc punkty na górze/lewo i suficie na dole/na prawo. Nadzieję, że pomaga – Salain