在https://blog.csdn.net/derbi123123/article/details/105397176中详细说明了kock曲线的原理并以直线段实现迭代次数在6次以内的kock曲线并用键盘交互控制迭代次数

代码:

功能:按a增加迭代次数,按d减少迭代次数。
迭代六次(按六次a)效果:

#include <GL/freeglut.h>
#include <math.h>
#include <vector>
#define max_iteration_num 6//最多迭代六次
using namespace std;struct Vertex{GLfloat x,y;
};
vector<Vertex> V[3][max_iteration_num+1];//分别记录3条边各自6次迭代的数据(0、1、2、3、4、5、6)
int iteration_num=0;//记录迭代次数
GLfloat width=800.0,height=800.0;

//用户初始化函数
void myinit(void)
{//设置清除屏幕的颜色glClearColor(0.0f,0.0f,0.0f,0.0f);Vertex Start[3],End[3];//初始元(三角形)的三个端点(每条边两个,有重合的)Start[0].x=400.0;Start[0].y=800.0;End[0].x=(800.0-400.0*sqrt(3.0))/2;End[0].y=200.0;Start[1].x=End[0].x;Start[1].y=End[0].y;End[1].x=400+200*sqrt(3.0);End[1].y=200;Start[2].x=End[1].x;Start[2].y=End[1].y;End[2].x=Start[0].x;End[2].y=Start[0].y;//第零次迭代(没迭代)for(int i=0;i<3;i++){V[i][0].push_back(Start[i]);V[i][0].push_back(End[i]);}}//窗口大小变化时的回调函数
void myReshape(GLsizei w, GLsizei h)
{//设定视区glViewport(0, 0, w, h);//设定透视方式glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0,800.0,0.0,800.0);
}
//计算当前迭代次数下的各顶点坐标
void compute()
{static int tmp=0;//记录上次绘制时迭代次数int flag=0;//记录迭代次数是否被更新过if(tmp<iteration_num){int len=V[0][iteration_num-1].size();for(int j=0;j<3;j++){for(int i=0;i<len-1;i++){V[j][iteration_num].push_back(V[j][iteration_num-1][i]);Vertex tmp;tmp.x=V[j][iteration_num-1][i].x+(V[j][iteration_num-1][i+1].x-V[j][iteration_num-1][i].x)/3;tmp.y=V[j][iteration_num-1][i].y+(V[j][iteration_num-1][i+1].y-V[j][iteration_num-1][i].y)/3;V[j][iteration_num].push_back(tmp);tmp.x=(V[j][iteration_num-1][i].x+V[j][iteration_num-1][i+1].x)/2-(V[j][iteration_num-1][i].y-V[j][iteration_num-1][i+1].y)*sqrt(3.0)/6;tmp.y=(V[j][iteration_num-1][i].y+V[j][iteration_num-1][i+1].y)/2-(V[j][iteration_num-1][i+1].x-V[j][iteration_num-1][i].x)*sqrt(3.0)/6;V[j][iteration_num].push_back(tmp);tmp.x=V[j][iteration_num-1][i].x+2*(V[j][iteration_num-1][i+1].x-V[j][iteration_num-1][i].x)/3;tmp.y=V[j][iteration_num-1][i].y+2*(V[j][iteration_num-1][i+1].y-V[j][iteration_num-1][i].y)/3;V[j][iteration_num].push_back(tmp);}V[j][iteration_num].push_back(V[j][iteration_num-1][len-1]);}tmp=iteration_num;}
}
//每桢OpenGL都会调用这个函数,用户应该把显示代码放在这个函数中
void display(void)
{//清除屏幕缓冲  glClear(GL_COLOR_BUFFER_BIT);compute();//开始绘制glColor3f(1.0,1.0,1.0);for(int j=0;j<3;j++){glBegin(GL_LINE_STRIP);for(int i=0;i<V[j][iteration_num].size();i++){glVertex2f(V[j][iteration_num][i].x,V[j][iteration_num][i].y);}glEnd();}//交换前后缓冲区glutSwapBuffers();
}
void processNormalKeys(unsigned char key,int x,int y)
{switch(key) {case 97:  //按a增加迭代次数if(iteration_num<max_iteration_num){iteration_num++;}break;case 100: //按d减少迭代次数if(iteration_num>0){iteration_num--;}break;case 27:    //"esc"exit(0);}glutPostRedisplay();
}//主函数
int main(int argc, char* argv[])
{glutInit(&argc, argv);//初始化OPENGL显示方式glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA);//设定OPENGL窗口位置和大小glutInitWindowSize (800, 800); glutInitWindowPosition (100, 100);//打开窗口glutCreateWindow ("kock曲线");//调用初始化函数myinit();//设定窗口大小变化的回调函数glutReshapeFunc(myReshape);//设定键盘控制的回调函数glutKeyboardFunc(processNormalKeys);//开始OPENGL的循环glutDisplayFunc(display); glutMainLoop();return 0;
}

以等边三角形实现迭代次数在6次以内的kock雪花曲线并用键盘交互控制迭代次数相关推荐

  1. 用友如何控制打印次数

    用友如何控制打印次数 前言:仓库在领料时,同一张领料单可能打印了多次,就可能存在一种物料重复性的领料,导致库存数对应不上,那么如何避免重复打单呢?用友提供了打印次数的控制,比如打印次数设置为1,也就是 ...

  2. Fresco加载图片使用笔记--基本使用,播放动态wbep,控制播放次数,预加载,闪帧解决

    1. 简单使用 2. 属性控制 3. 播放动态webp 4. 监听webp播放及控制webp播放次数 5. 预取图片 6. 连续加载多张动图闪帧解决方案 1. 简单使用 1)添加依赖: depende ...

  3. 记录一个面试题 统计出现次数最多的文件后缀名,如果有多个后缀名出现次数一样多,就都返回def count_extnames(files: list) - list: return # 补全这里的代码

    统计出现次数最多的文件后缀名,如果有多个后缀名出现次数一样多,就都返回 def count_extnames(files: list) -> list:return # 补全这里的代码 例如 输 ...

  4. c语言控制迭代次数,LR中的迭代次数设置

    在参数化时,对于一次压力测试中均只能用一次的资源应该怎么参数化呢?就是说这些资源用了一次就不能在用了的. --参数化时,在select  next row选择unique,update value o ...

  5. java timer.schedule如何控制执行次数_Java 分布式任务调度平台:PowerJob 快速开始+配置详解...

    本文适合有 Java 基础知识的人群 作者:HelloGitHub-Salieri 引言 HelloGitHub 推出的<讲解开源项目>[1]系列. 项目地址: https://githu ...

  6. java怎样控制迭代周期_如何在Java 8中一年中每周迭代一次?

    您可以使用以下内容构建日期并将其调整为一年中第一周的第一天: int year = 2016; WeekFields weekFields = WeekFields.ISO; LocalDate da ...

  7. python出现的次数最多的元素_Python cookbook(数据结构与算法)找出序列中出现次数最多的元素算...

    本文实例讲述了Python找出序列中出现次数最多的元素.分享给大家供大家参考,具体如下: 问题:找出一个元素序列中出现次数最多的元素是什么 解决方案:collections模块中的Counter类正是 ...

  8. 数组重复次数最多的元素递归_使用递归计算链接列表中元素的出现次数

    数组重复次数最多的元素递归 Solution: 解: Required function: 所需功能: func_occurence ( node *temp) //recursive functio ...

  9. java怎样控制迭代周期_如何在Java中迭代日期范围?

    好吧,你可以使用Java 8的time-API做这样的事情,特别是这个问题java.time.LocalDate(或Java 7及更早版本的等效Joda Time类) for (LocalDate d ...

最新文章

  1. sql文件与数据库的连接到服务器,如何:连接到基于文件的数据库
  2. python递归深度报错--RuntimeError: maximum recursion depth exceeded
  3. 野火 stm32f429 pcb_PCB板价格是如何核算的
  4. Linux内核链表 内存屏障,为什么需要内存屏障
  5. SqlSession的使用范围---Mybatis学习笔记(五)
  6. mysql自动插入的时间不对 差8小时
  7. 【分享】WeX5的正确打开方式(5)——绑定机制
  8. 记一次和摄像头的摩擦经历
  9. vk_down 每次下翻丙行 c++_笔记本接口不够用?不妨试试这款Type-C拓展坞,给你7个接口用...
  10. struct lnode是什么结构类型_【自考】数据结构第三章,队列,期末不挂科指南,第4篇
  11. 94级计算机科学,清华大学计算机科学与技术系
  12. Python中李群SO(3)与李代数so(3)之间指数映射与实现源码
  13. Exchange Server 2013系统要求
  14. 利用QDataStream将大文件转化成二进制文件QBatyArray
  15. 12 个追地铁的人:照亮生活的一次追逐
  16. 计算机垃圾清理指令,win7电脑清理垃圾的运行命令代码是什么
  17. linux基本命令总结
  18. react-navigation之navigate
  19. python实现程序自动运行的库_python tkiner实现自动打包程序
  20. 傻妞旧版合集新版订阅

热门文章

  1. AndroidAPP的安全模型
  2. fastp—数据过滤质控
  3. 00_零基础postman操作
  4. 超详细的张飞硬件90天读书笔记03
  5. ipv4、ipv6格式校验代码
  6. MIC29302WU不调压的问题
  7. JS编程输出我国古代数学家张丘建在《张丘建算经》一书中提出了“百只鸡问题”。这个问题大概的意思是这样子的:公鸡5文钱1只,母鸡3文钱1只,小鸡3只1文钱,如果用100文钱买100只鸡,那么公鸡、母鸡和
  8. 面试时谈薪资需要注意的地方
  9. python读取oracle数据库数据库_Python读写Oracle数据库
  10. 【心酸】从上一家公司到下一家公司