Как вычислить наклон точки на данные об местности (например, матрица цифровой высоты)

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

Вопрос

Я хочу внедрить игру 3D -автомобильных гонок, и мне нужно приблизиться к величине и направлению наклона любой произвольной точки на местности.

Формат данных об местности:
- Heights [] []: 2D массив поплавков (представляющий высоты в метрах)
- Блок: Горизонтальное расстояние единицы между (i, j) - (i, j+1) и между (i, j) - (i+1, j) в метрах

Бывший:

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

Каково значение и направление наклона в точке, скажем, (x = 1,75 метра, y = 2,25 метра)?

Каким будет ваш алгоритм интерполяции?

Это было полезно?

Решение

Вы, конечно, можете линейно интерполировать вдоль оси x и y, то есть сначала интерполировать значение y для координат x, которые ниже и выше, чем ваше фактическое значение x два раза - один раз для координаты y ниже вашего фактического значения y и один раз для значения y выше вашего фактического значения Y. Это дает вам два значения Y, которые вы можете линейно интерполировать между высотой.

Чтобы найти наклон, вам нужно найти нормальный в этот момент. Чтобы найти нормальное, вы можете сделать интерполяцию таким же образом. Учитывая один из пятен (определяется четырьмя точками a: (x1, y1), b: (x2, y1), c: (x2, y2) и d: (x1, y2), x1 <x2, y1 <y2 и Каждая точка также включает в себя высоту) Вы можете сказать, что нормальная в одной из точек, скажем, A, определяется поперечным продуктом векторов AB и AD. Нормальный в B - BC X BA таким же образом.

Линейно интерполяция нормальной, так же, как и для высоты. Я не знаю, в каком формате вы хотите наклон, но если вы хотите, чтобы вектор указывал в направлении наклона, который затем будет рассчитан по s = n - up, где вверх - это просто вектор (в этом примере (0,0,1), так как вы используете Z в качестве вверх.

Другим подходом будет то, чтобы ввести квадраты в треугольники, ABD и BCD, например. Нормальным для всего треугольника будет тогда AB x AD и BC X BD соответственно. В этом случае взгляните на http://www.cc.gatech.edu/classes/ay2007/cs3451_spring/lininter.pdf Например, как интерполировать высоту на треугольнике. Этот подход дает вам гладкие треугольники, но есть заметные различия в склоне между соседними треугольниками.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top