Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 不同结构大型阵列的快速转换_C++_Arrays_Opengl - Fatal编程技术网

C++ 不同结构大型阵列的快速转换

C++ 不同结构大型阵列的快速转换,c++,arrays,opengl,C++,Arrays,Opengl,在类似CAD的应用程序中,我将矢量坐标存储在以下结构的数组中: struct coord { double x,y,z; unsigned char flags; }; x、 y和z保持三维坐标,标志包含附加信息(例如,如果多边形在此处结束,则不必绘制此阵列中下一个坐标的直线) 现在,这些数据必须转换为一个普通浮点数组,其中x、y和z各有一个浮点值,并且这些三元组的数量与多边形中要绘制的点的数量相同。原因是:转换后的坐标数组必须交给OpenGL函数glVertexAt

在类似CAD的应用程序中,我将矢量坐标存储在以下结构的数组中:

struct coord
{
   double        x,y,z;
   unsigned char flags;
};
x、 y和z保持三维坐标,标志包含附加信息(例如,如果多边形在此处结束,则不必绘制此阵列中下一个坐标的直线)

现在,这些数据必须转换为一个普通浮点数组,其中x、y和z各有一个浮点值,并且这些三元组的数量与多边形中要绘制的点的数量相同。原因是:转换后的坐标数组必须交给OpenGL函数glVertexAttribPointer(),以便OpenGL绘制该多边形

我的问题:转换这些数据的最快方式是什么?我唯一的想法是分配目标数组,并在循环中遍历它,将坐标值向下转换为float,这对我来说听起来相当慢

还有其他想法吗

谢谢!*)


*)我知道stackoverflow不喜欢友好,但事实上我喜欢友好,这就是为什么我要感谢所有试图在这里给出答案的人!地球上有足够多不友好的地方,不应该是另一个

好吧,如果你能首先使用
float
而不是
double
,那么你可以首先在这个平面数组中保留坐标:

struct coord { float x,y,x; };
struct point { coord *c; // pointer into global array of coord
               unsigned char flags; };
如果需要删除或重新排序点,则会出现问题-需要反向查找以重写每个受影响点的
coord
指针

它还引入了额外的间接寻址,因此可能会以牺牲其他操作为代价来加快渲染速度

最后,完全有可能
float
对于您的主要用途来说确实不够精确,在这种情况下,您必须在某个时候执行
double->float
转换。避免在GL调用之前执行此操作的唯一方法是始终更新每个坐标的两个版本(或保持GL坐标需要重写的脏点列表的混合方法)



注意。我忘了提到-如果您想使用它,可能需要显式地将该
coord
struct标记为packed,具体取决于填充和对齐规则。但是,您始终可以只存储一个平面数组
float
,并指向第一个(x)元素。

编写一个包装类,该类已在数组/向量中保存坐标x、y、z,再加上一个单独的、对应的相同长度的
标志数组。只需将内部数组(或vector.data())交给OpenGL函数(而不是复制大量数据),就像
string::c_str()
。哦,我认为将指向结构{double x,y,z}
的数组的指针转换为指向double的指针是可能的(即合法的)。也许你想联系语言律师,我记得标准语言对我来说有点不透明。对于gcc,-fno严格的别名应该可以解决可能的问题。@PeterSchneider不,这是不合法的。请参阅@elmi我回滚了您的编辑,因为它不会给您的问题添加任何内容。请停止添加它back@Elmi官方认为“谢谢”是无用的噪音。你觉得这很友好,但常客们觉得这是在浪费时间。在你厌倦它并在精神上把它屏蔽之前,你只能通读这么多“亲爱的先生们,请允许我问一下……”。从网站上删除它会使人们更加友好。浮动而不是双精度的原因是什么?OP指定
float
作为所需的目标类型。哦,我错过了!这在很大程度上改变了问题。我认为该标志可能用于决定哪些点进入单个多边形/GL调用,但不会显式传递给GL。也许OP可以证实或否认。