分形之万花筒

      万花筒是一种光学玩具,只要往筒眼里一看,就会出现一朵美丽的“花”样。将它稍微转一下,又会出现另一种花的图案。不断地转,图案也在不断变化,所以叫“万花筒”。万花筒的图案是靠玻璃镜子反射而成的。它是由三面相交成60°角的镜子组成的,由于光的反射定律,放在三面镜子之间的每一件东西都会映出六个对称的图象来,构成一个六边形的图案.三面玻璃镜子组成一个三棱镜,再在一头放上一些各色玻璃碎片,这些碎片经过三面玻璃镜子的反射,就会出现对称的图案,看上去就像一朵朵盛开的花。

      记得小时候我就亲手做过一个万花筒,虽然非常简陋,因为镜子条是摔出来的,但做好后有种创造了另外一个世界的感觉.这一节展示下我写的一个万花筒的程序.程序下载地址:http://files.cnblogs.com/WhyEngine/Phantoscope.7z

      万花筒是由三面镜子构成,所以其图案是一系列的三角形网格,程序中最重要的是构造这种三角形网格.下面是生成网格顶点和纹理坐标的代码:

 1 void YcRegularTriangleGridDrawer::UpdateVB()
 2 {
 3     if (!m_pVB)
 4     {
 5         return;
 6     }
 7 
 8     Vector2 vOffset;
 9     Vertex_UV* v;
10     Yuint index;
11     Yuint odd_even;
12     m_pVB->Lock(0, 0, (void**)&v, 0);
13     {
14         for (Yuint i = 0; i <= m_uiRow; i++)
15         {
16             odd_even = (i&0x1);
17             vOffset.x = odd_even ? m_fCellSize*0.5f : 0.0f;
18             vOffset.x -= m_fCellSize*m_uiCol*0.5f;
19             vOffset.y = (m_uiRow*0.5f - i)*m_fCellSize*YD_SIN_60;
20 
21             for (Yuint j = 0; j <= m_uiCol; j++)
22             {
23                 index = i*(m_uiCol + 1) + j;
24 
25                 v[index]._x = vOffset.x + j*m_fCellSize;
26                 v[index]._y = vOffset.y;
27                 v[index]._z = 0.0f;
28 
29                 if (odd_even)
30                 {
31                     v[index]._u = m_uvTexcoords[(2+j)%3].x;
32                     v[index]._v = m_uvTexcoords[(2+j)%3].y;
33                 }
34                 else
35                 {
36                     v[index]._u = m_uvTexcoords[j%3].x;
37                     v[index]._v = m_uvTexcoords[j%3].y;
38                 }
39             }
40         }
41     }
42     m_pVB->Unlock();
43 }

顶点有了后,三角形的索引也很重要:

 1     WORD* ib;
 2     Yuint odd_even;
 3     Yuint index;
 4     m_pIB->Lock(0, 0, (void**)&ib, 0);
 5     {
 6         for (Yuint i = 0; i < m_uiRow; i++)
 7         {         
 8             odd_even = (i&0x1);   
 9             for (Yuint j = 0; j < m_uiCol; j++)
10             {
11                 index = i*m_uiCol + j;
12 
13                 if (odd_even)
14                 {
15                     ib[index*6 + 0] = (WORD)(i*(m_uiCol + 1) + j);
16                     ib[index*6 + 1] = (WORD)((i+1)*(m_uiCol + 1) + j + 1);
17                     ib[index*6 + 2] = (WORD)((i+1)*(m_uiCol + 1) + j);
18 
19                     ib[index*6 + 3] = (WORD)(i*(m_uiCol + 1) + j);
20                     ib[index*6 + 4] = (WORD)(i*(m_uiCol + 1) + j + 1);
21                     ib[index*6 + 5] = (WORD)((i+1)*(m_uiCol + 1) + j + 1);
22                 }
23                 else
24                 {
25                     ib[index*6 + 0] = (WORD)(i*(m_uiCol + 1) + j);
26                     ib[index*6 + 1] = (WORD)(i*(m_uiCol + 1) + j + 1);
27                     ib[index*6 + 2] = (WORD)((i+1)*(m_uiCol + 1) + j);
28 
29                     ib[index*6 + 3] = (WORD)((i+1)*(m_uiCol + 1) + j);
30                     ib[index*6 + 4] = (WORD)(i*(m_uiCol + 1) + j + 1);
31                     ib[index*6 + 5] = (WORD)((i+1)*(m_uiCol + 1) + j + 1);
32                 }
33             }
34         }
35     }
36     m_pIB->Unlock();

 

