计算机图形学第四章练习——画饼图

计算机图形学第四章后边示例代码里有一段画饼图的练习,画出来是这样的

中间有一段中心画圆法未实现,搜集了网上资料补全并执行了这段代码,作为openGL的学习练习

#include <GL/glut.h>
#include <stdlib.h>
#include <math.h>

GLsizei winWidth = 400, winHeight = 300;

const GLdouble twoPi = 6.283185;

class scrPt
{
public:
    GLint x, y;
};

class screenPt
{
public:
    screenPt()
    {
        x = y = 0;
    }

    GLint x, y;
    void setCoords(GLint xCoordValue, GLint yCorrdValue)
    {
        x = xCoordValue;
        y = yCorrdValue;
    }

    GLint getx() const
    {
        return x;
    }

    GLint gety() const
    {
        return y;
    }

    void incrementx()
    {
        x++;
    }

    void decrementy()
    {
        y--;
    }
};

void init(void)
{
    glClearColor(1.0, 1.0, 1.0, 1.0);            // 将窗口北京初始化为白色
    glMatrixMode(GL_PROJECTION);                 // 对投影矩阵操作
    gluOrtho2D(0.0, 200.0, 0.0, 150.0);          // 建立一个2D坐标系
}

void setPixel(GLint xCoord, GLint yCoord)
{
    glBegin(GL_POINTS);
    glVertex2i(xCoord, yCoord);
    glEnd();
}

void circlePlotPoints(GLint xc, GLint yc, screenPt circPt)
{
    setPixel(xc + circPt.getx(), yc + circPt.gety());
    setPixel(xc - circPt.getx(), yc + circPt.gety());
    setPixel(xc + circPt.getx(), yc - circPt.gety());
    setPixel(xc - circPt.getx(), yc - circPt.gety());
    setPixel(xc + circPt.gety(), yc + circPt.getx());
    setPixel(xc - circPt.gety(), yc + circPt.getx());
    setPixel(xc + circPt.gety(), yc - circPt.getx());
    setPixel(xc - circPt.gety(), yc - circPt.getx());
}

// 中心画圆法
void circleMidpoint(scrPt circCtr, GLint radius){
    screenPt circPt;
    GLint p = 1 - radius;
    circPt.setCoords(0, radius);

    circlePlotPoints(circCtr.x, circCtr.y, circPt);
    while (circPt.getx() < circPt.gety()){
        circPt.incrementx();
        if (p < 0)
            p += 2 * circPt.getx() + 1;
        else{
            circPt.decrementy();
            p += 2 * (circPt.getx() - circPt.gety()) + 1;
        }
        circlePlotPoints(circCtr.x, circCtr.y, circPt);
    }
}

template<class T>
int length(T& arr)
{
    return sizeof(arr) / sizeof(arr[0]);
}

// 画饼图
void pieChart(void)
{
    scrPt circCtr, piePt;
    GLint radius = winHeight / 4;       // 圆的半径
    GLdouble sliceAngle, previousSliceAngle = 0.0;

    GLfloat dataValues[12] = {10.0, 7.0, 13.0, 5.0, 13.0, 14.0, 3.0, 16.0, 5.0, 3.0, 17.0, 8.0};        // 饼图数据占比

    GLfloat dataSum = 0.0;

    circCtr.x = winWidth / 2;
    circCtr.y = winHeight / 2;
    circleMidpoint(circCtr, radius);            //中心画圆法,画出饼图外圆

    for(GLint k = 0; k < length(dataValues); k++)
    {
        dataSum += dataValues[k];                        // 计算数据总量
    }

    for(GLint k = 0; k < length(dataValues); k++)
    {
        sliceAngle = twoPi * dataValues[k] / dataSum + previousSliceAngle;          // 计算角度
        piePt.x = circCtr.x + radius * cos(sliceAngle);                            // 计算落点x
        piePt.y = circCtr.y + radius * sin(sliceAngle);                            // 计算落点y

        glBegin(GL_LINES);                                                         // 划线从原点到数据落点的
            glVertex2i(circCtr.x, circCtr.y);
            glVertex2i(piePt.x, piePt.y);
        glEnd();
        previousSliceAngle = sliceAngle;
    }
}

