本文分享的是计算机图形学作业,要求使用中点画圆法原理绘制一个完整的圆。中点画圆法的基本原理自己在网上找找即可,这里不再赘述。由于是作业,仅供参考,附上可以直接运行的源码,请勿直接抄袭,否则后果自负。

中点画圆法的原理伪代码

作业1:将上述1/8圆伪代码改造为一个完整的画圆函数,函数名为:MidCircle( int x0, int y0, int r)/ / x0,yO为圆心坐标,r为半径并通过调用该函数画一个圆。注:在提交开发工程的同时,需要提交一个说明文档。写出自己的编程思路,并附一张屏幕截图。

主要代码:

(需要注意的是,这是c语言代码,后面会附上整个工程文件,工程文件不需要配置OpenGL环境,因为已经包含了opengl的库,自己写新文件的话需要在VS中写,还需要配置OpenGL的环境。前面的文章都写过相关教程:

有需要的同学请自行查看和安装。)

#include <GL/freeglut.h>

void init(void)
{
}

void reshape(int w, int h)
{
    glViewport(0,0,w,h);
}

//同时绘制八个点(对称),构成完整的圆
void setpoint(float x0, float y0, float x, float y)
{

    glBegin(GL_POINTS);
    glColor3f(1, 0, 0);
    glVertex2f((x0 + x), (y0 + y));
    glVertex2f((x0 + y), (y0 + x));
    glVertex2f((x0 + y), (y0 - x));
    glVertex2f((x0 + x), (y0 - y));
    glVertex2f((x0 - x), (y0 - y));
    glVertex2f((x0 - y), (y0 - x));
    glVertex2f((x0 - y), (y0 + x));
    glVertex2f((x0 - x), (y0 + y));
    glEnd();
}

void MidCircle(float x0, float y0, float r)//中点画圆法
{

    float x = 0;
    float y = r;
    float d = 1.25 - r;      
    setpoint(x0, y0, x, y);
    while (x <= y)
    {
        if (d < 0)
        {
            d += 2 * x + 3;
        }
        else
        {
            d += 2 * (x - y) + 5;
            y--;
        }
        x++;
        setpoint(x0, y0, x, y);
    }
    glFlush();
}

void display(void)
{
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(-100.0, 100.0, -100.0, 100.0); //窗口坐标范围

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    float x0 = 0, y0 = 0, r = 60;
    MidCircle(x0, y0, r);
}


int main(int argc,char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(500,500);
    glutInitWindowPosition(100,100);
    glutCreateWindow("SY2207105_MidCircle");
    init();

    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutMainLoop();

    return 0;
}

运行结果:

重点画圆法结果


第二种是基于C++写的,在网上参考的,也可以画,但是疑惑比较多:


#include <GL/freeglut.h>
#include<math.h>
#include<iostream>
using namespace std;

void init(void);
void reshape(int w,int h);
void display(void);
void setcirpot(float x, float y);
void Mid_circle(float r);


void init(void)
{
}

void reshape(int w, int h)
{
    glViewport(0,0,w,h);
}

void setcirpot(float x, float y) {
    //默认圆心(0,0)
    glBegin(GL_POINTS);
    glColor3f(1, 0, 0);
    glVertex2f(x / 1000, y / 1000);
    glVertex2f(y / 1000, x / 1000);
    glVertex2f(x / 1000, -y / 1000);
    glVertex2f(y / 1000, -x / 1000);
    glVertex2f(-x / 1000, -y / 1000);
    glVertex2f(-y / 1000, -x / 1000);
    glVertex2f(-y / 1000, x / 1000);
    glVertex2f(-x / 1000, y / 1000);
    glEnd();
}

void Mid_circle(float r)
{
    glClear(GL_COLOR_BUFFER_BIT);
    float x, y, d;
    x = 0;
    y = r;
    d = 1 - r;
    setcirpot(x, y);
    while (x <= y) {
        if (d <= 0) {
            d = d + 2 * x + 3;
        }
        else {
            d = d + 2 * (x - y) + 5;
            y--;
        }
        x++;
        setcirpot(x, y);
    }
    glFlush();
}


void display(void) {
    float r;
    cout << "Please input r" << endl;
    cin >> r;
    Mid_circle(r);
}

int main(int argc, char** argv) {
    glutInit(&argc, argv); //初始化glut

    glutInitDisplayMode(GLUT_DEPTH | GLUT_SINGLE | GLUT_RGBA);
    //设置窗口的模式-深度缓存,单缓存,颜色模型

    glutInitWindowPosition(200, 200); //设置窗口的位置

    glutInitWindowSize(400, 400); //设置窗口的大小

    glutCreateWindow("SY2207105"); //创建窗口并赋予title

    glutDisplayFunc(display);//调用display把绘制传送到窗口,这个函数的原型为glutDisplayFunc(void)

    glutMainLoop(); //进入循环等待

    return 0;
}


下面是整个工程文件,基于C语言,不需要配置OpenGL环境,freeglut300文件夹就是OpenGL的库。直接用VS2022打开就可以使用。

第一次作业_中点画圆法_工程文件


版权声明 ▶ 本网站名称:陶小桃Blog
▶ 本文链接:https://www.52txr.cn/2022/MidCircle.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!
▶ 站长邮箱 [email protected][email protected] ,如不方便留言可邮件联系。

最后修改:2022 年 09 月 26 日
如果觉得我的文章对你有用,请随意赞赏