IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【计算机图形学】01—分形树(OpenGL)(C++语言)(程序+运行结果) -> 正文阅读

[C++知识库]【计算机图形学】01—分形树(OpenGL)(C++语言)(程序+运行结果)

计算机图形学01—分形树(OpenGL)(C++语言)

本篇用来展示使用OpenGL做的分形树。编程语言使用的是C++语言。

程序运行结果如下所示:

在这里插入图片描述

在程序中还设置了场景漫游,可以使用键盘来控制前进、后退、向左转以及向右转。

程序代码:

由于程序较多,这里展示画分形树的重要函数代码,完整代码资源可见计算机图形学—分形树(OpenGL)

void LSystemRule1()
{
	//初始化
	//std::cout << "进入LSystemRule()" << endl;
	way = "FA[+X][-&X]-%XB";
	//std::cout << "进入LSystemRule()  定义了三条规则" << endl;
	len = 30.0f;//长度
	Alphaz = 40;
	Alphay = 60;
	n = 8;
	k = 0;
	stackpointer = 0;//栈顶指针
	for (int i = 0; i < 150; i++)
	{
		stack[i].point.x = 0.0;
		stack[i].point.y = 0.0;
		stack[i].point.z = 0.0;
		stack[i].directionz = NULL;
		stack[i].directiony = NULL;
	}
	temprule = way;
	for (int i = 1; i <= n; i++)
	{
		int curlen = temprule.length();
		int pos = 0, j = 0;
		while (j < curlen)
		{
			if (temprule[j] == 'X')//迭代,将其中的F替换成文法模型
			{
				rule += way;
				j++;
				pos = rule.length() - 1;
			}
			else//保留转角
			{
				rule += temprule[j];
				pos++;
				j++;
			}
		}
		temprule = rule;
		rule.clear();
	}
	rule = temprule;//迭代好之后的文法规则

}
void LSystemRule2()
{
	//初始化
	std::cout << "进入LSystemRule()" << endl;
	/*grassway[0] = "FFF[+&FF]F[-%%%%%&F]F";
	grassway[1] = "FFF[+%FF]F[-F&[+%F]]";
	grassway[2] = "FF-[&&--F+F+F]+[%+F+F-F]";
	grassway[3] = "FF[+F+F-[++F-F++F]]F[--F-F+[F-F++F]]";
	grassway[4] = "FF[&F&F%[F%F&&F]]F[%F%F&[F%F&&F]]";*/
	gr = "FF[+%%F+F-[%F-F++F]]F[%-F-F+[F-F++F]]";
	std::cout << "进入LSystemRule()  定义了三条规则" << endl;
	lenline = 0.1f;//长度
	Alpha = 35;
	num = 2;

	stackpointer1 = 0;
	for (int i = 0; i < 150; i++)
	{
		stack1[i].point.x = 0.0;
		stack1[i].point.y = 0.0;
		stack1[i].point.z = 0.0;
		stack1[i].directiony = NULL;
		stack1[i].directionz = NULL;
	}
	//rule = way[0];
	//rule1 = grassway[rand() % 5];
	rule1 = gr;
	for (int i = 1; i <= num; i++)
	{
		int curlen = temprule1.length();
		//cout << curlen << endl;
		int pos = 0, j = 0;
		while (j < curlen)
		{
			if (temprule1[j] == 'F')
			{
				//rule1 += grassway[rand() % 5];
				rule1 += gr;
				//rule = way[0];
				j++;
				pos = rule1.length() - 1;
			}
			else
			{
				rule1 += temprule1[j];
				pos++;
				j++;
			}
		}
		temprule1 = rule1;
		//rule1.empty();
		rule1.clear();
	}
	rule1 = temprule1;

	std::cout << "出LSystemRule()" << endl;
}
void drawGrass(CVector3D p,float R,float G,float B)
{
	Node  Nextnode, Curnode;
	Curnode.point.x = p.x;
	Curnode.point.y = p.y;
	Curnode.point.z = p.z;
	Curnode.directionz = -85;
	Curnode.directiony = 0;
	int length = rule1.length();
	//std::cout << "长度 = " << length << endl;
	int  i = 0;
	//cout << rule << endl;
	glRotatef(180, 1.0, 0.0, 0.0);
	glTranslatef(0.0, 30.0, 0.0);
	glPushMatrix();
	while (i < length)
	{

		//std::cout << "rule[i] = " << rule[i] << endl;
		switch (rule1[i])
		{
		case 'F':
			Nextnode.point.x = Curnode.point.x + lenline * cos(Curnode.directionz * PI / 180) * cos(Curnode.directiony * PI / 180);
			Nextnode.point.y = Curnode.point.y + lenline * sin(Curnode.directionz * PI / 180);
			Nextnode.point.z = Curnode.point.z - lenline * cos(Curnode.directionz * PI / 180) * sin(Curnode.directiony * PI / 180);
			Nextnode.directiony = Curnode.directiony;
			Nextnode.directionz = Curnode.directionz;
			/*std::cout << "Nextnode.point.x= " << Nextnode.point.x << endl;
				std::cout << "Nextnode.point.y= " << Nextnode.point.y << endl;
				std::cout << "Nextnode.point.z= " << Nextnode.point.z << endl;*/
			glBegin(GL_LINES);
			glColor3f(R,G,B);
			glVertex3f(Curnode.point.x, Curnode.point.y, Curnode.point.z);
			glVertex3f(Nextnode.point.x, Nextnode.point.y, Nextnode.point.z);
			glEnd();
			Curnode = Nextnode;
			break;
		case '[':
			stack1[stackpointer1] = Curnode;
			stackpointer1++;
			break;
		case ']':
			Curnode = stack1[stackpointer1 - 1];
			stackpointer1--;
			break;
		case '+':
			Curnode.directionz = Curnode.directionz + Alpha;
			break;
		case '-':
			Curnode.directionz = Curnode.directionz - Alpha;
			break;
		case '&':
			Curnode.directiony = Curnode.directiony + Alpha;
			break;
		case '%':
			Curnode.directiony = Curnode.directiony - Alpha;
			break;
		default:
			;
		}
		i++;
	}
	glPopMatrix();
	//std::cout << "完成!" << endl;
}

有其他问题欢迎私信,一起讨论学习!

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-01-28 11:42:41  更:2022-01-28 11:43:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:55:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码