void displayFunc(void)
{
    glClear(GL_COLOR_BUFFER_BIT);            //显示缓存背景色
    glColor3f(1.0, 0.0, 1.0);                // 初始化画笔颜色
    pieChart();
    glFlush();
}

void winReshapeFunc(GLint newWidth, GLint newHeight)
{
    glMatrixMode(GL_PROJECTION);                        // 对投影矩阵操作
    glLoadIdentity();                                   // 重置当前指定的矩阵为单位矩阵
    gluOrtho2D(0.0, GLdouble(newWidth), 0.0, GLdouble(newHeight));    // 重新建立坐标系
    glClear(GL_COLOR_BUFFER_BIT);                                    

    winWidth = newWidth;
    winHeight = newHeight;
}

int main(int argc, char ** argv)
{
    glutInit(&argc, argv);                          // 初始化
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);    // 单一缓存RGB模式
    glutInitWindowPosition(100, 100);               // 初始化窗口位置
    glutInitWindowSize(winWidth, winHeight);        // 初始化窗口大小
    glutCreateWindow("en?~");                       // 创建窗口

    init();
    glutDisplayFunc(displayFunc);           // 注册显示回调函数
    glutReshapeFunc(winReshapeFunc);        // 改变窗口大小回调函数
    glutMainLoop();
    return 0;
}

原文地址:https://www.cnblogs.com/ziyoulu/p/10040950.html

时间: 2024-11-05 22:44:03

计算机图形学第四章练习——画饼图的相关文章

《Unity Shader 与 计算机图形学》第二章

提示:本篇将会非常长~ 本系列文章分为 硬件 编程入门 工程实践 上一篇 主要介绍了GPU的特征工作原理 以及渲染的底层流程 其实对于新架构而言还有所不同 Shader描述了如何渲染物体的信息,包括: Texture Setup.纹理设置 Material Property.材质设置 Render State.渲染状态 Blend Setup.混合设置 Pixel Shader.像素着色 Vertex Shader.定点着色 Render Target Setup 渲染目标设置 Shader并不

计算机图形学之数字微分分析画线算法

现代计算机绘制,我们程序员经常会碰到画图的编程问题,并且现在的画图的API很多,换句话说,图形API非常丰富,从TC的graphic到Windows的GDI/GDI+,以及跨平台的开放标准OpenGL.这些API都提供了基本的绘图函数,如绘制直线,圆以及椭圆之类的. 画直线的算法也叫做直线的光栅化,我们知道,我们的计算机显示的屏幕实际上是一个个的像素组成的,绘图算法就是要在逼近直线的像素上进行着色输出. 是选择直线两端点变化较大的一个方向,从起始点开始,逐次递推得到着色的结果. DDA算法的流程

计算机组成原理第四章(指令系统)

指令系统的发展与性能要求 指令系统的发展: 指令 CPU能自动完成的一个基本操作 用户与计算机交流的基本元素 机器指令,微指令,宏指令 指令系统 一个CPU能执行的所有指令的集合 指令系统体现了CPU的功能(非性能) 指令系统的发展 CISC RISC 对指令系统性能的要求 完备性 功能完善 有效性 空间 时间 规整性 对称.匀齐.一致 兼容性 向上兼容的本质含义 编程语言 程序 有意义的一串指令或语句 机器语言 汇编语言 汇编程序 高级语言 编译(解释)程序 高级语言程序内嵌汇编语言 低级语言

计算机图形学_第一章_绪论

