Я пытаюсь создать алгоритм, похожий на минимальный ограничивающий прямоугольник (хотя он может выглядеть совсем не так). В этом случае угол будет передан в качестве параметра, и, учитывая угол, мне нужен наименьший прямоугольник, охватывающий все мои точки / многоугольники. Пока что моя мысль состоит в том, чтобы найти центр моих точек (алгоритм центроида), и оттуда создать две параллельные линии с тем же углом, что и угол параметра, и еще две линии, перпендикулярные им. Затем с помощью итерации переместите эти линии наружу (в противоположных направлениях), пока они не будут содержать все точки. Также не обязательно должен быть точный минимальный ограничивающий прямоугольник, приблизительные работы (я думаю, это будет зависеть от размера каждого шага итерации).
Вот мой код до сих пор. Я уже разложил все свои полигоны в один. Затем я беру выпуклый корпус, чтобы уменьшить вершины. Затем я помещаю все вершины в список - не уверен, поможет ли это еще ...
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)
Примечания: В какой-то момент мне нужно пройти угол коробки. Я использую QGIS 3, и мне нужно создать это на Python. Слой 'layer' имеет одну геометрию, растворенный многоугольник всех других многоугольников - возможно, итерация не нужна для доступа к нему ..
Пожалуйста, дайте мне знать, если я буду передавать более подробную информацию / информацию.
Ответы:
Вот полный код. Он содержит слишком много строк (гораздо больше, чем нужно), но работает. Теперь вы можете очистить его, если хотите.
В резюме алгоритм вычисляет максимальное расстояние между параллельными линиями, у которых наклон определен параметром вращения и проходит через точки. Для каждой точки будет создана «горизонтальная» и «вертикальная» линия. Эти имена являются только ориентировочными, поскольку они определены в позиции 0 (вращение = 0). Таким образом, для каждой внешней точки будут созданы эти 2 возможные линии, а затем, итеративно, полигон будет создан на основе 4 внешних или, иначе говоря, где расстояние параллельных линий является максимальным.
И последнее: это сделано для использования в QGIS 3.8 с травой.
источник