|
楼主 |
发表于 2013-11-30 14:48
|
显示全部楼层
本帖最后由 lee1892 于 2013-11-30 14:49 编辑
二、线的一次折弯
此贴附件:
奇妙的分形 之 线的一次折弯_By Lee1892.rar
(69.96 KB, 下载次数: 573)
前面提到过一个莱维C曲线,实际上它应该是由一条线不断的折弯产生的,每一次都将所有的线段向外侧折弯,对一个线段而言,折弯后的两线段夹角为90度,长度为原来的sqrt(2)*1/2倍。如下图动画所示:
如果,改动一下折弯的方向,相邻两次折弯的方向相反,那么就会得到被称为龙曲线(Dragon Curve)的形状,如下图:
附件中的代码更改自前述帖子:彩色的灌木丛,其实现方式如下:
1、按之前源向量的概念,首先将源向量的长度改为原来长度的 sqrt(2)*1/2 倍,然后旋转一定的角度,称为 首选转角度
2、以更新后的源向量为新的源向量,以此新源向量的终点作为新向量的起点,新向量的长度同新源向量,新向量的角度由初始源向量旋转而得,称为 次旋转角度
3、所有向量首尾相连,顺序连接所有向量的起点、终点即能获得图案
此贴附件中,为动画演示计,仍使用数组保存所有向量,由于新向量总是由数组末端添加,所以采用链表的方式链接向量。
附件能够实现的功能:
1、可生成多个曲线,以形成组合的图案
2、可保存生成的图案参数
3、不保存显示图案的数据
附件中有数个已经预设的参数,产生图案如下,相信你会有更多的奇妙图案的~
核心代码:- Private Type VECTOR
- X As Double
- Y As Double
- Angle As Double
- Length As Double
- Next As Long
- End Type
- Private Sub FoldLine(ByVal nRoot&, ByVal iLayer%, ByVal iFlip%)
- Dim nChild&, nNext&, dAngle#, dLength#, dX#, dY#
- nChild = nRoot + 2 ^ (iLayer - 1)
- With arrVertex(nRoot)
- nNext = .Next: .Next = nChild
- dLength = .Length
- .Length = dLength * Sqr(2) / 2
- dAngle = .Angle
- .Angle = .Angle - dblLeftRotation * IIf(bolLeftFlipped, iFlip, 1)
- dX = .X + .Length * Cos(.Angle)
- dY = .Y + .Length * Sin(.Angle)
- End With
- With arrVertex(nChild)
- .X = dX: .Y = dY
- .Length = dLength * Sqr(2) / 2
- .Angle = dAngle + dblRightRotation * IIf(bolRightFlipped, iFlip, 1)
- .Next = nNext
- End With
- End Sub
- Private Sub Output(ByVal iIndex%, Optional bWait As Boolean = False)
- Dim i&, n&
- i = 1
- Do
- With arrVertex(i)
- arrOutput(n, 0) = .X: arrOutput(n, 1) = .Y: i = .Next
- End With
- n = n + 1
- Loop Until i = IIf(bolEndPoint, -1, 0)
- n = intPatternCount
- If bolShadow Then n = n * 2 + 1
- n = n - iIndex
- shtData.Range("A2").Offset(0, n * 2).Resize(UBound(arrOutput) + 1, 2) = arrOutput
- If bWait Then WaitMoment Moment
- End Sub
复制代码 |
|