Структура данных C ++ для хранения 3-х измерений с плавающей точкой - PullRequest
2 голосов
/ 15 ноября 2009

Я реализовал трехмерный странный проводник аттракторов, который дает плавающие выходы XYZ в диапазоне 0-100, теперь я хочу реализовать для него функцию раскраски на основе смещения между двумя последовательными выходами.

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

Я смутно знаю о октровых деревьях, они подходят для этой ситуации?

РЕДАКТИРОВАТЬ: немного больше объяснений:

для генерации очков я многократно запускаю это:

(a, b, c, d - случайные числа в диапазоне от -3 до 3)

x = x2;
y = y2;
z = z2;

x2 = sin(a * y) - z * cos(b * x);
y2 = z2 * sin(c * x) - cos(d * y);
z2 = sin(x);

parr[i][0]=x;
parr[i][1]=y;
parr[i][2]=z;   

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

Ответы [ 2 ]

2 голосов
/ 15 ноября 2009

Может быть, вы могли бы отбросить 2-димный массив и использовать 1-димный массив

struct ColoredPoint {

   int   x;
   int   y;
   int   z;

   float color;
};

чтобы код выглядел как

 ...
 parr[i].x     = x;
 parr[i].y     = y;
 parr[i].z     = z;
 parr[i].color = some_computed_color;

(вы также можете инкапсулировать поля и использовать class ColoredPoint с методами доступа)

1 голос
/ 15 ноября 2009

Я бы, наверное, подумал о каком-то трехмерном дереве двоичного поиска.

template <class KEY, class VALUE>
class BinaryTree
{
    // some implementation, probably available in libraries
public:
    VALUE* Find(const KEY& key) const
    {
        // real implementation is needed here
        return NULL; 
    }

};

// this tree nodes wil actually hold color
class BinaryTree1 : public BinaryTree<double, int>
{
};

class BinaryTree2 : public BinaryTree<double, BinaryTree1>
{
};

class BinaryTree3 : public BinaryTree<double, BinaryTree2>
{
};

И функция для извлечения цвета из этого дерева будет выглядеть так

bool    GetColor(const BinaryTree3& tree, double dX, double dY, double& dZ, int& color)
{
    BinaryTree2* pYTree = tree.Find(dX);
    if( NULL == pYTree )
        return false;

    BinaryTree1* pZTree = pYTree->Find(dY);
    if( NULL == pZTree )
        return false;

    int* pCol = pZTree->Find(dZ);
    if( NULL == pCol )
        return false;

    color = *pCol;
    return true;
}

Конечно, вам нужно написать функцию, которая добавит цвет к этому дереву, при условии 3 координат X, Y и Z. std :: map является хорошим кандидатом в базовый класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...