精华内容
下载资源
问答
  • OpenGL画圆

    千次阅读 2019-09-17 22:33:02
    画圆: /* 正四边形,正五边形,正六边形,……,直到正n边形,当n越大时,这个图形就越接近圆 当n大到一定程度后,人眼将无法把它跟真正的圆相区别 这时我们已经成功的画出了一个“圆” (注:画圆的方法很多,这里...

    画圆:

    /*
    正四边形,正五边形,正六边形,……,直到正n边形,当n越大时,这个图形就越接近圆
    当n大到一定程度后,人眼将无法把它跟真正的圆相区别
    这时我们已经成功的画出了一个“圆”
    (注:画圆的方法很多,这里使用的是比较简单,但效率较低的一种)

    */

    程序:

    #include <GL/glut.h>
     
    #include <math.h>
    const int n = 6;
    const GLfloat R = 0.5f;
    const GLfloat Pi = 3.1415926536f;
    void myDisplay(void)
    {
    	int i;
    	glClear(GL_COLOR_BUFFER_BIT); //清除颜色
    	glBegin(GL_POINTS);//OpenGL要求:指定顶点的命令必须包含在glBegin函数之后,
    	       //glEnd函数之前(否则指定的顶点将被忽略)。并由glBegin来指明如何使用这些点
    	       //GL_POLYGON表示画多边形(由点连接成多边形)
     
    	for(i=0; i<n; ++i)
    		glVertex2f(R*cos(2*Pi/n*i), R*sin(2*Pi/n*i));
     
    	glEnd(); 
     
    	glFlush();//保证前面的OpenGL命令立即执行(而不是让它们在缓冲区中等待)
     
    }
     
     
    int main(int argc, char *argv[])
    {
    	glutInit(&argc, argv);//对GLUT进行初始化,这个函数必须在其它的GLUT使用之前调用一次
    	glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); //设置显示方式
    	glutInitWindowPosition(100, 100); 
    	glutInitWindowSize(400, 400);
    	glutCreateWindow("第一个OpenGL程序"); //根据前面设置的信息创建窗口。参数将被作为窗口的标题。
    	glutDisplayFunc(&myDisplay); //当需要画图时,请调用myDisplay函数
    	glutMainLoop(); //进行一个消息循环
    	return 0;
    }
    
    

    当n=100时,结果如下:

    GL_POLYGON(填充的多边形):
    在这里插入图片描述
    其实是利用高中学过的知识,例如
    x=cos(PI/4),y=sin(PI/4),然后就可以确定一个点
    tanx=sin x/cos x等等
    参考原文链接:https://blog.csdn.net/timidsmile/article/details/7016436

    展开全文
  • OpengL画圆算法

    2014-05-08 22:27:02
    这是一个简单的OpenGL画圆程序 初学者参考
  • OPENGL 画圆

    2011-05-10 11:23:00
     DrawGlobe extends GLBase {  private final float R = 0.5f;  private final int N = 50;  private final int T = 6;  private final int M = 9;  private final int ...

      DrawGlobe extends GLBase
    {
        private final float R = 0.5f;
        private final int N = 50;
        private final int T = 6;
        private final int M = 9;
        private final int NT = N * (T + M) - 1;
        private final float Start = (float)Math.PI / 2;
        private final float BASE = 2 * (float)Math.PI / N;
        private final float ADD_1 = (float)Math.PI / T;   
        private final float ADD_2 = (float)Math.PI / (M - 1);
        private final int LEN = 3 * NT;
        private float an = 1;
         
        private float[] coords;
       
        FloatBuffer coordBuffer;   
       
        private void setCoords()
        {
            coords = new float[LEN];
            int i, j, k, p, pos;   
            float angle = -ADD_1, rad, x1;
            for(k = 0, p = 0; k < T; k++)
            {
                    angle += ADD_1;
                    for (i = 0; i < N; i++, p++)
                {
                    pos = p * 3;
                    rad = i * BASE + Start;
                   
                    x1 = R * (float)Math.cos(rad);
                    coords[pos] = x1 * (float)Math.cos(angle);
                    coords[pos + 1] = R * (float)Math.sin(rad);
                    coords[pos + 2] = x1 * (float)Math.sin(angle);
                }
            }     
            float alpha = Start, beta = 0;
            float y, r;
            int ra = N /((M - 1) * 2);
            
               
            for(k = 1; k < M; k++)
            {
                    beta += ADD_2;
                    y = R * (float)Math.cos(beta);

                    for(j = 0; j < ra; j++,p++)
                    {
                            pos = p * 3;
                            rad = alpha - j * BASE;
                            
                            coords[pos] = R * (float)Math.cos(rad);
                    coords[pos + 1] = R * (float)Math.sin(rad);
                    coords[pos + 2] = 0;
                    }
                    alpha -= ADD_2;
                    if(alpha == -Start)
                            break;

                    for(i = 0; i < N; i++, p++)
                    {
                            pos = p * 3;
                            rad = i * BASE;
                            r = R * (float)Math.sin(beta);
                           
                            coords[pos] = r * (float)Math.cos(rad);
                    coords[pos + 1] = y;
                    coords[pos + 2] = r * (float)Math.sin(rad);
                    }
            }

            alpha = -Start;
            for(i = 0; i < N/2; i++,p++)
            {
                    pos = p * 3;
                    rad = i * BASE + alpha;
                   
                    coords[pos] = R * (float)Math.cos(rad);
                coords[pos + 1] = R * (float)Math.sin(rad);
                coords[pos + 2] = 0;
            }
            
            
        }
       
        public DrawGlobe(Context c)
        {
            super(c);
            
            setCoords();
            coordBuffer = makeFloatBuffer(coords);
        }  

        private void initial(GL10 gl)
        {
                an += 1.0;
                if(an == 360.0)
                        an = 0;
            gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
            gl.glLoadIdentity();
            gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        }
       
        private void destroy(GL10 gl)
        {
            gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
        }
       
        @Override
        protected void drawFrame(GL10 gl)
        {
            initial(gl);
            draw(gl);        
            destroy(gl);
        }
      
        private void draw(GL10 gl)
        {
                gl.glEnable(GL10.GL_DEPTH_TEST);
            gl.glColor4f(0.5f, 0, 1, 1);
            gl.glViewport(0, 0, 480, 480);
            gl.glRotatef(an, 0, 1f, 0);
            gl.glRotatef(an, 1f, 1f, 0);
            gl.glVertexPointer(3, GL10.GL_FLOAT, 0, coordBuffer);
            gl.glDrawArrays(GL10.GL_LINE_LOOP, 0, NT);
        }
    }

    展开全文
  • 在C++上OpenGL画圆

    2018-05-14 14:15:56
    完成Liang-Barsky算法的代码实现在C++用OpenGL画圆,利用圆的参数方程:绘制圆心位于原点,半径分别为50、100、200的同心圆。
  • MFC-opengl画圆画线

    2012-10-10 18:45:44
    用mfc opengl画圆画线 单击开始画线 双击停止画线
  • opengl画圆的多种方法

    2016-01-06 01:50:09
    基于opengl的各种画圆方法,相信看完之后会大有所悟。
  • //本类主要是用opengl画圆,并让圆运动 #include #include #ifdef __APPLE__ #include #else #define FREEGLUT_STATIC #endif //#define M_PI 3.14159 GLBatch triangleBatch; GLShaderManager ...
    //本类主要是用opengl画圆,并让圆运动

    #include

    #include

    #ifdef __APPLE__

    #include

    #else

    #define FREEGLUT_STATIC

    #endif


    //#define M_PI 3.14159

    GLBatch triangleBatch;

    GLShaderManager shaderManager;

    GLfloat xxx = -0.9;

    GLfloat yyy = 0;

    GLfloat zzz = 0.0f;

    GLfloat xStep =0.1f;

    GLfloat yStep = 0.1f;

    GLfloat zStep = 0.1f;

    GLfloat r = 0.1;

    GLfloat XM = 50;

    GLfloat YM = 50;

    GLfloat xFlag =1,yFlag =1,zFlag =1,rFlag =1;;

    int time = 1000;


    //窗口大小改变时接受新的宽度和高度,其中0,0代表窗口中视口的左下角坐标,wh代表像素

    void ChangeSize(int w,int h)

    {

       glViewport(0, 0, w, h);

    }


    //球心坐标为(xyz),球的半径为radiusMN分别表示球体的横纵向被分成多少份

    void drawSphere(GLfloat xx, GLfloat yy, GLfloat zz, GLfloat radius, GLfloat M, GLfloat N)

    {

       float step_z = M_PI/M;

       float step_xy = 2*M_PI/N;

       float x[4],y[4],z[4];

        

       float angle_z = 0.0;

       float angle_xy = 0.0;

       int i=0, j=0;

        glBegin(GL_QUADS);

       for(i=0; i

        {

            angle_z = i * step_z;

            

           for(j=0; j

            {

                angle_xy = j * step_xy;

                

                x[0] = radius * sin(angle_z) * cos(angle_xy);

                y[0] = radius * sin(angle_z) * sin(angle_xy);

                z[0] = radius * cos(angle_z);

                

                x[1] = radius * sin(angle_z + step_z) * cos(angle_xy);

                y[1] = radius * sin(angle_z + step_z) * sin(angle_xy);

                z[1] = radius * cos(angle_z + step_z);

                

                x[2] = radius*sin(angle_z + step_z)*cos(angle_xy + step_xy);

                y[2] = radius*sin(angle_z + step_z)*sin(angle_xy + step_xy);

                z[2] = radius*cos(angle_z + step_z);

                

                x[3] = radius * sin(angle_z) * cos(angle_xy + step_xy);

                y[3] = radius * sin(angle_z) * sin(angle_xy + step_xy);

                z[3] = radius * cos(angle_z);  

                

               for(int k=0; k<<span style="font-variant-ligatures: no-common-ligatures; color: #272ad8">4; k++)  

                {  

                   glVertex3f(xx+x[k], yy+y[k],zz+z[k]);  

                }  

            }  

        }  

       glEnd();  

    }



     

    void drawColorSphere(float r, int segs) {

       int i, j;

       float x, y, z, z1, z2, R, R1, R2;

        

        // Top cap: a triangle fan

        glBegin(GL_TRIANGLE_FAN);

        glNormal3f(0,0,1);

       glColor3f(0.5,0.5,1);

       glVertex3f(0,0,r);

        z = cos(M_PI/segs);

        R = sin(M_PI/segs);

       for(i = 0; i <= 2*segs; i++) {

            x = R*cos(i*2.0*M_PI/(2*segs));

            y = R*sin(i*2.0*M_PI/(2*segs));

           glNormal3f(x, y, z);

           glColor3f(0.5*(x+1), 0.5*(y+1), 0.5*(z+1));

           glVertex3f(r*x, r*y, r*z);

        }

       glEnd();

        

        // Height segments: each a triangle strip

       for(j = 1; j < segs-1; j++) {

            z1 = cos(j*M_PI/segs);

            R1 = sin(j*M_PI/segs);

            z2 = cos((j+1)*M_PI/segs);

            R2 = sin((j+1)*M_PI/segs);

            glBegin(GL_TRIANGLE_STRIP);

           for(i = 0; i <= 2*segs; i++) {

                x = R1*cos(i*2.0*M_PI/(2*segs));

                y = R1*sin(i*2.0*M_PI/(2*segs));

               glNormal3f(x, y, z1);

               glColor3f(0.5*(x+1), 0.5*(y+1), 0.5*(z1+1));

               glVertex3f(r*x, r*y, r*z1);

                x = R2*cos(i*2.0*M_PI/(2*segs));

                y = R2*sin(i*2.0*M_PI/(2*segs));

               glNormal3f(x, y, z2);

               glColor3f(0.5*(x+1), 0.5*(y+1), 0.5*(z2+1));

               glVertex3f(r*x, r*y, r*z2);

            }

           glEnd();

        }

        

        // Bottom cap: a triangle fan

        glBegin(GL_TRIANGLE_FAN);

       glNormal3f(0,0,-1);

       glColor3f(0.5,0.5,0);

       glVertex3f(0,0,-r);

        z = -cos(M_PI/segs);

        R = sin(M_PI/segs);

       for(i = 2*segs; i >= 0; i--) {

            x = R*cos(i*2.0*M_PI/(2*segs));

            y = R*sin(i*2.0*M_PI/(2*segs));

           glNormal3f(x, y, z);

           glColor3f(0.5*(x+1), 0.5*(y+1), 0.5*(z+1));

           glVertex3f(r*x, r*y, r*z);

        }

       glEnd();

    }



    //为程序作一次性的设置

    void SetupRC()

    {

        //设置背影颜色

        glClearColor(1.0f, 1.0f, 0.0f, 1.0f);

        //初始化着色管理器

        shaderManager.InitializeStockShaders();

        //设置三角形,其中数组vVert包含所有3个顶点的x,y,笛卡尔坐标对。

       GLfloat vVerts[] = {

            -0.5f,0.0f,0.0f,

            0.5f,0.0f,0.0f,

            -0.5f,0.5f,0.0f,

            0.5f,0.5f,0.0f,

        };

           //批次处理

        triangleBatch.Begin(GL_QUADS,4);

        triangleBatch.CopyVertexData3f(vVerts);

        triangleBatch.End();

        

    }


    //开始渲染

    void RenderScene(void)

    {

        //清除一个或一组特定的缓冲区

        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

        //设置一组浮点数来表示红色

       GLfloat vRed[] = {0.0f,0.0f,1.0f,1.0f};

        //传递到存储着色器,即GLT_SHADER_IDENTITY着色器,这个着色器只是使用指定颜色以默认笛卡尔坐标第在屏幕上渲染几何图形

        shaderManager.UseStockShader(GLT_SHADER_IDENTITY,vRed);

        //提交着色器

    //    triangleBatch.Draw();

        //将在后台缓冲区进行渲染,然后在结束时交换到前台

        

        //球心坐标为(xyz),球的半径为radiusMN分别表示球体的横纵向被分成多少份

       drawSphere(xxx,yyy, zzz, r, XM, YM);

        glutSwapBuffers();

    }


    GLfloat Handler(GLfloat value,GLfloat tempFlag)

    {

       GLfloat flag = tempFlag ;

       if(value>=1.0f)

        {

            flag = -1;

        }

       else if (value<=-1.0f)

        {

            flag =1;

        }

    //    printf("value=%f\n,tempFlag=%f\n,flag=%f\n",value,tempFlag,flag);


       return flag;

    }


    void TimerFunc(int value)

    {

        xxx += xStep*xFlag;

        yyy += yStep*yFlag;

        zzz += zStep*zFlag;

        r += zStep*rFlag;

        

        xFlag = Handler(xxx,xFlag);

        yFlag = Handler(yyy,yFlag);

        zFlag = Handler(zzz,zFlag);

       rFlag = Handler(r,rFlag);

        

        

        

       if(time<=0)

        {

           time +=value;

        }

       else

        {

           time -=value;

        }

       while (time<=0) {

           time +=value;

        }

        printf("value=%d\n,time=%d\n",value,time);

        glutPostRedisplay();

        glutTimerFunc(time, TimerFunc, 100);

    }


    int main(int argc,char* argv[])

    {

        //设置当前工作目录,针对MAC OS X

        gltSetWorkingDirectory(argv[0]);

        //初始化GLUT

       glutInit(&argc, argv);

       

        glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);

        //GLUT窗口大小,标题窗口

        glutInitWindowSize(960, 640);

        glutCreateWindow("helloWorld");

        //注册回调函数

        glutReshapeFunc(ChangeSize);

        glutDisplayFunc(RenderScene);

        glutTimerFunc(1000, TimerFunc, 1);

        //驱动程序的初始化中没有出现任何问题。

       GLenum err = glewInit();

       if (GLEW_OK != err) {

           fprintf(stderr, "glew error:%s\n",glewGetErrorString(err));

           return 1;

        }

        

        //调用SetupRC

       SetupRC();

        glutMainLoop();

       return 0;

    }


    展开全文
  • #include<windows.h> #include<gl/glut.h> #define PI 3.141415926 #include<math.h> void Display(void); void Poloygon(void); void Reshape(int w,int h); int main(int argc,... glutInitDis
    #include<windows.h>
    #include<gl/glut.h>
    #define PI 3.141415926
    #include<math.h>
    void Display(void);
    void Poloygon(void);
    void Reshape(int w,int h);
    
    int main(int argc,char* argv[]){
        glutInit(&argc,argv);//初始化GLUT
    
         glutInitDisplayMode(GLUT_SINGLE| GLUT_RGB);//显示模式:双缓冲、RGBA
        glutInitWindowSize(1024,600); //设置窗口
        glutInitWindowPosition(400,400);
        glutCreateWindow("Car");
        glutDisplayFunc(Display);
        glutMainLoop();//调用传递指令给GLUT现在开始它的内部循环
        glClearColor(0.75f,0.75f,0.75f,0.5f);
        return 0;
    
    }
    
    
    
    void Display()
    {
        glClear(GL_COLOR_BUFFER_BIT);//清空帧缓存
    	glColor3f(1.0f,1.0f,0.0f);
    	glBegin(GL_POLYGON);
    	int n = 3600;
    	float R = 0.1f;
        for(int i = 0;i<n;i++){
               glVertex2f(cos(2*PI/n*i)*R+0.1,sin(2*PI/n*i)*R+0.1);
        }
    	glEnd();
    
        glFlush();
    
    
    }在这里插入代码片
    

    在这里插入图片描述
    反复检查后,发现代码是没有错误的,但是明明是圆的代码,为什么会生成椭圆呢?或者,换种说法,生成的其实是一个圆,但是因为被压缩了,所以,看起来是一个椭圆。

     glutInitWindowSize(1024,600);
    

    原来是在设置窗口大小时,设置的是一个长方形的窗口,就导致图形被“压扁了”
    (其实这里应该是窗口和视口变换的问题,但是我现在还不会……,就暂时把它设置为正方形的,后面再说)
    在这里插入图片描述
    这样就能得到圆了,但把窗口放大后,又变成了椭圆,所以,窗口和视口的变换还是很重要的。

    以上纯属瞎猜,有大佬看见了别骂我,hhhhh

    展开全文
  • opengl画圆实现

    2014-03-25 20:27:21
    void DrawCircle() { GLint n = 1000; GLfloat R = 0.05; GLfloat Pi = 3.14159; GLint i; glBegin(GL_POLYGON); //glColor3f(1.0, 0.0, 0.0);...glVertex2f(R*cos(2*Pi/n*i), R*sin(2*Pi/n
  • OpenGL画圆简洁小程序

    2010-08-09 19:54:00
    #define PI 3.1415  #define R 1.0 <br />GLfloat x,y,z,angle; glPushMatrix(); glTranslatef(300,200,0); glColor3f(0.0f,0.5f,0.5f); glBegin(GL_POINTS);...
  • import org.eclipse.opengl.GL; import org.eclipse.opengl.GLU; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseListener; import org.eclipse.swt.events.MouseMoveListener; imp...
  • glutCreateWindow("this is my test OpenGL project"); myinit();//光源信息、材质初始化 glutDisplayFunc(display); glutReshapeFunc(myReshape);// 改变窗口大小时保持图形比例 glutMainLoop(); }
  • opengl鼠标画圆

    2020-10-20 20:18:54
    opengl鼠标画圆 计算机图形学的第二次作业,使用了Bresenham方法。 #include <string> #include <assert.h> #include <cmath> #include <iostream> #include <vector> #include <...
  • opengl 画圆 矩形 直线 多边形 伸缩 平移 旋转 保存 读取
  • openGL画圆方法

    2011-12-25 22:48:12
    c语言里,基于openGL画圆代码
  • OpenGL 3:画圆

    2014-10-13 09:00:00
    这次使用OpenGL画圆,而且中间画一个实心的五角星。 1. 画实心五角: 由于之前使用Polygen画会出现故障,或许是各个GPU硬件也会不一样的,所以使用Polygen画实心五角星并不可靠; 所以这里直接使用三角形画出五角...
  • OpenGL3画圆

    2019-09-20 21:44:30
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); auto window = glfwCreateWindow(800, 800, "glwindow", NULL, NULL); if (window == NULL) { glfwTerminate(); return -1; } ...
  • 计算机图形学,在OpenGL画圆,绝对可行
  • opengl中点画圆

    2012-03-21 16:12:21
    计算机图形学中采了用中点画圆的方法,程序已经实现了,可以放心下载
  • 基于Opengl画圆—中心画圆算法

    千次阅读 2016-12-15 20:27:48
    画圆之前,首先需要了解如下:   当F(x, y)= 0,表示点在圆上,当F(x, y)> 0,表示点在圆外,当F(x, y)1和P2的中点,则M的坐标是(xi + 1, yi – 0.5),当F(xi +1, yi – 0.5)1点离实际圆弧更...
  • 很好的一个用图形学用OPENGL实现画圆的源程序
  • openGL画圆

    2016-09-12 18:58:00
    #include ...OpenGL画圆程序 " ); glutDisplayFunc( & myDisplay); glutMainLoop(); return 0 ; } 运行结果如下图所示:   转载于:https://www.cnblogs.com/dragonir/p/5865858.html
  • OpenGL中使用中点画圆画圆

    万次阅读 2016-10-05 09:50:52
    OpenGL 中采用中点画圆法绘制圆

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 181
精华内容 72
关键字:

opengl画圆