这是一个碳纳米管生成程序, Tdswnts()是我找三维空间中碳纳米管的点的函数,已经都找到了,但是由于不清楚opengl底层库,不会设置视点,和深度,就看不见图像,陷入了僵局,求一个大神解救,帮我能改出来,感激不尽
#include
#include
#include
#include
#include
#include
float n,m,L;
void Tdswnts()
{
const GLfloat pi=3.141593;
float a=20;
float rotAngle=0;
float Ch=sqrt(3.0)*a*sqrt(m*m+m*n+n*n); //Ch是手性矢量长
float b=sqrt(3.0)*(n+m)/(2*sqrt(m*m+m*n+n*n)); //b是Ch轴与原来x轴的夹角的余弦值
float c=(n-m)/(2*sqrt(m*m+m*n+n*n)); //c是Ch轴与原来x轴的夹角的正弦值
float r=Ch/(2*pi); //r是卷曲过后拟圆柱体的底部半径
printf("%f %f %f %f\n",Ch,b,c,r);
glClear(GL_COLOR_BUFFER_BIT );
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// gluLookAt(0.0,0.0,60.0,0.0,0.0,0.0,0.0,-1.0,0.0);
glLoadIdentity();
for(int j=0;j<L+1;j++)
{
for(int i=-(j+1)/2;i<n+m+1;i++)
{
if(i%2==1||i%2==-1)
{
float p[6][2]={
//求出六边形的顶点1
{(a*cos(rotAngle)+3*i*a/2+a/2)*b+(a*sin(rotAngle)+sqrt(3.0)*a/2+sqrt(3.0)*a*j+sqrt(3.0)*a/2)*c,-(a*cos(rotAngle)+3*i*a/2+a/2)*c+(a*sin(rotAngle)+sqrt(3.0)*a/2+sqrt(3.0)*a*j+sqrt(3.0)*a/2)*b},
//求出六边形的顶点2
{(a*cos(rotAngle+5*pi/3)+3*i*a/2+a/2)*b+(a*sin(rotAngle+5*pi/3)+sqrt(3.0)*a/2+sqrt(3.0)*a*j+sqrt(3.0)*a/2)*c,-(a*cos(rotAngle+5*pi/3)+3*i*a/2+a/2)*c+(a*sin(rotAngle+5*pi/3)+sqrt(3.0)*a/2+sqrt(3.0)*a*j+sqrt(3.0)*a/2)*b},
//求出六边形的顶点3
{(a*cos(rotAngle+4*pi/3)+3*i*a/2+a/2)*b+(a*sin(rotAngle+4*pi/3)+sqrt(3.0)*a/2+sqrt(3.0)*a*j+sqrt(3.0)*a/2)*c,-(a*cos(rotAngle+4*pi/3)+3*i*a/2+a/2)*c+(a*sin(rotAngle+4*pi/3)+sqrt(3.0)*a/2+sqrt(3.0)*a*j+sqrt(3.0)*a/2)*b},
//求出六边形的顶点4
{(a*cos(rotAngle+pi)+3*i*a/2+a/2)*b+(a*sin(rotAngle+pi)+sqrt(3.0)*a/2+sqrt(3.0)*a*j+sqrt(3.0)*a/2)*c,-(a*cos(rotAngle+pi)+3*i*a/2+a/2)*c+a*sin(rotAngle+pi)+(a*sin(rotAngle+pi)+sqrt(3.0)*a/2+sqrt(3.0)*a*j+sqrt(3.0)*a/2)*b},
//求出六边形的顶点5
{(a*cos(rotAngle+2*pi/3)+3*i*a/2+a/2)*b+(a*sin(rotAngle+2*pi/3)+sqrt(3.0)*a/2+sqrt(3.0)*a*j+sqrt(3.0)*a/2)*c,-(a*cos(rotAngle+2*pi/3)+3*i*a/2+a/2)*c+(a*sin(rotAngle+2*pi/3)+sqrt(3.0)*a/2+sqrt(3.0)*a*j+sqrt(3.0)*a/2)*b},
//求出六边形的顶点6
{(a*cos(rotAngle+pi/3)+3*i*a/2+a/2)*b+(a*sin(rotAngle+pi/3)+sqrt(3.0)*a/2+sqrt(3.0)*a*j+sqrt(3.0)*a/2)*c,-(a*cos(rotAngle+pi/3)+3*i*a/2+a/2)*c+(a*sin(rotAngle+pi/3)+sqrt(3.0)*a/2+sqrt(3.0)*a*j+sqrt(3.0)*a/2)*b}
};
int count=0;
for(int s=0;s<6;s++)
{
if(p[s][0]>=0&&p[s][0]<=Ch&&p[s][1]>=0&&p[s][1]<=L*sqrt(3.0)*a)
{
count++;
}
}
// printf("%d ",count);
// system("pause");
if(count==6)
{
float q[6][3];
for(int kk=0;kk<6;kk++)
{
float angle=p[kk][0]/r;
q[kk][0]=r*sin(angle);
q[kk][1]=p[kk][1];
q[kk][2]=-r*cos(angle);
}
glColor3f(0,1,1);
// glPushMatrix();
glBegin(GL_LINE_LOOP);
glVertex3fv(q[0]);
glVertex3fv(q[1]);
glVertex3fv(q[2]);
glVertex3fv(q[3]);
glVertex3fv(q[4]);
glVertex3fv(q[5]);
glEnd();
// glPopMatrix();
}
else if(count<6)
{
for(int kk=0;kk<6;kk++)
{
if(p[kk][0]>=0&&p[kk][0]<=Ch&&p[kk][1]>=0&&p[kk][1]<=L*sqrt(3.0)*a)
{
if(p[kk+1][0]>=0&&p[kk+1][0]<=Ch&&p[kk+1][1]>=0&&p[kk+1][1]<=L*sqrt(3.0)*a)
{
float q1[]={r*sin(p[kk][0]/r),p[kk][1],-r*cos(p[kk][0]/r)};
float q2[]={r*sin(p[kk+1][0]/r),p[kk+1][1],-r*cos(p[kk+1][0]/r)};
printf("%f %f %f\n",q1[0],q1[1],q1[2]);
printf("%f %f %f\n",q2[0],q2[1],q2[2]);
glColor3f(0,1,1);
// glPushMatrix();
glBegin(GL_LINE);
glVertex3fv(q1);
glVertex3fv(q2);
glEnd();
// glPopMatrix();
}
}
}
}
}
else
{
float p[6][2]={
//求出六边形的顶点1
{(a*cos(rotAngle)+3*i*a/2+a/2)*b+(a*sin(rotAngle)+sqrt(3.0)*a*j+sqrt(3.0)*a/2)*c,-(a*cos(rotAngle)+3*i*a/2+a/2)*c+(a*sin(rotAngle)+sqrt(3.0)*a*j+sqrt(3.0)*a/2)*b},
//求出六边形的顶点2
{(a*cos(rotAngle+5*pi/3)+3*i*a/2+a/2)*b+(a*sin(rotAngle+5*pi/3)+sqrt(3.0)*a*j+sqrt(3.0)*a/2)*c,-(a*cos(rotAngle+5*pi/3)+3*i*a/2+a/2)*c+(a*sin(rotAngle+5*pi/3)+sqrt(3.0)*a*j+sqrt(3.0)*a/2)*b},
//求出六边形的顶点3
{(a*cos(rotAngle+4*pi/3)+3*i*a/2+a/2)*b+(a*sin(rotAngle+4*pi/3)+sqrt(3.0)*a*j+sqrt(3.0)*a/2)*c,-(a*cos(rotAngle+4*pi/3)+3*i*a/2+a/2)*c+(a*sin(rotAngle+4*pi/3)+sqrt(3.0)*a*j+sqrt(3.0)*a/2)*b},
//求出六边形的顶点4
{(a*cos(rotAngle+pi)+3*i*a/2+a/2)*b+(a*sin(rotAngle+pi)+sqrt(3.0)*a*j+sqrt(3.0)*a/2)*c,-(a*cos(rotAngle+pi)+3*i*a/2+a/2)*c+a*sin(rotAngle+pi)+(a*sin(rotAngle+pi)+sqrt(3.0)*a*j+sqrt(3.0)*a/2)*b},
//求出六边形的顶点5
{(a*cos(rotAngle+2*pi/3)+3*i*a/2+a/2)*b+(a*sin(rotAngle+2*pi/3)+sqrt(3.0)*a*j+sqrt(3.0)*a/2)*c,-(a*cos(rotAngle+2*pi/3)+3*i*a/2+a/2)*c+(a*sin(rotAngle+2*pi/3)+sqrt(3.0)*a*j+sqrt(3.0)*a/2)*b},
//求出六边形的顶点6
{(a*cos(rotAngle+pi/3)+3*i*a/2+a/2)*b+(a*sin(rotAngle+pi/3)+sqrt(3.0)*a*j+sqrt(3.0)*a/2)*c,-(a*cos(rotAngle+pi/3)+3*i*a/2+a/2)*c+(a*sin(rotAngle+pi/3)+sqrt(3.0)*a*j+sqrt(3.0)*a/2)*b}
};
int count=0;
for(int s=0;s<6;s++)
{
if(p[s][0]>=0&&p[s][0]<=Ch&&p[s][1]>=0&&p[s][1]<=L*sqrt(3.0)*a)
{
count++;
}
}
// printf("%d ",count);
// system("pause");
if(count==6)
{
float q[6][3];
for(int kk=0;kk<6;kk++)
{
float angle=p[kk][0]/r;
q[kk][0]=r*sin(angle);
q[kk][1]=p[kk][1];
q[kk][2]=-r*cos(angle);
}
glColor3f(0,1,1);
// glPushMatrix();
glBegin(GL_LINE_LOOP);
glVertex3fv(q[0]);
glVertex3fv(q[1]);
glVertex3fv(q[2]);
glVertex3fv(q[3]);
glVertex3fv(q[4]);
glVertex3fv(q[5]);
glEnd();
// glPopMatrix();
}
else if(count<6)
{
for(int kk=0;kk<6;kk++)
{
if(p[kk][0]>=0&&p[kk][0]<=Ch&&p[kk][1]>=0&&p[kk][1]<=L*sqrt(3.0)*a)
{
if(p[kk+1][0]>=0&&p[kk+1][0]<=Ch&&p[kk+1][1]>=0&&p[kk+1][1]<=L*sqrt(3.0)*a)
{
float q1[]={r*sin(p[kk][0]/r),p[kk][1],-r*cos(p[kk][0]/r)};
float q2[]={r*sin(p[kk+1][0]/r),p[kk+1][1],-r*cos(p[kk+1][0]/r)};
glColor3f(0,1,1);
// glPushMatrix();
glBegin(GL_LINE);
glVertex3fv(q1);
glVertex3fv(q2);
glEnd();
// glPopMatrix();
}
}
}
}
}
//使用glBegin() glEnd()命令开始画线,线形为闭合折线
}
printf("\n");
}
glFlush();
}
void init(void)
{
glClearColor (0.0, 0.0, 0.0, 0.0);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glEnable(GL_DEPTH_TEST);
}
void reshape(int w, int h)
{
glViewport(0,0,(GLsizei)w,(GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-1.0,1.0,-1.0,1.0,1.5,20.0);
glMatrixMode(GL_MODELVIEW);
}
/* ARGSUSED1 */
int main(int argc, char** argv)
{
printf("input n, m, L :\n");
scanf("%f %f %f", &n, &m,&L);
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(600, 600);
glutInitWindowPosition(100, 100);
glutCreateWindow("三维立体结构");
init();
glutReshapeFunc(reshape);
glutDisplayFunc(Tdswnts);
glutMainLoop();
return 0;
}