程序启动后,会出现满屏的三角形网格.

将任意一图像文件拖入窗体内,即可看到万花筒的样子.

在窗体右下角会显示拖入图像.上面有个三角形,鼠标拖动三角形的顶点,可以改变三角形的形状,从而改变万花筒的视图.

这是个3D程序,鼠标右键的拖动可以改变视角.


X用于恢复为默认视角.
W用于网格与万花筒的切换.
F11用于全屏切换.

 

转载于:https://www.cnblogs.com/WhyEngine/p/3980673.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/575213.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql同步数据到另一张表_mysql:Otter跨机房数据同步(单向)

重要说明&#xff1a;需要同步的表必须要有主键 主键 主键otter是一款基于Java且免费、开源基于数据库增量日志解析&#xff0c;准实时同步到本机房或异地机房的mysql/oracle数据库的解决方案。Otter目前支持了什么1. 单向同步&#xff0c; mysql/oracle互相同步2. 双向同步&am…

04day1

无穷的数列 找规律 【问题描述】 有一个无穷序列如下&#xff1a; 110100100010000100000… 请你找出这个无穷序列中指定位置上的数字。 【输入】 第一行一个正整数 N&#xff0c;表示询问次数&#xff1b;接下来的 N 行每行一个正整数 Ai&#xff0c;Ai 表示在序列中的位置。 …

【转】Eclipse+CDT+Gcc编译选项控制

原文地址&#xff1a;http://www.oschina.net/question/4873_19441 如果我们的程序调用动态链接库&#xff0c;当在cdt中运行的时候&#xff0c;可以通过run-->enviroment-->添加LD_LIBRARY_PATH 环境变量来设置查找动态链接库文件的路径。但是在运行的时候&#xff0c;程…

apt ubuntu 指定ipv4_macOS 下使用 Docker 搭建 ubuntu 环境

学习网络开发过程中不想“污染”macOS&#xff0c;考虑到之后部署网络应用主要是与linux打交道&#xff0c;所以安装了 ubuntu 虚拟机以满足短期的知识学习需求。十里安装了 ubuntu 虚拟机&#xff0c;一般就是在 mac 中 ssh 连接 ubuntu 虚拟机在终端下进行操作学习&#xff0…

float去掉小数点之后_float类型的存储方式

在c语言中float函数是单精度的。它在内存中以二进制的形式存储。分为符号位&#xff0c;阶码与尾数三部分。 符号位最为简单&#xff0c;如果你存储的是正数那么符号数就是0。如果是负数&#xff0c;则为1。下面&#xff0c;我以13.625为例说明阶码与尾数的表示方法。首先&…

idea 2020.2 如何设置classpath_开发属于自己的第一款IDEA插件!

作者&#xff1a;木杉 http://imushan.com/写Java代码的时候&#xff0c;经常会涉及到重复性的操作&#xff0c;这个时候就会想要是有这样一个插件就好了&#xff0c;如果是大家都会遇到的场景&#xff0c;IDE或许已经提供了&#xff0c;再不然也有可能有人编写了相关的插件。要…

按15分钟取数据_Python爬取猫眼电影《飞驰人生》4万多条评论并对其进行数据分析...

前言文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。作者&#xff1a; Yura不说数据说 &#xff0c;PYuraLPS&#xff1a;如有需要Python学习资料的小伙伴可以加点击下方链接自行获取http://note.youdao.c…

c++获取当前时间戳_python开发:python时间模块的使用

前言&#xff1a;今天元宵节&#xff0c;祝福大家元宵节快乐。今天在元宵节给各位朋友分享一下python时间模块。我们在开发中经常会与时间打交道&#xff0c;如&#xff1a;获取事件戳&#xff0c;时间戳的格式化等&#xff0c;这里简要记录一下python操作时间的方法。ython中常…

python 获取向上两级路径_Python学习第171课--相对路径和绝对路径

