分形之万花筒

万花筒是一种光学玩具,只要往筒眼里一看,就会出现一朵美丽的“花”样。将它稍微转一下,又会出现另一种花的图案。不断地转,图案也在不断变化,所以叫“万花筒”。万花筒的图案是靠玻璃镜子反射而成的。它是由三面相交成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用于全屏切换.

时间: 2024-08-14 11:53:07

分形之万花筒的相关文章

混沌分形之迭代函数系统(IFS)

IFS是分形的重要分支.它是分形图像处理中最富生命力而且最具有广阔应用前景的领域之一.这一工作最早可以追溯到Hutchinson于1981年对自相似集的研究.美国科学家M.F.Barnsley于1985年发展了这一分形构型系统,并命名为迭代函数系统(Iterated Function System,IFS),后来又由Stephen Demko等人将其公式化,并引入到图像合成领域中.IFS将待生成的图像看做是由许多与整体相似的(自相似)或经过一定变换与整体相似的(自仿射)小块拼贴而成.算法: 1.

HIT1946 希尔伯特分形曲线(dfs)

补第二次期末考的题--发现代码细节还需要加强啊--这样一道题一直犯小错误. 题目链接: http://acm.hit.edu.cn/hoj/problem/view?id=1946 题目描述: 希尔伯特分形曲线 Submitted : 53, Accepted : 16 数学家Hilbert曾发现一种十分奇特的曲线.一般的曲线是没有面积的,但他发现的这条曲线却能充满整个空间.Hilbert曲线是由不断的迭代过程形成的.如下图所示,最原始的曲线称为H1,由H1迭代形成H2,再由H2迭代形成H3..

jQuery可拖拽3D万花筒旋转特效

jQuery可拖拽3D万花筒旋转特效 这是一个使用了CSS3立体效果的强大特效,本特效使用jQuery跟CSS3 transform来实现在用户鼠标按下拖动时,环形图片墙可以跟随鼠标进行3D旋转动画. 效果体验:http://hovertree.com/texiao/jquery/92/ 进去后可以上下左右的拖动图片. 本示例中使用到了CSS3的transform-style 属性,该规定如何在 3D 空间中呈现被嵌套的元素. 默认值: flat继承性: no版本: CSS3JavaScript

分形之概率学下的green tree

     今天做的是分形之随机概率,可以和以前做的那个抛色子的做法非常相似,抛色子是用随机点数控制图形,今天做的树叶图形只是用概率的做法去控制图形而已,做法是如出一辙的: //图形界面 package tree0618; import java.awt.Color; import java.awt.FlowLayout; import java.awt.Graphics; import java.awt.Graphics2D: import javax.swing.JFrame; public

分形--谢尔宾斯基地毯

谢尔宾斯基地毯的构造与谢尔宾斯基三角形相似,区别仅在于谢尔宾斯基地毯是以正方形而非等边三角形为基础的.将一个实心正方形划分为的9个小正方形,去掉中间的小正方形,再对余下的小正方形重复这一操作便能得到谢尔宾斯基地毯. js实现思路和我之前写的分形--谢尔宾斯基三角形的类似. js效果: 贴关键代码: 1.画点 function point(x,y){ this.x = x; this.y = y; } 2.画线 function drawLine (ctx,point1,point2) { ctx

分形应用:造山

一.分形山脉 1.山脉原型: 分形是具有自相似性的图形,即它们都具有最初的原型.如果山脉是分形,那它的原型又是什么?容易想到的是简单的三角形.一个立起的三角形,俨然山的抽象. 2.递归迭代: 那三角形又是如何能一步一步地内部迭代而逼近一座山呢?在1978年,Loren Carpenter 就解决了这个问题.他以简单而机械的方法:递归分割.中点置换,绘制了如下图形. 相关网址:http://www.cnblogs.com/szlongman/archive/2009/07/25/1530993.h

【递归】分形

[递归]分形 题目描述 分形,具有以非整数维形式充填空间的形态特征.通常被定义为“一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状”,即具有自相似的性质. 盒型分形定义如下: 度数为1的分形为: X 度数为2的分形为: X X X X X 如果用B(n-1)代表度数为n-1的盒型分形,则度数为n的盒型分形可以递归的定义为: B(n-1)       B(n-1) B(n-1) B(n-1)       B(n-1) 你的任务是输出度数为n的盒型分形. 输入

大规模网站架构的缓存机制和几何分形学

本文内容 前端 Cache 机制 Web 系统和几何分形学 缓存机制在我们的实际研发工作中,被极其广泛地应用,通过这些缓存机制来提升系统交互的效率.简单的总结来说,就是在两个环节或者系统之间,会引入一个cache/buffer做为提升整体效率的角色. 而有趣的是,这种缓存机制令人惊奇并且优美的遵循着"几何分形"的规律,也就是几何分形学中的"自相似性":从整体上看遵循某种组成规律或者特性,同时从每 一个局部看,仍然遵循某种组成的规律或者特性.我们的这些系统,从整体上看

java分形树

import java.awt.*; import java.awt.event.*; import java.util.Random; import javax.swing.*; /** * * @author http://javaflex.iteye.com/ * */ public class GraphicsTest extends JFrame implements ActionListener { public static final double PI = Math.PI /