Estou tentando converter uma coordenada de um sistema de coordenadas para outro, para que eu possa desenhar em uma imagem.
Basicamente, o sistema de coordenadas de destino é o seguinte:
X range: 0 to 1066
Y range: 0 to 1600
(apenas uma imagem padrão na qual estou desenhando com o tamanho de 1066 x 1600)
A posição que estou tentando desenhar na imagem tem exatamente o mesmo tamanho, mas o sistema de coordenadas é diferente. O período de todas as coordenadas é 1066x1600.
Mas um exemplo de coordenadas seria:
(111.33f, 1408.41f)
(-212.87f, 1225.16f)
O alcance deste sistema de coordenadas é:
X range: -533.333 to 533.333
Y range: 533.333 to 2133.333
Eu sinto que isso é matemática MUITO simples, mas por alguma razão eu não estou entendendo.
Como posso converter as coordenadas fornecidas no primeiro sistema de coordenadas?
2d
coordinates
Geesu
fonte
fonte
Respostas:
Você pode normalizar o primeiro valor, isso fornecerá um valor no intervalo [0,1]. Você pode pensar nisso como X porcentagem, a porcentagem que o valor é mapeado entre os valores mínimo e máximo. Em seguida, você pode descobrir onde essa porcentagem pertence ao seu sistema de coordenadas de destino, vendo qual valor é X porcentagem no sistema de destino. Vou usar o código Java como uma linguagem de exemplo. Tenho certeza de que os conceitos são claros o suficiente para traduzir para qualquer linguagem.
Então normalize:
Usando seu exemplo, você inseriu:
Em seguida, encontre onde está o sistema de destino. Com algo como
Ou para usar seus valores:
Assim, por exemplo, com um valor x de 1000, você mapeará isso para o seu sistema de coordenadas de destino
467.29
.Como alternativa , se os sistemas de coordenadas sempre forem os mesmos, você poderá pré-calcular a proporção entre eles.
Assim:
fonte
É uma matemática simples:
src - sistema de coordenadas de origem
res - sistema de coordenação de resultados
Editar - explicação da matemática
( src - src_min ) / ( src_max - src_min )
converte-o para coordenar o sistema começando em zero com o mesmo comprimento do sistema de coordenadas de origem(0.0, src_max - src_min )
. Em seguida, ele escala o valor para coordenar o sistema(0.0, 1.0)
.* ( res_max - res_min )
isso dimensiona o valor para coordenar o sistema começando em zero com o comprimento do sistema de coordenação de resultados(0.0, dst_max - dst_min)
+ res_min
converte valor no sistema de coordenadas resultante(dst_min, dst_max)
fonte
A equação básica para a transformação de coordenadas 2D (em álgebra, sem rotação envolvida) é:
dado dois pontos no TargetCoordinate (T1, T2) que corresponde a dois pontos no SourceCoordinate (S1, S2)
TranslateFactor
eScalingFactor
é dado resolvendo:qual resultado:
No seu caso, para a coordenada x
E assim,
As coordenadas y seguem o mesmo procedimento
fonte
Fazendo algumas suposições:
Em seguida, a pergunta migra para: Qual é a matriz de transformação homogênea para minha mudança de base?
Para responder a isso, precisamos primeiro das respostas para três perguntas subsidiárias:
Defina as respostas para estas três perguntas da seguinte forma:
Então a matriz de transformação homogênea é:
Minha convenção aqui é que os pontos são representados por vetores de linha, que é a convenção normal de computação gráfica; os matemáticos e físicos costumam usar o opsoso.
fonte