Próbuję utworzyć algorytm podobny do minimalnego obwiedni (chociaż może nie wyglądać tak samo). W tym przypadku kąt zostanie przekazany jako parametr i biorąc pod uwagę kąt, potrzebuję najmniejszego prostokąta obejmującego wszystkie moje punkty / wielokąty. Jak dotąd moja linia myślenia polega na znalezieniu środka moich punktów (algorytm centroid), a stamtąd stwórz dwie równoległe linie o tym samym kącie co kąt parametru i dwie kolejne linie prostopadłe do nich. Następnie za pomocą iteracji przesuwaj te linie na zewnątrz (w przeciwnych kierunkach), aż będą zawierać wszystkie punkty. Nie musi to być również dokładna minimalna ramka ograniczająca, przybliżone prace (myślę, że zależy to od wielkości każdego kroku iteracji).
Oto mój kod do tej pory. Wszystkie moje wielokąty rozpuściłem już w jednym. Następnie biorę wypukły kadłub, aby zmniejszyć wierzchołki. Następnie umieszczam wszystkie wierzchołki na liście - nie jestem pewien, czy to jeszcze pomaga ...
a = layer.getFeatures()
for feat in a:
geom = feat.geometry()
a = geom.convexHull()
vertexId = QgsVertexId()
vertices = []
b = a.constGet().nextVertex(vertexId)
while b[0]:
vertices.append(b[1])
b = a.constGet().nextVertex(vertexId)
Uwagi: W pewnym momencie muszę przekroczyć kąt pola. Korzystam z QGIS 3 i muszę to utworzyć w Pythonie. Warstwa „warstwa” ma jedną geometrię, rozpuszczony wielokąt ze wszystkich innych wielokątów - być może iteracja nie jest wymagana, aby uzyskać do niego dostęp.
Daj mi znać, czy powinienem przekazać więcej szczegółów / informacji.
Odpowiedzi:
Oto pełny kod. Zawiera zbyt wiele wierszy (na pewno więcej niż potrzeba), ale działa. Teraz możesz go wyczyścić, jeśli chcesz.
W celu wznowienia algorytm oblicza maksymalną odległość między liniami równoległymi, których nachylenie jest zdefiniowane przez parametr obrotu i przechodzi przez punkty. Dla każdego punktu zostanie utworzona linia „pozioma” i „pionowa”. Te nazwy są orientacyjne, ponieważ są zdefiniowane w pozycji 0 (obrót = 0). Tak więc dla każdego punktu zewnętrznego zostaną utworzone te 2 ruchome linie, a następnie iteracyjnie wielobok zostanie utworzony na podstawie 4 zewnętrznych, lub mówiąc inaczej, gdzie odległość linii równoległych jest maksymalna.
I ostatnia rzecz: jest przeznaczony do użytku w QGIS 3.8 z trawą.
źródło