1.彩色CRT显示器:高速的电子束由电子枪发出,经过聚焦系统.加速系统和磁偏转系统就会到达荧光屏的特点位置. 2.从高能态回到低能态能发出荧光 3.要显示 一副稳定的画面,必须不断地发射电子束 4.电子枪由一个加热器,金属阴极,电平控制器组成 5.使用电平控制器来孔子电子束的强弱,当加上正电压时,电子束大量通过,在屏幕上形成较亮的点,负电压->电子束被部分或全部拦截. 6.刷新一次是指电子束从上到下将荧光屏扫描一次. 7.三原色:红,绿 ,蓝 8.液晶介于液体与固体之间的特殊物质,它具有液体的流

计算机操作系统-第四章:存储器管理

存储层次至少三级:CPU寄存器,主存,辅存. 寄存器和主存储器又被称为可执行存储器.(可使用一条load或store指令对可执行存储器访问,但辅存需要通过io设备实现) 主存储器简称内存或主存,用于保存进程运行时的程序和数据,也简称可执行存储器. 寄存器具有与处理机相同的速度,对寄存器访问速度最快,完全能与CPU协调工作. 高速缓存:介于寄存器和存储器之间的存储器,主要用于备份主存中较常用的数据,以减少处理机对主存储器的访问次数,大幅提高程序执行速度. 磁盘缓存:由于目前磁盘的IO速度远低于对主

计算机图形学

计算机图形学学习网站: 清华大学计算机图形学课程 第一章 图形学简介 1.1 计算机图形学的研究内容1.2 发展的历史回顾1.3 应用及研究前沿1.4 图形设备 2学时 第二章 颜色模型.图像基本知识.Phong光照模型 2.1 颜色模型    2.1.1 颜色模型的视觉基础    2.1.2 RGB颜色模型    2.1.3 HSV颜色模型    2.1.4 其它颜色模型2.2 图像基本知识2.3 Phong光照模型 2学时 第三章 视图模型变换 3.1 视图模型变换和视点的意义3.2 视图变

2014年计算机软考《网络管理》知识点-【第四章】

51CTO学院,在软考备考季特别整理了"2014年计算机软考<网络管理>知识点",帮助各位学院顺利过关!更多软件水平考试辅导及试题,请关注51CTO学院-软考分类吧! 查看汇总:2014年计算机软考<网络管理>知识点汇总  第四章 局域网系统 ☆局域网系统是将小区域内各种通信设备连在一起的通信网络. 4.1 总线/树型网络 (1) 总线/树拓扑是一个多点介质,多个设备共享单个数据通路,而同时只允许一个设备发送数据. (2) 在总线/树拓扑的多点介质传输中,有两个

计算机图形学 复习笔记

计算机图形学 复习笔记 (个人整理,仅做复习用 :D,转载注明出处:http://blog.csdn.net/hcbbt/article/details/42779341) 第一章 计算机图形学综述 研究内容 图形的概念:计算机图形学的研究对象 能在人的视觉系统中产生视觉印象的客观对象 包括自然景物.拍摄到的图片.用数学方法描述的图形等等 图形的要素 几何要素:刻画对象的轮廓.形状等 非几何要素:刻画对象的颜色.材质等 图形表示法 点阵表示 枚举出图形中所有的点,简称为图像. 参数表示 由图形的

【计算机图形学课程】二.MFC鼠标响应函数模拟画图软件

上一篇文章我们讲述MFC绘制图形的基本函数,包括绘制直线.绘制矩形.绘制椭圆及绘制文字,同时通过绕圆旋转和矩形平移简单的理解了图形学知识.这篇文章我将介绍鼠标响应和键盘响应,通过这些事件让学生实现一个类似画图的简单软件,同时充分发挥学生想象,自己创作东西.        前文:       [计算机图形学课程]一.MFC基本绘图函数使用方法 一. MFC工程创建及鼠标响应 新建一个MFC 单文档的应用程序"MousePic". 然后,选择"View(视图)"->