Estou tentando criar um algoritmo semelhante à caixa delimitadora mínima (embora possa acabar parecendo nada com isso). Nesse caso, o ângulo será passado como parâmetro e, devido ao ângulo, preciso do menor retângulo que cubra todos os meus pontos / polígonos. Até agora, minha linha de pensamento é encontrar o centro dos meus pontos (algoritmo centróide) e, a partir daí, criar duas linhas paralelas com o mesmo ângulo que o ângulo do parâmetro, e mais duas linhas perpendiculares a elas. Em seguida, usando a iteração, mova essas linhas para fora (em direções opostas) até que elas contenham todos os pontos. Também não precisa ser a caixa delimitadora mínima exata, trabalhos aproximados (acho que dependeriam do tamanho de cada etapa da iteração).
Aqui esta o meu codigo ate agora. Eu já dissolvi todos os meus polígonos em um. Depois, pego um casco convexo para reduzir os vértices. Em seguida, coloco todos os vértices em uma lista - não tenho certeza se isso ajuda ainda ...
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)
Notas: Em algum momento, preciso passar o ângulo da caixa. Estou usando o QGIS 3 e preciso criar isso em Python. A camada 'layer' possui uma geometria, o polígono dissolvido de todos os outros polígonos - talvez a iteração não seja necessária para acessá-lo.
Informe-me se eu deveria passar mais detalhes / informações.
Respostas:
Aqui está o código completo. Ele contém muitas linhas (muito mais do que o necessário, com certeza), mas funciona. Agora você pode limpá-lo, se quiser.
Em resumo, o algoritmo calcula a distância máxima entre as linhas paralelas que têm a inclinação definida pelo parâmetro de rotação e passam pelos pontos. Para cada ponto, será criada uma linha 'horizontal' e 'vertical'. Esses nomes são apenas orientativos, pois são definidos na posição 0 (rotação = 0). Assim, para cada ponto externo, serão criadas essas 2 linhas possíveis e, iterativamente, o polígono será criado com base nas 4 externas, ou dito de outra maneira, onde a distância das linhas paralelas é máxima.
Uma última coisa: é feito para ser usado no QGIS 3.8 com grama.
fonte