Redimensionar polígono ao longo de um eixo

8

Usando o exemplo a seguir , sou capaz de redimensionar por escala e origem.

    polygonFeature.geometry.resize(scale, origin);
    vectorLayer.redraw();

Mas alguém tem alguma sugestão ou código de exemplo sobre como eu redimensionaria um polígono em um de seus eixos?

Por exemplo: eu gostaria de redimensionar o polígono laranja para algo como o polígono vermelho. Portanto, apenas as bordas norte e sul se movem, enquanto as bordas leste-oeste permanecem constantes.

insira a descrição da imagem aqui

EDIT # 1 Aqui está um caso de uso e dados de exemplo: Um usuário deseja apenas uma parte do retângulo laranja porque está interessado apenas no litoral e os fornecedores de satélite cobrarão mais por toda a imagem. O usuário precisa especificar qual parte da imagem que deseja solicitar.

Embora, eu não precise de toda a solução com alças de dimensionamento, tudo que eu preciso é a capacidade de redimensionar a altura do polígono .

insira a descrição da imagem aqui insira a descrição da imagem aqui

insira a descrição da imagem aqui

Edição # 2: Talvez eu esteja fazendo isso errado. Preciso de uma solução de javascript (navegador) de openlayers e não posso voltar ao servidor para redimensionar. Talvez o que eu deva fazer seja interpolar pontos ao longo das bordas leste e oeste da geometria do polígono (pontos pretos). Em seguida, crie duas linhas (linhas verdes) nas quais o usuário pode arrastar, mas restringir o movimento (draging) para esses pontos interpolados. Quando o usuário está "pronto", recebo o polígono amarelo restante?

insira a descrição da imagem aqui

CaptDragon
fonte
2
O polígono é sempre um retângulo? As arestas estão arbitrariamente alinhadas ou seguem alguma orientação da grade do mapa de um sistema de referência de coordenadas?
Mike T
Boa pergunta, bem, na realidade, sempre será um retângulo, então SIM. Eles são geodésicos e é por isso que as bordas superior e inferior não são (ou não parecem ser) as mesmas. São faixas de satélite e, portanto, circulam pelo mundo, mas no EPSG: 4326 sobem e descem em linhas onduladas.
CaptDragon
@ Mike: veja Edit # 1 para mais detalhes.
CaptDragon
O que você procura é uma transformação transformadora , exceto que eu não conheço tão bem os openlayers para ver se ele suporta isso. Tenho certeza de que alguém pode concordar com esse lead para fornecer uma resposta
Mike T
Eu fiz a transformação afim ... observe como a imagem está alinhada corretamente no mapa lateralmente ... eu realmente só preciso redimensionar a altura do polígono.
CaptDragon

Respostas:

1

No caso geral, eu usaria uma transformação de perspectiva para transformar seu quadrilátero original em um quadrado de unidade e vice-versa.

Os passos básicos são:

  1. Encontre a matriz de transformação afim do quadrilátero para o quadrado da unidade.
  2. Dimensione o quadrado da unidade na mesma proporção em que o usuário deseja dimensionar o quad original.
  3. Inverta a matriz obtida na etapa 1.
  4. Aplique essa matriz inversa ao quadrado compactado para transformá-lo novamente no espaço do mapa.

Ressalvas:

  • Verifique se você possui uma matriz válida e se é invertível.
  • Só funcionará com sucesso com quadriláteros convexos.

Para o trabalho que você está realizando, você não deve ter casos estranhos, como polígonos côncavos. Não tenho certeza do que aconteceria com os quadríceps que cobrem as regiões polares, suspeito que você teria que projetá-lo primeiro em alguma projeção polar.

O link postado na etapa 1. leva a um artigo pesado em matemática e a algum código pesado em modelo C ++. Mas não deve ser muito difícil descobrir como o código funciona, porque é apenas uma pequena função na parte superior do arquivo .

MerseyViking
fonte
Obrigado ... mas eu realmente preciso de uma solução javascript openlayers.
CaptDragon
1
A matemática é muito mais simples e mais geral do que isso. Deixe o quad ter vértices (x0, x1, x2, x3) (em ordem), onde você deseja fixar o lado x0x1. Reescaloná-lo por um fator a ao longo dos lados x1x2 e x0x3 cria o novo polígono (x0, x1, x2 ', x3') em que x2 '= x1 + (x2-x1) * ae x3' = x0 + (x3-x0) * uma. É melhor trabalhar em coordenadas projetadas.
whuber