Vicentsth 2018-05-23 04:57 采纳率: 0%
浏览 734
已结题

三维图像点都已经找到,连起来却看不见图像

这是一个碳纳米管生成程序, 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;

}

  • 写回答

2条回答 默认 最新

  • 为梦想拼搏 2018-05-23 05:09
    关注

    glutInitWindowSize(600, 600);

    glutInitWindowPosition(100, 100);

    glutCreateWindow("三维立体结构");

    评论

报告相同问题?

悬赏问题

  • ¥17 pro*C预编译“闪回查询”报错SCN不能识别
  • ¥15 微信会员卡接入微信支付商户号收款
  • ¥15 如何获取烟草零售终端数据
  • ¥15 数学建模招标中位数问题
  • ¥15 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 HLs设计手写数字识别程序编译通不过
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向