Estou tentando extrapolar de um segmento de linha para encontrar um ponto na linha, mas um terceiro do caminho 'voltar', ou seja, tentando encontrar um ponto new
, dados os pontos A
e B
abaixo:
Dada uma linha, eu posso interpolar para obter uma posição em qualquer porcentagem específica:
=# select st_line_interpolate_point(
st_makeline('0101000020E6100000300DC347C49418C03EE8D9ACFAA44A40',
'0101000020E6100000FB743C66A03218C0CDCCCCCCCC7C4A40'),
0.333);
0101000020E6100000ED45B41D537718C069C6A2E9EC984A40
Tentei inserir um número negativo para encontrar um ponto ao longo da linha na direção oposta, mas isso falha porque o argumento de interpolação deve estar no intervalo [0, 1]
Pensei em escalar a linha primeiro, mas isso não usa o centro da linha como origem, por isso é inútil para meus propósitos.
fonte
Resolva-o com:
Explicação:
(2-d) Escale o ponto inicial por um fator de 1,3333, tomando o ponto médio do segmento de linha como a origem do dimensionamento.
Saia do papel milimetrado!
http://en.wikipedia.org/wiki/Affine_transformation
fonte
Eu escrevi uma função para isso:
Uso:
Observe que isso gera a cadeia de linhas mais longa, mas não o terminal.
Código no GitHub Gist (se você votar aqui, eu também apreciaria uma estrela lá)
Descrição dos parâmetros (caso você os tenha perdido no comentário da função sql):
fonte
original_length * head_rate + head_constant
. Se você deseja duplicar, a taxa de cabeça é 2, a constante é 0. Na Hungria, normalmente usamos projeção EOV, que é baseada em medidores. Portanto, se eu quiser adicionar 2 metros ao final da linha, defino a cauda: rate como 1 e tail_constant como 2.