【每天几分钟&#xff0c;从零入门python编程的世界&#xff01;】这节我们补充2个概念&#xff1a;相对路径和绝对路径。●绝对路径就像一棵大树一样&#xff0c;从它的根开始&#xff0c;往上会有大的枝干&#xff0c;在大的枝干上面又会有小一点的树枝&#xff0c;小树枝上面…

百度热力图颜色说明_大数据下的龙港、鳌江人口热力图

大数据下的龙港、鳌江人口热力图--趋势显示&#xff0c;人口逐步集中于区域中心地区与城市 2020-08-25 大数据(big data)&#xff0c;是指无法在一定时间内用常规软件工具对其内容进行抓取、管理和处理的数据集合。大数据有五大特点&#xff0c;即大量(Volume)、高速(Velocity)…

python语言的单行注释以井号开头_【学习】Python语言入门

Python是一门具有强类型(即变量类型是强制要求的)、动态性、隐式类型(不需要做变量声明)、大小写敏感(var和VAR代表了不同的变量)以及面向对象(一切皆为对象)等特点的编程语言。 语法 Python中没有强制的语句终止字符&#xff0c;且代码块是通过缩进来指示的。缩进表示一个代码…

python 参数个数 同名函数_Python——函数的参数

函数的参数定义函数的时候&#xff0c;我们把参数的名字和位置确定下来&#xff0c;函数的接口定义就完成了。对于函数的调用者来说&#xff0c;只需要知道如何传递正确的参数&#xff0c;以及函数将返回什么样的值就够了&#xff0c;函数内部的复杂逻辑被封装起来&#xff0c;…

webview的

问题描述我给WEBVIEW加了等待的圆圈,怎么不起作用?布局文件:<?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:orientation"vertical"android:lay…

java中final关键字、权限修饰符、内部类(成员内部类、局部内部类、匿名内部类)

final关键字&#xff1a; final表示最终的不可变的&#xff0c;在java中可以用来修饰类或方法、局部变量、成员变量。 // 1.final关键字修饰类需要放在class关键字前面&#xff0c;表示不可变的类&#xff0c;需要注意&#xff0c;这里表示当前类不能有子类&#xff0c;但是有…

python安装后无法使用_Python在终端通过pip安装好包以后在Pycharm中依然无法使用的问题(三种解决方案)...

在终端通过pip装好包以后&#xff0c;在pycharm中导入包时&#xff0c;依然会报错。新手不知道具体原因是什么&#xff0c;我把我的解决过程发出来&#xff0c;主要原因就是pip把包安装到了“解释器1”&#xff0c;但我们项目使用的是“解释器2”。我们新手怕字多&#xff0c;所…

03-sizeof的用法

1、作用 sizeof运算符是C语言特有的运算符。 用来计算一个变量或者一个常量、一种数据类型在内存中所占的字节数。 2、基本形式 (1) sizeof (变量或常量) (2) sizeof 变量或常量 (3) sizeof(数据类型) (4) 不能是sizeof 数据类型, 即计算数据类型的字节数必须用小括号括起来 实…

【Python3】POP3协议收邮件

初学Python3&#xff0c;做一个email的例子&#xff0c;虽然知道做的很渣渣&#xff0c;还是分享一下吧POP3协议POP3全称Post Official Protocol3&#xff0c;即邮局协议的第三个版本&#xff0c;它规定了怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议&…

发红包案例(RedPacketFrame简介)

发红包案例&#xff1a; 案例目录结构如下&#xff08;red包为第三方包&#xff0c;需要的话可以到网上自行下载或私信我邮箱即可&#xff09;&#xff1a; // 1.这里将借用发红包的框架&#xff1a;RedPacketFrame&#xff08;图形界面化&#xff09;&#xff0c;OpenMode处…

easy connect 获取服务端配置信息失败_如何统计 Mysql 服务器状态信息?

最近在看《高性能的 Mysql》一书&#xff0c;下面是关于如何学习统计 Mysql 服务器状态的学习总结&#xff0c;主要是学习使用 SHOW STATUS&#xff0c;SHOW ENGINE INNODB STATUS&#xff0c;SHOW PROCESSLIST&#xff0c;SHOW PROFILE 四个命令。命令一&#xff1a;SHOW STAT…