Como calcular a inclinação de um ponto em um terreno de dados (e.g.Digital De Elevação Matriz)

StackOverflow https://stackoverflow.com/questions/2060813

Pergunta

Quero implementar um 3D jogo de corrida de carro e eu preciso aproximar a magnitude e a direcção da inclinação de qualquer ponto arbitrário em um terreno.

Terreno De Formato De Dados:
- heights[ ][ ]:Array 2D de carros alegóricos (representando alturas em metros)
- unidade:unidade horizontal distância entre (i, j) (i, j+1) e entre (i, j) - (i+1, j) em metros

Ex:

3|1311
2|2542 <-- 2D array of heights in meters
1|2231   (unit distance between two cell is, say, 1 meters)
0|1121   (so the highest point of the terrain (x = 1.5 meters, y = 2.5 meters)
  ----      is 5 meters high)
  0123

Qual é o valor e o sentido do declive a ponto de, digamos, (x = 1,75 metros, y = 2.25 metros)?

O que seria o seu algoritmo de interpolação ser?

Foi útil?

Solução

Você poderia, claro, interpolar linearmente ao longo de ambos os eixos x e y, ou seja, primeiro interpolar o valor de y para x coordenadas que são mais baixas e mais altas do que o seu real valor de x duas vezes - uma vez para a coordenada y inferior ao seu real valor de y e de um momento para o valor de y maior do que o seu real valor de y.Isto dá-lhe dois valores de y que você pode interpolar linearmente entre para obter a altura.

Para encontrar a inclinação que você precisa para encontrar o normal naquele ponto.Para encontrar o normal, você poderia, então, fazer uma interpolação da mesma forma.Dado um dos patches (determinado por quatro pontos A:(x1,y1), B:(x2, y1), C:(x2,y2) e D:(x1,y2) x1 < x2, y1 < y2 e cada ponto também inclui a altura), pode-se dizer que o normal em um dos pontos de dizer, é determinado pelo produto vetorial dos vetores AB e AD.O normal em B é BC x BA da mesma forma.

Interpolar linearmente normal, da mesma forma que para a altura.Eu não sei em que formato você deseja a encosta, mas se você quiser um vetor apontando na direção da encosta, que iria então ser calculado por: S = N - Up, onde Até é simplesmente o até vetor (neste exemplo (0,0,1) desde que você está usando Z como para cima.

Outra abordagem seria tesselate os quadrados em triângulos ABD e BCD, por exemplo.O normal para todo o triângulo, em seguida, seria AB x AD e BC x BD, respectivamente.Nesse caso, dê uma olhada no http://www.cc.gatech.edu/classes/AY2007/cs3451_spring/lininter.pdf por exemplo, de como interpolar a altura do triângulo.Esta abordagem dá-lhe suave triângulos, mas há diferenças notáveis na inclinação entre triângulos adjacentes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top