图形学第1次作业-2D的Sierpinski镂垫

在基于多边形的Sierpinski镂垫的基础上增加如下功能:

1、按q键退出;

2、右键菜单-随机换一种颜色;

3、在细分三角形之前增加了扰动;

代码如下:

#include <Windows.h>
#include <cstdio>
#include <random>
#include <functional>
#include "glut.h"

typedef GLfloat point2d[2];

point2d v[3] = { { 0.0, 0.0 }, { 250.0, 500.0 }, { 500.0, 0.0 } };

std::uniform_int_distribution<int> uniform_dist(0, 255);
std::normal_distribution<double> normal_dist(2.0, 0.05); //这个正态分布发生器用于扰动细分三角形的中点
std::default_random_engine engine;
auto uniform_rand = std::bind(uniform_dist, engine);
auto normal_rand = std::bind(normal_dist, engine);

void triangle(point2d a, point2d b, point2d c) {
    glBegin(GL_LINE_LOOP);
    glVertex2fv(a);
    glVertex2fv(b);
    glVertex2fv(c);
    glEnd();
}

void divide_triangle(point2d a, point2d b, point2d c, int k) {
    point2d ab, ac, bc;
    if (k > 0)
    {
        for (int j = 0; j < 2; j++)
            ab[j] = (a[j] + b[j]) / normal_rand();
        for (int j = 0; j < 2; j++)
            ac[j] = (a[j] + c[j]) / normal_rand();
        for (int j = 0; j < 2; j++)
            bc[j] = (b[j] + c[j]) / normal_rand();
        divide_triangle(a, ab, ac, k - 1);
        divide_triangle(b, ab, bc, k - 1);
        divide_triangle(c, ac, bc, k - 1);
    }
    else
        triangle(a, b, c);
}

void display(void) {
    glClear(GL_COLOR_BUFFER_BIT);
    divide_triangle(v[0], v[1], v[2], 5);
    glFlush();
}

void my_init(void) {
    glClearColor(1.0, 1.0, 1.0, 1.0);
    glColor3f(1.0, 0.0, 0.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0.0, 500.0, 0.0, 500.0);
    glMatrixMode(GL_MODELVIEW);
}

void my_menu(int entry_id) {
    switch (entry_id) {
    case 0:
        glClear(GL_COLOR_BUFFER_BIT);
        glColor3b(uniform_rand(), uniform_rand(), uniform_rand());
        glutPostRedisplay();
        break;
    /*case 1: {
        CHOOSECOLOR color;
        printf("%d\n", ChooseColor(&color));
        glClear(GL_COLOR_BUFFER_BIT);
        glColor3b(GetRValue(color.rgbResult), GetGValue(color.rgbResult), GetBValue(color.rgbResult));
        glutPostRedisplay();
        break;
    }*/
    default:
        break;
    }
}

void keyboard(unsigned char key, int x, int y) {
    if (key = ‘q‘ || key == ‘Q‘)
        exit(0);
}

int main(int argc, char *argv[]) {
    HWND hWnd = GetForegroundWindow();
    ShowWindow(hWnd, SW_HIDE); //hide cmd window

    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(500, 500);
    glutCreateWindow("2D Sierpinski (Triangle Ver)");
    glutDisplayFunc(display);

    int menu_id = glutCreateMenu(my_menu);
    glutAddMenuEntry("随机颜色重画", 0);
    //glutAddMenuEntry("选择颜色", 1);
    glutAttachMenu(GLUT_RIGHT_BUTTON);
    glutKeyboardFunc(keyboard);
    my_init();
    glutMainLoop();

    return 0;
}

运行截图:

时间: 2024-10-21 11:27:13

图形学第1次作业-2D的Sierpinski镂垫的相关文章

02-&gt;交互式图形学--用glut库实现Sierpinski镂垫

Sierpinski图形是一类有趣的图形,本文结合交互式图形学教材,讲解Sierpinski镂垫图形生成,作为入门图形学编程的第一课.为了简便,本文就2D来进行讨论.实验环境见01 算法 主要是根据随机性生成一系列的点,这些点在屏幕上显示,发现无序中尽显有序!算法流程如下: 1 在三角形内随机选择一个初始点p(x, y) 2 随机选择三角形顶点之一 3 计算p和随机选择顶点之间的中点q 4 将q对应位置用相应标记在图形中显示出来 5 用这个中点q代替原来的p 6 转到步骤2,直到取得一定数量的点

2-D range sum query implementation(2-D segment tree)

Google interview question:一个二维数组,有两个方法,一个是update(x,y),更新一个cell的值,一个是query(x1,y1,x2,y2),查询(x1,y1,x2,y2)矩形内所有元素的和. Senario 1. update调用次数远大于query. Senario 2. query调用次数远大于update. Senario 3. 两种方法调用一样多. 对于senario 1,只需要用一个二维数组储存数据,update相应的cell,时间复杂度O(1),qu

