Страница: 1 |
Страница: 1 |
Вопрос: Интерполяция 3D-массива
Добавлено: 24.02.11 22:11
Автор вопроса: VβÐUηìt | Web-сайт:
Есть задача. Дан массив чисел.
Есть массив 3D-точек.
public NumberPoint3D[] Points = new NumberPoint3D[n];
То есть в скалярном поле Numbers дано n точек с указанными значениями. Нужно запилить промежуточные значения, а-ля интерполировать это все дело, и в каждый элемент массива Numbers внести соответствующее значение. Желательно по линейному закону. Тобишь что-то типа такой функции:
void Interpolate3D (float[,,] PointArray, NumberPoint3D[] KeyPoints)
{
...
}
По идее нужно рассматривать в трех проекциях и зырить по сечениям. Но мой моцк как-то не может это все осознать. Как-то так.
Подкините идей? Или, может, код? :) Ну вдруг кто-то уже сталкивался :)
Заранее благодарен.
Ответы
Всего ответов: 12
Номер ответа: 1
Автор ответа:
Захарка
Вопросов: 0
Ответов: 42
Профиль | | #1
Добавлено: 25.02.11 00:45
Как я понял тебе надо эти точки это координаты в массиве numbers? И по ним надо построить линии? Если так, то как вам такой вариант:
1) Ставим первые 2 точки
2) Узнаём расстояние между ними по 3-м осям(пусть этои значения будут x,y,z)
3) По этим расстояниям находим самое большое(маленькое), например это будет x, после чего находим b = x/y и c = x/z
4) Возьмём a = 1, после чего мы просто в цикле от 0 до x пройдём по элементам массива отмечая элементы с координатами полученными прибавлением к старым(x,y,z) чисел a,b и c соответственно.
Ну както так. Единственная проблема что значения a,b,c скорее всего получатся дробными, но в принципе их можно округлить, не думаю, что может выйти чтото страшное.
Номер ответа: 2
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #2
Добавлено: 25.02.11 02:48
Есть алгоритмы для этого, тысячи их. не поленись погуглить.
Номер ответа: 3
Автор ответа:
AgentFire
ICQ: 192496851
Вопросов: 75
Ответов: 3178
Профиль | | #3
Добавлено: 25.02.11 10:46
MDX умеет интерполировать трехмерные координаты. У него куча полезнейших для этого и не только есть функций.
Номер ответа: 4
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #4
Добавлено: 25.02.11 11:32
I hate you
Давай уже примеры
Номер ответа: 5
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #5
Добавлено: 25.02.11 12:17
Самое простое что в голову приходит - расставить недостающие опорные точки (по 2 между каждой парой точек) и по ним провести кубическую кривую безье (можно нагенерить чуть менее чем бесконечность промежуточных точек)
Номер ответа: 6
Автор ответа:
AWP
ICQ: 345685652
Вопросов: 96
Ответов: 1212
Web-сайт:
Профиль | | #6
Добавлено: 25.02.11 14:31
Точки какую-то фигуру составляют?
Если да, то они наверняка треугольниками сделаны. А Треугольник на 3 разделить просто.
Если нет, то нужно сначала объединить в группы треугольников.
Берешь точку, ищешь две ближайшие к ней, у которых меньше 3-х связей, создаешь связи, создаешь промежуточные точки.
И так для каждой.
Можно предварительно отсортировать точки по расстоянию от первой, т.к. поиск в массиве будет не по всем точками, а по всем следующим после текущей. Это ускорит обработку.
Номер ответа: 7
Автор ответа:
AWP
ICQ: 345685652
Вопросов: 96
Ответов: 1212
Web-сайт:
Профиль | | #7
Добавлено: 25.02.11 14:36
Это при линейной!
Если не линейную брать, то делаешь тоже самое, но разбиваешь треугольник на 3 по центру и делаешь интерполяцию по двум соседним вершинам и центром треугольника(3 точки)
Номер ответа: 8
Автор ответа:
VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #8
Добавлено: 25.02.11 16:17
Никакую они фигуру не составляют. Есть трехмерное скалярное ограниченное поле (ограничено кубиком, то есть обычный 3D-массив). Дан некоторый набор точек этого поля, в которых известны значения этого поля. Необходимо вычислить все остальные значения в этом поле. Не только лежащие на линиях или там на кривой безье, которая проходит черзе точки, а вообще все значения в поле. Совсем все. Естественно, поле дискретно и ограничено.
Да я тут смекнул:
1) Берем массив точек, создаем еще три массива, в каждый копируем все данные точки. То есть делаем три копии существующего массива.
2) Первый массив сортируем по X, второй по Y, третий по Z. (Вы помните, что каждой данной точке соотвествует X,Y,Z и Value - ее значение. Ну еще номер в массиве).
3) Делаем тройной вложенный цикл всех точек поля
4) Для любого значения X существует пара точек в массиве X, между которыми находится данная точка. На основании значений этих двух опорных точек, их координат X и координаты X текущей точки вычисляем проекцию значения по X. Например, линейно.
5) Делаем то же самое для Y и Z - то есть ищем две ближайшие точки в массивах опорных точек, отсортированных по Y и Z соответственно.
6) Получаем три проекции значения поля в данной точке - по X, по Y и по Z. Делаем Sqr(dX^2 + dY^2 + dZ^2)
7) Полученный результат записываем в поле и переходим к следующей точке
8) ??????
9) PROFITAMA!!1
Скорость не имеет значения, так что похер.
Номер ответа: 9
Автор ответа:
VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #9
Добавлено: 25.02.11 16:18
PS: Всякие крайние точки, которые не лежат между двуймя по одной из координат, не учитываем - нам на них похер.
Номер ответа: 10
Автор ответа:
VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #10
Добавлено: 27.02.11 23:49
http://ru.wikipedia.org/wiki/Бикубическая_интерполяция
Вот раньше никто не мог сказать?
Номер ответа: 11
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #11
Добавлено: 28.02.11 23:45
Nobody cares
Номер ответа: 12
Автор ответа:
VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #12
Добавлено: 01.03.11 14:42
Fuck all