Cómo calcular la pendiente de un punto sobre un conjunto de datos de terreno (por ejemplo Elevación Digital Matrix)

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

Pregunta

Quiero poner en práctica un juego de carreras de coches en 3D y necesito para aproximarse a la magnitud y la dirección de la pendiente de cualquier punto arbitrario en un terreno.

Formato de Datos Terreno:
- alturas [] []: matriz 2D de flotadores (que representa alturas en metros)
- unidad: unidad de distancia horizontal entre (i, j) - (i, j + 1) y entre (i, j) - (i + 1, j) en metros

Ejemplo:

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

¿Cuál es el valor y la dirección de la pendiente en el punto de, digamos, (x = 1,75 metros, y = 2,25 metros)?

¿Cuál sería su algoritmo de interpolación?

¿Fue útil?

Solución

Se podría, por supuesto interpolar linealmente a lo largo tanto los ejes X e Y, es decir, primero interpolar el valor de y para las coordenadas x que son más bajos y más altos que el valor de x real dos veces - una vez para la coordenada y más bajo que el real y el valor y una vez para el valor de y por encima de su valor y real. Esto le da dos valores de y que se puede interpolar entre linealmente para obtener la altura.

Con el fin de encontrar la pendiente es necesario encontrar la normal en ese punto. Para encontrar la normal, entonces podría hacer una interpolación de la misma manera. Teniendo en cuenta uno de los parches (determinado por cuatro puntos A: (X1, Y1), B: (x2, y1), C: (x2, y2) y D: (x1, y2), x1

linealmente interpolar la normal en el mismo modo que para la altura. No sé en qué formato desea que la pendiente, pero si quieres un vector que apunta en la dirección de la pendiente, que a continuación se calcularía S = N - arriba, donde hasta es simplemente el vector hacia arriba (en este ejemplo (0,0,1) dado que está utilizando Z como arriba.

Otro enfoque sería tesselate los cuadrados en triángulos, ABD y BCD, por ejemplo. La normal para todo el triángulo sería entonces AB x AD y BC x BD respectivamente. En ese caso, echar un vistazo a http://www.cc. gatech.edu/classes/AY2007/cs3451_spring/lininter.pdf por ejemplo sobre cómo interpolar la altura sobre el triángulo. Este enfoque le da triángulos lisos, pero hay diferencias notables en la pendiente entre triángulos adyacentes.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top