分享:计算机图形学期末作业!!利用WebGL的第三方库three.js写一个简单的网页版“我的世界小游戏”

这几天一直在忙着期末考试,所以一直没有更新我的博客,今天刚把我的期末作业完成了,心情澎湃,所以晚上不管怎么样,我也要写一篇博客纪念一下我上课都没有听,还是通过强大的度娘完成了我的作业的经历.(当然作业不是百度来的,我只是百度了一些示例代码的意思,怎么用!算了,越解释万一越黑呢!哈哈O(∩_∩)O哈哈~) ----------------------------------------------------------------分界线------------------------------

剑英陪你玩转图形学 (二)彩虹

1. 今天的主题是颜色 开篇废话 今天看到蛮牛把干货区放上了主页,居然还能看到我的帖子,让我很不好意思. 各位同学对不起,我来晚了. 今天的李总是因为姓李,又总是迟到,所以叫做李总. 今天还是讲图形学,为人不识武藤....,骇骇,最近好像扫黄,不能说这个,大家都知道,关键是不搞软渲染,你就枉然了.软渲染我们上次已经玩过了,知道所以然,了解渲染是怎么一件事,目标就已经达到了. 渲染这条路上还有很多东西,今天我们到unity3d里面去玩.图形相关要聊的事情太多了,从头讲到做一个引擎出来,估计这个系列

Stanford coursera Andrew Ng 机器学习课程编程作业(Exercise 2)及总结

Exercise 1:Linear Regression---实现一个线性回归 关于如何实现一个线性回归,请参考:http://www.cnblogs.com/hapjin/p/6079012.html Exercise 2:Logistic Regression---实现一个逻辑回归 问题描述:用逻辑回归根据学生的考试成绩来判断该学生是否可以入学. 这里的训练数据(training instance)是学生的两次考试成绩,以及TA是否能够入学的决定(y=0表示成绩不合格,不予录取:y=1表示录

软工总结 作业

总的来说,这本书我还没看完.看全,但是有一些文段还是给我了不少启发.我向来痛恨不知所云的某些教材,就算有校对之人,但其作者的言语不工至极,好似其语文功底处于马里亚纳海沟之中,弄得人总是一头雾水.要是再碰上逻辑混乱一点的作者,就更加崩溃.这就像你写一个安装VC的教程,但是你没有照顾到所有种类的电脑环境,这样在安装的时候就会出各种错误,更为可气的是,VC这破玩意卸载器是无法完美利落的卸载自己的程序的,VC2015尤为甚之,所以只能借助类似absolute uninstaller之类的软件完整卸载.之

SPM第一次作业

题目:简要介绍一次我参与的项目 项目名称:计算机图形学课程大作业——“苹果园”游戏设计开发 项目目标:实现一个以“苹果园”故事为背景的3D游戏的开发 细节目标: 1.构造主人公角色3D模型: 2.构造苹果园3D模型: 3.编写游戏进行控制代码: 4.编写游戏摄像机运动代码: 5.渲染游戏效果,实现图形学要求. 计划时间: 2015年10月~2015年12月 实际时间: 2015年12月~2016年1月 项目资源: 金钱:无: 工具:计算机: 平台:visual studio2013 语言:jav

magedu.com-网络班第四期-29-张健华-第六次作业

本周作业内容: 1.详细描述一次加密通讯的过程,结合图示最佳. 一.client_hello 客户端发起请求,以明文传输请求信息,包含版本信息,加密套件候选列表,压缩算法候选列表,随机数,扩展字段等信息,相关信息如下: 支持的最高TSL协议版本version,从低到高依次 SSLv2 SSLv3 TLSv1 TLSv1.1 TLSv1.2,当前基本不再使用低于 TLSv1 的版本 客户端支持的加密套件 cipher suites 列表, 每个加密套件对应前面 TLS 原理中的四个功能的组合:认证

linux运维实战练习-2016年1月19日-2月3日课程作业

I.作业(练习)内容: 1.描述centos6系统开机启动流程: a.开机BIOS加电自检测各种硬件信息 b.读取第一个可启动设备MBR,加载grub c.依据boot loader的设置初始化内核信息,内核依据initrd虚拟的磁盘和文件系统实现对根文件系统的挂载 d.切换到根文件系统, e.启动系统第一个进程init,准备好系统所需要的各项服务 f.登录界面 2.描述/etc/rc.d/sysinit脚本功能: 通过分析代码查看sysinit所具有的功能有: a.取得网络环境与主机名 b.激