我已经实现了一个3D奇怪的吸引探测器,它给出了0-100范围内的浮动XYZ输出,我现在想根据两个连续输出之间的位移为它实现一个着色函数。
我不确定用于存储每个点的颜色值的数据结构,使用3D数组我只限于四舍五入到最近的int,这给出了非常粗糙的颜色方案。
我隐约知道八卦,他们是否适合这种情况?
编辑:再解释一下:
生成我重复运行的点:
(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数组太粗糙着色,我正在寻找有关如何以更小的增量存储值的建议。
答案 0 :(得分:2)
也许你可以放弃2-dim数组并使用1-dim数组
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 :(得分:1)
我可能会想到某种三维二叉搜索树。
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似乎是基类的一个很好的候选者。