将二进制文件光源转换为ASCII

本文解释了如何将用于文件光源的二进制文件转换为 ASCII 文本文件。文本输出文件对于研究其中的光线数据很有用。一旦生成,文本输出文件也可以用于文件光源当中。但是,建议尽可能使用二进制文件作为文件光源输入,因为使用文本文件来表示光线数据时,光线追迹速度会慢上很多。

作者 Sanjay Gangadhara

下载

附件下载

简介

文件光源物体可在非序列模式中用于直接指定一组光源光线的坐标、余弦、强度和波长。LED 和其他复杂的光源使用文件光源物体建模时最为精准。

OpticStudio支持两种格式的文件光源物体:二进制文件和ASCII文件。二进制文件允许在较小文件中储存大量的光线数据集,而ASCII文件允许用户检查文件的内容。将文件从二进制转换为ASCII只需一段简单的C代码。此代码对于理解OpticStudio中文件光源使用的二进制文件以及光束数据库文件 (ZRD) 非常有用。

将二进制文件转换为ASCII的源代码

将二进制文件光源转换为ASCII文本文件的应用程序 (SourceFileRead.exe) 可以在本文附件部分下载。该文件夹中还有用于生成应用程序的源代码 (SourceFileRead.c)。

代码相当简单,首先它定义了用于存储光线数据的二进制文件的结构:

/* Define the data structure for the file header information */
typedef struct
{
int Identifier;         // Will be set to 8675309 or 1010 for 
//  quick check of proper format
int NbrRays;            // The number of rays in the file
char Description[100];  // A text description of the source
float SourceFlux;       // The total flux in watts of this 
//  source
float RaySetFlux;       // The flux in watts represented by
//  this Ray Set
float Wavelength;       // The wavelength in µm, 0 if
//  a composite
float AzimuthBeg, AzimuthEnd;  // Angular range for ray set
// (Degrees)
float PolarBeg, PolarEnd;      // Angular range for ray set
// (Degrees)
long DimensionUnits;    // METERS=0, INCHES=1, CM=2, FEET=3,
//  MM=4
float LocX, LocY,LocZ;  // Coordinate Translation of the source
float RotX,RotY,RotZ;   // Source rotation (Radians)
float ScaleX, ScaleY, ScaleZ;  // Scale factor to expand/
//  contract source
float unused1, unused2, unused3, unused4;
int reserved1, reserved2, reserved3, reserved4;
} NSC_RAY_DATA_HEADER;

 

/* Define the data structure for the ray information */
typedef struct
{
float x, y, z;
float l, m, n;
float intensity;
} FLUX_ONLY;
typedef struct
{
float x, y, z;
 float l, m, n;
float flux, wavelength;
} SPECTRAL_COLOR;

注意,包含每根光线波长信息的文件(即光谱数据格式或 .SDF文件)和不包含波长信息的文件(即 .DAT文件)会使用不同的数据结构。

接下来对代码进行主调用,并定义变量来存储光线数据:

int main(void)
{
char filein[MAX_PATH_LENGTH];
char fileout[MAX_PATH_LENGTH];
char disp[MAX_PATH_LENGTH];
int i, file_ident, file_rays, file_format, file_type;
long file_dim;
float xr, yr, zr, lr, mr, nr, intr, wavr;
FILE *in, *out;
NSC_RAY_DATA_HEADER nscrdh;
FLUX_ONLY nscrdf;
SPECTRAL_COLOR nscrdc;

用户接下来需要输入二进制输入文件和ASCII的输出文件的名称:

/* Determine the file names to be read from and written to */
printf("Enter the name of the binary file to be converted (include full path): ");
gets(filein);
printf("Enter the name for the ASCII text file (include full path): ");
gets(fileout);

然后,打开输入和输出文件,以便分别对它们进行读取和写入(如果找不到输入文件,程序将自动终止,并在ASCII输出文件中报错)。将二进制文件中的标题数据导入本地变量中,以验证输入文件的格式正确:

/* Read necessary header data into local variables &
confirm file format */
fread(&nscrdh,1,sizeof(NSC_RAY_DATA_HEADER),in);
file_ident = nscrdh.Identifier;
file_rays = nscrdh.NbrRays;
file_dim = nscrdh.DimensionUnits;
file_format = nscrdh.ray_format_type;
file_type = nscrdh.flux_type;
if ((file_ident == 1010) || (file_ident == 8675309))
{
sprintf(disp, "Valid file identifier \n");
fputs(disp, out);
}
else
{
sprintf(disp, "Incorrect file identifier");
fputs(disp, out);
goto fast_exit;
}
if ((file_format == 0) || (file_format == 2))
{
if (file_format == 0)
{
if ((file_type == 0) || (file_type == 1))
{
goto data_write;
}
else
{
sprintf(disp, "Incorrect flux type identifier");
fputs(disp, out);
goto fast_exit;
}
}
else
{
if (file_type != 0)
{
sprintf(disp, "Incorrect flux type identifier");
fputs(disp, out);
goto, fast_exit;
}
}
}
else
{
sprintf(disp, "Incorrect file format identifier");
fputs(disp, out);
fputs("\n", out);
sprintf(disp, "File format identifier = %i", file_format);
fputs(disp, out);
goto fast_exit;
}

最后,将标题数据写入输出文件,并结合输入文件中每条光线的坐标、余弦、强度和波长数据(可选):

/* Write header, ray information into output file */
sprintf(disp, "%i %i \n", file_rays, file_dim, file_format, file_type);
fputs(disp, out);
if (file_format == 0)
{
for (i=0; i <= file_rays - 1; i++)
  {
fread(&nscrdf,1,sizeof(FLUX_ONLY),in);
xr = nscrdf.x;
yr = nscrdf.y;
zr = nscrdf.z;
lr = nscrdf.l;
mr = nscrdf.m;
nr = nscrdf.n;
intr = nscrdf.flux;
sprintf(disp, "%f %f %f %f %f %f %f \n",
xr, yr, zr, lr, mr, nr, intr);
fputs(disp, out);
}
}
else
{
for (i=0; i <= file_rays - 1; i++)
{
fread(&nscrdc,1,sizeof(SPECTRAL_COLOR),in);
xr = nscrdc.x;
yr = nscrdc.y;
zr = nscrdc.z;
lr = nscrdc.l;
mr = nscrdc.m;
nr = nscrdc.n;
intr = nscrdc.flux;
wavr = nscrdc.wavelength;
sprintf(disp, "%f %f %f %f %f %f %f %f \n",
xr, yr, zr, lr, mr, nr, intr, wavr);
fputs(disp, out);
}
}

输出文本文件的格式与文件光源的ASCII文件格式匹配,如OpticStudio帮助文件“NSC光源”章节所述。

将二进制文件转换为ASCII的应用程序

应用程序可以通过双击图标启动。打开程序后会出现一个窗口,提示用户输入二进制文件 (.DAT) 的文件名:

SourceFileRead_1

如提示符中所示,文件名需要包含完整路径。一旦提供了输入文件,用户将被提示键入ASCII输出文件 (.txt) 的文件名:

SourceFileRead_2

同样,输出文件名也需要包含完整的路径。一旦输入了对应文件名,程序就会开始生成输出文件。程序运行需要一些时间,具体取决于原始输入文件的大小。如前一节所示,输出文本文件的格式与文件光源的 ASCII 文件格式相匹配,详见OpticStudio帮助文件中名为“NSC 光源”的章节。因此,这个输出文件也可以与文件光源物体一起使用(文件数据标题信息需要修改,比如二进制文件的名称会包含在生成的 ASCII 文本文件的数据标题中,但是如果这个文本文件要用于OpticStudio内,就必须删除所包含的文件名)。我们建议光线追迹时尽可能使用二进制文件,因为使用文本文件时系统运行的速度可能会较慢。

KA-01349

这篇文章有帮助吗?
1 人中有 1 人觉得有帮助

评论

0 条评论

文章评论已关闭。