2009-11-15 2 views
2

J'ai implémenté un explorateur d'attracteurs étranges 3D qui donne des sorties de flotteur XYZ dans la gamme 0-100, je veux maintenant mettre en place une fonction de coloration basée sur le déplacement entre deux les sorties. Je ne suis pas sûr de la structure de données à utiliser pour stocker les valeurs de couleur pour chaque point, en utilisant un tableau 3D, je suis limité à l'arrondi à l'int plus proche qui donne un schéma de couleurs très grossier.Structure de données C++ pour stocker 3 dimensions de flotteurs

Je suis vaguement conscient de octtrees, sont-ils appropriés dans cette siutation?

EDIT: Un peu plus d'explications:

pour générer des points im à plusieurs reprises l'exécution de ce:

(a, b, c, d sont des flotteurs aléatoires dans la plage -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; 

qui génère de nouvelles positions pour chaque axe de chaque course, pour colorer le rendu que je dois prendre la distance entre deux résultats successifs, si je fais juste cela avec un calcul de distance entre chaque course puis les couleurs disparaissent avant et en arrière en équilibre, donc je dois prendre en moyenne moyenne fo r chaque point et stockez-le, en utilisant un tableau 3dimenrsionl est une coloration trop grossière et je cherche des conseils sur la façon de stocker les valeurs à des incréments beaucoup plus petits.

+0

qu'est-ce qu'un "explorateur étrange attractor"? – Macke

+0

Est-ce qu'un struct float 3 que vous voulez ou ...? – Jonas

+0

Quelque chose comme: http://www.chaoscope.org/ Mais dans mon cas, une caméra gratuite est utilisée pour voyager autour et dans le nuage de points. – Baxter

Répondre

1

Je penserais probablement à une sorte d'arbre de recherche binaire 3-d.

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> 
{ 
}; 

Et vous fonctionnez pour récupérer la couleur de cet arbre ressemblerait que

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; 
} 

cours Af vous devez écrire la fonction qui ajouter de la couleur à cet arbre, à condition 3 coordonnées X, Y et Z. std :: map semble être un bon candidat pour la classe de base.

2

Peut-être que vous pourriez laisser tomber le tableau 2-dim off et utiliser un tableau 1-dim de

struct ColoredPoint { 

    int x; 
    int y; 
    int z; 

    float color; 
}; 

afin que le code ressemblerait

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

(vous pouvez également encapsuler les champs et utiliser class ColoredPoint avec des méthodes d'accès)

+0

Et donné (x, y, z) comment allez-vous trouver la couleur? Recherche linéaire? – BostonLogan

+0

De la publication initiale "... Je veux maintenant mettre en œuvre une fonction de coloration basée sur le déplacement entre deux sorties successives ..." il n'est pas clair si l'accès à la valeur de couleur par (x, y , z) est nécessaire du tout. –

+0

l'accès pour le rendu basé sur la profondeur dans l'écran est requis, donc je vais pour l'arbre de recherche binaire 3-d plutôt qu'un tableau de structures. – Baxter