было любопытно, и, исходя из вашей примерной сетки, я пришел к следующему:
//---------------------------------------------------------------------------
//--- AMR class ver: 1.000 --------------------------------------------------
//---------------------------------------------------------------------------
#ifndef _amr_grid_h
#define _amr_grid_h
//---------------------------------------------------------------------------
#include "gl\OpenGL3D_double.cpp"
//---------------------------------------------------------------------------
// https://stackoverflow.com/q/55319835/2521214
//---------------------------------------------------------------------------
class amr_grid
{
public:
// BVH file
int iformat; // 0,1
int gridstyle; // 0 regular
int coordsystem; // <0,100) cartesian, <100<200) spherical/polar, <200,300) cylindrical
int gridinfo; // 0: 1: additional info added to file
int en[3]; // enable x,y,z?
int sz[3]; // size of grid [cells]
List<double> p[3]; // walls per dimension
// misc
double min[3],max[3]; // BBOX
double dl; // avg cell size
amr_grid(){ reset(); }
amr_grid(amr_grid& a) { *this=a; }
~amr_grid(){}
amr_grid* operator = (const amr_grid *a) { *this=*a; return this; }
//bvh* operator = (const bvh &a) { ...copy... return this; }
// render/set/load
void reset(); // clear whole skeleton data
void draw(); // render actual set frame
void load(AnsiString name); // load from AMR grid file
};
//---------------------------------------------------------------------------
void amr_grid::reset()
{
iformat=1;
gridstyle=0;
coordsystem=0;
gridinfo=0;
en[0]=1; sz[0]=0; p[0].num=0; min[0]=0.0; max[0]=0.0;
en[1]=1; sz[1]=0; p[1].num=0; min[1]=0.0; max[1]=0.0;
en[2]=1; sz[2]=0; p[2].num=0; min[2]=0.0; max[2]=0.0;
dl=0.0;
}
//---------------------------------------------------------------------------
void amr_grid::draw()
{
int i,x,y,z;
glColor3f(0.0,1.0,0.5);
glBegin(GL_LINES);
if ((gridstyle>=0)&&(gridstyle<100)) // cartesian
{
if ((en[0])&&(en[1])&&(en[2])) // 3D
{
for (x=0;x<=sz[0];x++)
for (y=0;y<=sz[1];y++)
{
glVertex3d(p[0][x],p[1][y],min[2]);
glVertex3d(p[0][x],p[1][y],max[2]);
}
for (x=0;x<=sz[0];x++)
for (z=0;z<=sz[2];z++)
{
glVertex3d(p[0][x],min[1],p[2][z]);
glVertex3d(p[0][x],max[1],p[2][z]);
}
for (y=0;y<=sz[1];y++)
for (z=0;z<=sz[2];z++)
{
glVertex3d(min[0],p[1][y],p[2][z]);
glVertex3d(max[0],p[1][y],p[2][z]);
}
}
}
glEnd();
}
//---------------------------------------------------------------------------
void amr_grid::load(AnsiString name)
{
int hnd,siz,adr,i,j,k;
AnsiString lin,s;
BYTE *txt=NULL;
reset();
// file -> memory
hnd=FileOpen(name,fmOpenRead);
if (hnd<0) return;
siz=FileSeek(hnd,0,2);
FileSeek(hnd,0,0);
txt=new BYTE[siz];
if (txt==NULL) { FileClose(hnd); return; }
siz=FileRead(hnd,txt,siz);
FileClose(hnd);
// memory -> amr_grid data
adr=0;
iformat=str2int(txt_load_lin(txt,siz,adr,true));
gridstyle=str2int(txt_load_lin(txt,siz,adr,true));
coordsystem=str2int(txt_load_lin(txt,siz,adr,true));
gridinfo=str2int(txt_load_lin(txt,siz,adr,true));
lin=txt_load_lin(txt,siz,adr,true); i=1; for (j=0;j<3;j++) en[j]=str2num(str_load_str(lin,i,true));
lin=txt_load_lin(txt,siz,adr,true); i=1; for (j=0;j<3;j++) sz[j]=str2num(str_load_str(lin,i,true));
for (j=0;j<3;j++) for (p[j].num=0,i=0;i<=sz[j];i++) p[j].add(str2num(txt_load_str(txt,siz,adr,true)));
// BBOX
for (j=0;j<3;j++) for (min[j]=max[j]=p[j][0],i=0;i<=sz[j];i++)
{
if (min[j]>p[j][i]) min[j]=p[j][i];
if (max[j]<p[j][i]) max[j]=p[j][i];
}
double q[3];
vector_sub(q,max,min);
dl=3.0*vector_len(q)/double(sz[0]+sz[1]+sz[2]);
}
//---------------------------------------------------------------------------
#endif
//---------------------------------------------------------------------------
Это просто загружает и рисует сетку.Однако я ожидаю, что вы получили файл 3D-текстуры, содержащий интенсивность ячеек, поэтому просто используйте его в качестве цвета для блока и измените процедуру рисования, которая будет отображать ячейки в виде блока с цветом из вашей текстуры.угловые точки ячейки для любой ячейки представляют собой 8 комбинаций этих координат:
x: p[0][i],p[0][i+1]
y: p[1][i],p[1][i+1]
z: p[2][i],p[2][i+1]
вы можете адаптировать мою glBox
(остерегайтесь ее float
, но код выше использует double ...):
void glBox(GLfloat x0,GLfloat y0,GLfloat z0,GLfloat xs,GLfloat ys,GLfloat zs)
{
xs*=0.5;
ys*=0.5;
zs*=0.5;
glBegin(GL_QUADS);
glNormal3f(+1.0,0.0,0.0);
glVertex3f(x0+xs,y0-ys,z0-zs);
glVertex3f(x0+xs,y0+ys,z0-zs);
glVertex3f(x0+xs,y0+ys,z0+zs);
glVertex3f(x0+xs,y0-ys,z0+zs);
glNormal3f(-1.0,0.0,0.0);
glVertex3f(x0-xs,y0-ys,z0+zs);
glVertex3f(x0-xs,y0+ys,z0+zs);
glVertex3f(x0-xs,y0+ys,z0-zs);
glVertex3f(x0-xs,y0-ys,z0-zs);
glNormal3f(0.0,+1.0,0.0);
glVertex3f(x0-xs,y0+ys,z0+zs);
glVertex3f(x0+xs,y0+ys,z0+zs);
glVertex3f(x0+xs,y0+ys,z0-zs);
glVertex3f(x0-xs,y0+ys,z0-zs);
glNormal3f(0.0,-1.0,0.0);
glVertex3f(x0-xs,y0-ys,z0-zs);
glVertex3f(x0+xs,y0-ys,z0-zs);
glVertex3f(x0+xs,y0-ys,z0+zs);
glVertex3f(x0-xs,y0-ys,z0+zs);
glNormal3f(0.0,0.0,+1.0);
glVertex3f(x0+xs,y0-ys,z0+zs);
glVertex3f(x0+xs,y0+ys,z0+zs);
glVertex3f(x0-xs,y0+ys,z0+zs);
glVertex3f(x0-xs,y0-ys,z0+zs);
glNormal3f(0.0,0.0,-1.0);
glVertex3f(x0-xs,y0-ys,z0-zs);
glVertex3f(x0-xs,y0+ys,z0-zs);
glVertex3f(x0+xs,y0+ys,z0-zs);
glVertex3f(x0+xs,y0-ys,z0-zs);
glEnd();
}
до x0,y0,z0,x1,y1,z1
сформировать или написать VBO или что-то еще ...
PS.
Я также использую мой шаблон динамического списка так:
List<double> xxx;
совпадает с double xxx[];
xxx.add(5);
добавляет 5
в конец списка
xxx[7]
элемент массива доступа (безопасный)
xxx.dat[7]
элемент массива доступа (небезопасный, но быстрый прямой доступ)
xxx.num
- фактический используемый размер массива
xxx.reset()
очищает массив и устанавливает xxx.num=0
xxx.allocate(100)
предварительно выделить место для 100
items
и код C ++ основаны на VCL , поэтому вам нужно переписать AnsiString в тип строки, который вы получили в вашем распоряжении.Также я использовал свои собственные строковые подпрограммы для загрузки строк, строк и преобразования в числа, так что вам тоже нужно их портировать, но я предполагаю, что у вас уже есть загрузчик ...
кстати, это вывод для простого файла примерав описании формата файла: