以下是引用yjm041441055在2009-11-18 20:45:54的发言:
我现在有一个c语言程序,意思是利用给定的晶胞坐标得出一个晶体。各方向的晶胞数为x,y,z。我现在能实现自己给定的晶胞数目时的程序,但是怎么样能使程序遇有通用性,让别人也能用,就是不用修改源代码,可以自己 ...
下面是我的程序:
#define X 4
#define Y 5
#define Z 9
#include <stdio.h>
void jingti(float c[][4] ,float d[][4]) //晶体的子程序,其中X,Y,Z为晶体三个方向的晶胞数
{
int i,j;
for(i=0;i<12;i++)
{c[i][1]=c[i][1]*7.41;
c[i][2]=c[i][2]*4.94;
c[i][3]=c[i][3]*2.54;
}
for(i=0;i<12;i++)
{for(j=0;j<4;j++)
d[i][j]=c[i][j];}
for(i=0;i<12*X-12;i++) //x坐标增加
{d[i+12][0]=d[i][0];
d[i+12][1]=d[i][1]+7.41;
d[i+12][2]=d[i][2];
d[i+12][3]=d[i][3];}
for(i=0;i<12*X*Y-12*X;i++) //y坐标增加
{d[i+12*X][0]=d[i][0];
d[i+12*X][2]=d[i][2]+4.94;
d[i+12*X][1]=d[i][1];
d[i+12*X][3]=d[i][3];}
for(i=0;i<12*X*Y*Z-12*X*Y;i++) //z坐标增加
{d[i+12*X*Y][0]=d[i][0];
d[i+12*X*Y][1]=d[i][1];
d[i+12*X*Y][2]=d[i][2];
d[i+12*X*Y][3]=d[i][3]+2.54;}
return;
}
void c_qiu(float b[][4],int n,float x,float y,float z) //求C60球指定位置坐标的子程序,x,y,z为指定的球心坐标
{
float k,l,m;
int i;
k=0.0;
l=0.0;
m=0.0;
for(i=0;i<n;i++) //求C60的原始球心
{k=k+b[i][1];
l=l+b[i][2];
m=m+b[i][3];}
k=k/n;
l=l/n;
m=m/n;
for(i=0;i<n;i++) //球心移到(x,y,z)处
{b[i][1]=b[i][1]+x-k;
b[i][2]=b[i][2]+y-l;
b[i][3]=b[i][3]+z-m;}
return;
}
void wadong(float s[][4],float x1,float y1,float z1,float r,float h) //在晶体上挖去一个圆柱体
{int i;
for(i=0;i<12*X*Y*Z;i++)
if(((s[i][1]-x1)*(s[i][1]-x1)+(s[i][2]-y1)*(s[i][2]-y1)-r*r)<=1e-6&&s[i][3]>h)
{s[i][0]=0;
s[i][1]=0;
s[i][2]=0;
s[i][3]=0;}
}
void main()
{
float a[12][4],s[12*X*Y*Z][4] ,b[60][4];
int i,j;
FILE *fp;
fp=fopen("jingbao.xyz","r+");
for(i=0;i<12;i++)
{for(j=0;j<4;j++)
fscanf(fp,"%f",&a[i][j]);
fprintf(fp,"\n");}
fp=fopen("C60.xyz","r+");
for(i=0;i<60;i++)
{for(j=0;j<4;j++)
fscanf(fp,"%f",&b[i][j]);
fprintf(fp,"\n");}
jingti(a,s); //调用晶体坐标的子程序
wadong(s,15,12,12,7,5); //调用挖洞的子程序,调用时可任意设定所挖圆柱体的位置和大小
c_qiu(b,60,15,12,12); //调用求C60指定位置坐标的子程序,可任意设定球心位置
fp=fopen("JINGTI.xyz","w+");
for(i=0;i<2160;i++)
{for(j=0;j<4;j++)
fprintf(fp,"%10.6f",s[i][j]);
fprintf(fp,"\n");}
for(i=0;i<60;i++)
{for(j=0;j<4;j++)
fprintf(fp,"%10.6f",b[i][j]);
fprintf(fp,"\n");}
fclose(fp);
}