Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Интерполяция 3D-массива Добавлено: 24.02.11 22:11  

Автор вопроса:  VβÐUηìt | Web-сайт: смекаешь.рф
Есть задача. Дан массив чисел.
float[,,] Numbers = new float[100,100,100];


Есть массив 3D-точек.
public struct NumberPoint3D { int x,y,z,value; }
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-сайт: xawp.narod.ru
 Профиль | | #6
Добавлено: 25.02.11 14:31
Точки какую-то фигуру составляют?
Если да, то они наверняка треугольниками сделаны. А Треугольник на 3 разделить просто.

Если нет, то нужно сначала объединить в группы треугольников.
Берешь точку, ищешь две ближайшие к ней, у которых меньше 3-х связей, создаешь связи, создаешь промежуточные точки.
И так для каждой.
Можно предварительно отсортировать точки по расстоянию от первой, т.к. поиск в массиве будет не по всем точками, а по всем следующим после текущей. Это ускорит обработку.

Ответить

Номер ответа: 7
Автор ответа:
 AWP



ICQ: 345685652 

Вопросов: 96
Ответов: 1212
 Web-сайт: xawp.narod.ru
 Профиль | | #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 :)

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам