迭代函数系统( ifs )_第1页
迭代函数系统( ifs )_第2页
迭代函数系统( ifs )_第3页
迭代函数系统( ifs )_第4页
迭代函数系统( ifs )_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

下载源代码在C#46.1KB。下载源代码并在C#-101.7演示下载源代码在50.9下载源代码,并在122.8中演示。介绍我试图理解分形的定义,我得到一个不可以能的句子,因为一个分形是一个单句。complexity的原因可以用我本文给出的标题来说明。i句的用法,其实是"理论与实践有区别。"的,但这句话实际上是一个无意义的句子,因为实际句子实际上是一个理论性的句子,你已经做出了这一推论。thusmathematicalmathematical在数学上是没有意义的,但必须说,当动能的方程仅适用于小速度时,通常是有限的发散面积,如一般相对论的理论theory

将开始影响结果的速度大约为10%的速度,但这与原始语言不同,或者者不精确的使用。writing,他们通常会给你一些漂亮的图片,以及如何生成他们的代码,或者说,为什么我们对分形感兴趣,或者我们对分形感兴趣。当然,数学家和程序员有比看漂亮的图片更好的事情"?Fibonacci和他的兔子斐Fibonacci的Leonardo也许是早期中世纪最著名的数学家,并且最著名的是斐波那契系列,并带阿拉伯数字到欧洲。behind是相当复杂,他建议在罗马数字上使用阿拉伯数字的建议在第一次被接受。年,Liber出版了Liber,但十进制数字系统在Europe之前在欧洲广泛使用,但这主要是使用数字below1.这意味着商家和其他人可以赚一些钱,你也可以。小数系统延迟使用的另一个原因是需要纸张,因为数字系统作为罗马的节省(至少对于大多数数字)。在欧洲14th纪之前,纸张没有被广泛使用,而是从北京8th世纪开始使用的。Fibonacci带着他的数字是西方阿拉伯数字,或者gubar数字(gubar是一个阿拉伯语单词,意思是灰尘,因为它们最初是用覆盖)。因为数字是用列写的,所以它们不需要零,因此它们不需要零。当他们开始写纸时,他们把数字放在数字上,以表示数字应该在这里。对于记录,我们当前的数字系统可以以说是基于三个主要的思想:巴比伦数学中的位置思想来自印度的实际数字空空间,零,但实际源和源的数目仍然不是完全清楚的。斐波那契的帽子中有更多的兔子,即他的其他著名贡献,斐波那契数列。他想解决的问题是,在理想条件下,n个月后你会有多少兔子?他假设:它们会产生一个雄性和一个雌性后代他们每月可以复制一次。一旦超过一个月的时间他们就可以开始繁殖了他们不会死第一个月有两个兔子在钢笔里,但是他们还不能再繁殖。第二个月还有一对,但现在他们可以开始繁殖了。第三个月,原来的对将有两个offsprings,所以现在有两个对。第四个月,原来的对子还有一对兔子,上个月有一对年龄,总有三对。所以它继续,继续。Fibonacci数列是由下面的数字序列定义的:1,1,2,3,5,8,13,21,。你可能想知道这与分形有什么关系。这是一个基本系统,它是数学和编程中可以以计算多个不同系列的n值的基本系统。以计算整数的阶乘为例。这可以以递归方式执行(函数调用自身),如下所示:PrivateFunctionFactorial(ByValvAsInteger)AsIntegerIfv>1ThenReturnv*Factorial(v-1)ElseReturn1EndIfEndFunction斐Fibonacci系列也可以用递归方式编程,通过让序列中的每个数字都由F(n),引爆,因此F(1)=1F(3)=2.F(n)=F(n-1)+F(n-2)可以使用递归关系编程,这意味着函数将调用自身,如下所示:PrivateFunctionFibonacci(ByValnAsInteger)AsIntegerIfn>1ThenReturnFibonacci(n-1)+Fibonacci(n-2)ElseReturn1EndIfEndFunction有时递归会导致嵌套函数,而这是由。递归函数和递归系统有不同之处。然而,这些数字也可以以与一系列平方相关的指数spiral生长与相应的傅里叶序列相关。这个spiral叫做黄金spiral,它是由CristobalVila在视频中显示的。sadly的Nautilusshell不是黄金spiral,而是一个的logarithmic。对于网络上的金比,有各种不同的误解,所以在许多老的教材中,人们都不清楚。pointed教授eloquentlyeloquentlyProfessorProfessor。Kahn学院还有一个有趣的视频,它的(正确)连接与黄金spiral和松树锥之间的连接。(你可以能发现一些实例中没有显示正确的斐波那契数列,但是这是因为基因的变异不是最优的。)。也可以以看到,在向无穷大(调用黄金比率。)的情况下,只有一个关系才能产生圆锥和黄金螺旋;$phi=lim_{ntoinfty}断裂{F(n)}{F(n-1)}=断裂{5^{frac{1}{2}}+1}[2}$这个数字非常有趣,主要是因为它是"大多数irrasional"的数字。如果创建任何数字的连续分数,转换速度是decidd的高度,数字的高度越快收敛的速度越快。在一般方程below中,这意味着数值越高,它会收敛得越快,比较高的deciumals越快。$a_0+cfrac{1}{a_1+cfrac{1}{a_2+cfrac{1}{a_3+cdots}}}$所以这个系列最坏的结果是当所有的都等于1的时候,这就是在黄金比下发生的。如果希望在磁盘上的唯一placemnt,读取,均匀分布的点数,这使得数字可以以使用。AlexandreDevertblogblogblogblogblogblogblogblogmostmostmostmostmostmostmostnumbers(middle),picturepicturepicturepicturepicturepicturepicturepicturepicture中间的中间部分使用黄金比例,这个点的扩展是由HelmutVogelshown,被称为Vogelmethod。也可以以在大量的计算方法中使用,如从全方位LAMP的声波追踪或者光线追踪。因为我不想直接使用vogel的方法,因为我想改变向日葵分形中圆形的大小和大小,让它看起来更像。但是代码仍然令人惊讶的简单:DimAngle,c,RAsDoublec=(Math.Sqrt(5)+1)/2SunFlowerCanvas.Children.Clear()Dimx,yAsDoubleDimnumberofseedsAsInteger=3000SunFlowerCanvas.Background=Brushes.SaddleBrownForiAsInteger=0TonumberofseedsR=i^c/(numberofseeds/2)Angle=2*Math.PI*c*ix=R*Math.Sin(Angle)+300y=R*Math.Cos(Angle)+300DrawEllipse(NewPoint(x,y),i/(numberofseeds/10))DoEvents(Me.Dispatcher)Next代码生成如下所示的动画grothPattern:然而,这两个视频中的主题,或者者with的代码,都是我第一次遇到斐波特系列。当你在我的数学课上学习pascal三角的时候,我开始涂鸦,发现,如果我在45度向右summarized列,我得到的是斐波那契数列:Fibonacci帕斯卡

三角形0100000000001110000000001121000000002133100000003146410000005151010510000081615201561000013172135352171000211828567056288100341936841261268436910551104512021025221012045101虽然最初的发现者可能在时间中丢失了,但实际上已经发现了很多世纪。背景分形有severals定义,其中其中之一是"一个粗糙或者碎片几何形状,可以分细分在部分中,每一个都是(至少大约有几个)。)的缩小/大小复制整个"。定义它们的一种更正式的方法是使用Hausdorff维度。如果人们认为它们以几个不同几何形状的大小为单位,物体类型尺寸(d)方程式复制次数(2^d=N)线条一维2*x2^1=2正方形二维2*x+2*y2^2=4Qube三维2*x+2*y+2*z2^3=8这意味着维度的数量与副本的公式数=2^d的副本数相关。这个公式叫做Hausdorff,我们可以使用定义,在分形中生成每个迭代的拷贝数,从而计算出分形维数。to曲线没有按照Hilbert图2的shockedGuiseppePeanoPeanoPeanoPeano,他震惊于1890年的数学社区,他产生了类似于Hilbert曲线。每个迭代都会生成三个副本,并且在每个direction中它的长度将加倍,从而获得维数:3=2^d,提供d=ln(3)/ln(2)=1.58.。Koch雪花有点不同,当我们开始三条直线时,我们会得到一条原始直线,我们将得到一条原始直线的4副本,所以我们可以建立一个关系:N=4另外,每个线段都是原始线的1/3,因这里缩放因子将为3,而不是2:d=ln(4)/ln(3)=1.26.。然而,对于所有不同类型的分形,解析维数并不总是可行的,而是在上给出了维数计算的更多实例。通过计算和论证above,现在可以将分形定义为如下:fractal是Hausdorff维严格超过拓扑定义的集合。"这个定义仍然很难掌握,但是如果你记住我引入不精确的定义,你会发现这非常精确。Whitehead和Russel在优先原则中总结出了很好的总结。这项工作的抽象简洁性使语言语言能够更容易地表达复杂的思想。在最佳情况下,介词"a大"表示语言,对复杂的事实给出简洁的表达;而对的分析则指向不能容忍的prolixity。"这个声明可以很简单地解释为John在他的PrimePrime中所做的::他们没有开玩笑。原则Mathematica需要345页才能定义"1"。这通常意味着对单词的数学定义通常根植于复杂的定理,因此,语言的细节可能是相当浪费的。在分形的定义中,缺失的信息是一个拓扑维度的方法。这里有些棘手,因为它是相当复杂的派生,它包括集合理论。然而拓扑维数也叫做覆盖维数或者更正式的Lebesgue覆盖维数,你可以在这里看到定义的详细说明,但要注意它不是直接向前的。Mandelbrot和Julia集没有关于分形的故事或者摘要文章,它的实是一个分形的(源自希腊文词"fractus,这意味着断裂或者断裂。你可以听到Mandelbrot在这个视频中对分形的用法和演变的更多解释,从TED说的。一般来说,webspherecloudburst和Julia集是从一个多项式系统的收敛性的收敛性来推广的:Z(n+1)=锌=1,2,3,。这两个集之间的差异是通过操纵Z值生成的,而Julia集则用于生成图片。你可以在上逐步处理这一步骤,以准确地了解在程序中如何计算它。important(使用复数计算时应用的规则)和Julia集使用复数构造非常重要,意味着可以将实数部分与x轴联系起来,这意味着使用四元数规则(而非imaginary)将实数部分与x轴联系起来。通过一个below集合创建和迭代的基本代码是,它的中一个assumse当前位于(振幅,振幅)中,并且DimZAsNewComplex(x0,y0)DimCAsNewComplex(x0,y0)DimMaxIterationsAsInteger=200DimCurrentIterationAsInteger=0DimConvergenceConditionAsDouble=2.0DimConvergeneTestAsDouble=0WhileCurrentIteration<MaxIterationsAndAlsoConvergeneTest<ConvergenceConditionZ=Complex.Pow(Z,2)+CConvergeneTest=Complex.Abs(Z)CurrentIteration+=1EndWhile对于Julia集,方程稍微不同:DimZAsNewComplex(x0,y0)DimCAsNewComplexC=YourComplexVariableDimMaxIterationsAsInteger=200DimCurrentIterationAsInteger=0DimConvergenceConditionAsDouble=2.0DimConvergeneTestAsDouble=0WhileCurrentIteration<MaxIterationsAndAlsoConvergeneTest<ConvergenceConditionZ=Complex.Pow(Z,2)+CConvergeneTest=Complex.Abs(Z)CurrentIteration+=1EndWhile相应图片below显示了程序生成的Julia集之一:前两个Fragment中给出的代码不是非常快,因为Complex.Abs()调用方root,这是一个泰勒级数,占用了大量时间。最好将ConvergenceTest设置为4,然后只做||Z||^2=x^2+(i)^2*y^2=x^2-y^2相反,final图片中的颜色决定了ConvergenceTest离开ConvergenceCondition需要多少次迭代。这两个例子都清楚地表明,在外部使用结构的时候,所有的区域都不会离开它。这些集的颜色是预先生成的,每个迭代的每个数目都是不同的颜色。这个颜色是从一个StackOverflow问题的答案得到的,然而你可以用任何你想要的着色方案来替换这个。牛顿分形另外,牛顿分形采用了一个函数,它利用函数的导数来生成图形,并利用函数的导数来生成一个图形,从而得到了C。我还决定包括这个功能,但是这也需要一些额外的编码。首先需要定义函数,然后我决定从函数Z<sup>5</sup>-1开始:PrivateFunctionNewtonFractalFuntion(ByValCCAsComplex)AsComplexReturnComplex.Pow(CC,5)-1EndFunction第二个问题是更困难,得到函数的导数。对于良好行为的函数,给定的代码可以正常工作,但是你也可以用精确的方法替换它,在这个例子中,它将是(该方法可以在较高级函数上失效,但是可以用riemann方程。)。PrivateFunctionDerivateNewtonFractalFuntion(ByValCCAsComplex)AsComplexDimDeltaAsNewComplex(10^-10,10^-10)Return(NewtonFractalFuntion(CC+Delta)-NewtonFractalFuntion(CC))/(Delta)EndFunctionFor函数积分,我们有兴趣用Cauchy定理的积分积分,这是一个更普遍的方法,我们对常微分方程的积分积分有兴趣,这在本例中是我们感兴趣的柯西公式。这是非常困难的,我还没有找到任何数值方法,使用这个分形生成。他们通常只是用解析方法提供导数。然后是实际的主要功能:Dima,b,kmaxAsIntegera=400b=400kmax=50Dimimage(a,b)AsIntegerDimx0,y0,dx,dyAsDoubledx=(xmax-xmin)/(a-1)dy=(ymax-ymin)/(b-1)DimZ,Z0AsNewComplexDimkAsInteger=0FornxAsInteger=0Toa-1FornyAsInteger=0Tob-1k=0'Findthecurrentlocationx0=xmin+nx*dxy0=ymin+ny*dyZ=NewComplex(x0,y0)While(k<=kmax)Z0=Z-(NewtonFractalFuntion(Z)/DerivateNewtonFractalFuntion(Z))k+=1IfComplex.Abs(Z0-Z)<10^-6Thenk=(Z0.Phase)+8ExitWhileEndIfZ=Z0EndWhileimage(ny,nx)=kNextNext图2中的一个基本方法是使用复数号(第2个)来绘制这个解,另外一个方法可以通过注释使用Z0.Phase(你可以在这里看到这两个)的行来查看。阶段用于颜色的rootis技术将找到,另一个将使用的术语数目在可以接受的解决方案。此外,还可以通过使用limits限制来着色plot,以生成更动态的图片。这是由程序生成的牛顿分形的例子:还应该提到,牛顿分形的推广可以用来生成所谓的fractalsfractals,当你拥有牛顿分形代码时,这些是非常简单的代码。只需要两个修改,需要添加一个常数C和一个叫做R的松弛常数,然后选择"右边"值。这里可以看到一些漂亮的例子,这里是和。燃烧船舶分形同时还包括了燃烧船分形子空间,这只是由Mandelbrot集的微小变化,即在与前一个值值匹配之前,绝对值被。燃烧船的放大部分如下所示:markus分形分形markus分形是一个基于逻辑增长Pattern的分形,它是基于的。这说明随着时间的推移,growth(<spanclass="">中断{dN}{dt}</span>)的增长率可以写成以下公式:$frac{dN}{dt}=中断{rN(K-N)}{K}$在公式N是任何给定时间的人数,K是支持capasityi.a.的多少人,R是最大生长率(因为这个数字最初叫做Malthusian参数,这实际上是简化的,但是我们忽略它,它只是人口增长率。)和t。我们可以用替换n/k的n/k来计算方程,并将公式改写为:$frac{dx}{dt}=Rx(1-x)$通过数值积分,可以以解决这个方程,也可以以通过分析集成来解决这个问题。可以以通过定义一个新的变量x来简化物理生长模型,与环境支持(保持活力)的总体群相比。用x=n/k,就得到了一个新的微分方程。现在我们要看人口分数随时间变化的速率。一旦x=n/k=1,环境将无法支持填充中的任何其他成员:迭代函数系统(IFS)迭代函数系统(IFSfor)是一系列用于生成分形的渲染变换。用IFS绘制最简单的可能是Sierpinski三角形,可以通过选择组成三角形的树点来构造,所有的天使都是60度的。它的中一个点被选中,而且你将随机挑选到三角形中它的他两点之一的一个点。你现在有一个新的点inside,你选择一个树外三角点点,并在半距离上画一个新点。如果你这么做足够多次,你最终会生成Sierpinski三角形。IFS最常见的例子是使用4个不同的映射函数构造的Barnsley蕨,以及一个特定变换使用的百分比可能性。fernself,transformBach,MIT教授说,这就是fernself在random的第二阶段,用另一个变换随机地再现另一个位置。你也会注意到,Sierpinski三角形同样在同一个课堂上被解释。若要查看映射函数,可以在实现映射函数时对它的进行颜色着色。源代码中有多种不同的蕨类版本,它们都来自于的网站。它们并不完全相同,因为映射技术在源代码中稍有不同。顺便说一下,蕨实际上是自然界中最早的植物结构之一。l系统和分形为了提高植物的生长,尤其是对植物生长过程的模拟,生物学家AristidLindenmayer为这些结构的生长建立了一个新方法。为了看看他是如何创建这个relative简单系统的,他在下面的行中想到了。许多生物体的生长过程中,尤其是植物,经常重复出现的某些细胞结构的重复出现,很容易引起注意。compound叶(或者小叶)advancedadvancedadvancedadvancedadvancedlobeslobeslobeslobeslobeslobeslobeslobeslobeslobeslobeslobeslobeslobeslobeslobeslobeslobes。初步用他的理论研究了简单多细胞生物的发展,然后用于研究高植物和植物官。实际的过程可以以沿这些行进行建立;假设你有一个预定的of(或者DNA中的起始基因)。这里外,它还将有一些规则,它将如何从公理(起始条件)扩展到一个离散期间的n(涉及到其他DNAPattern的实现)。these世纪初已经发现这些基本原则和思想,但是在Noamchomsky开始使用类似系统来描述语言语法之前,还没有广泛了解或者使用过。Lindenmayer系统(short系统)与替代算法的语言不同,而chomsky算法是顺序的Lindenmayer系统。这种差异使得l系统对分形的生长模式非常有效,而chomsky算法仅用于语言语法。所需要的第一件事是生成生长Pattern,通过公理和替换规则。例如,将公理设置为F--F--F,这将生成一个三角形,如果"-"符号代表60度。为了生成一个,雪花,在每个迭代中,代替F+F--F+F(作为F=F+F--F+F编写),并且在上述情况下变得更复杂。可以按以下方式进行编码:PrivateSubGrow()DimCurrent,[Next]AsNewStringBuilderCurrent.Append(Axiom)[Next].Append(Axiom)DimFoundAsBoolean=FalseDimCurrentGenerationAsInteger=0WhileCurrentGeneration<GenerationsCurrent.Clear()Current.Append([Next])[Next].Clear()ForiAsInteger=0ToCurrent.Length-1Found=FalseForjAsInteger=0ToRules.Count-1IfCurrent(i)=Rules(j).RuleThen[Next].Append(Rules(j).Pattern)Found=TrueEndIfNextIfNotFoundThen[Next].Append(Current(i))EndIfNextCurrentGeneration+=1EndWhileGrowString=([Next].ToString)EndSub生成GrowthString之后,剩下的就是对生成的分形进行实际绘制。2D个系统有6个不同的操作,这些操作通常由海龟在不同的方向移动,同时移动。基本绘图命令包括:"F"-画一条线"f"-移动乌龟而不用绘图"+"-向当前角度添加一个predetermind角度"--将预定角度移到当前角度"["-将当前位置保存到堆栈]"-移除堆栈中的当前顶点并将它的设置为乌龟的当前位置所有它的他符号被海龟(乌龟保持它的当前状态)忽略,这很容易代码,假设你创建了迭代树和替代的公理。PublicFunctionGetDrawingLines()AsList(OfLine)'MakethetreefromaxiomsandrulesGrow()'ReplacetemporaryaxiomswithnewonesReplaceExchangeAxiomsInGrowString()'SetstartpositionfortheturtleDimCurrentTurtleAsNewLindemayerCurrentPointCurrentTurtle.Posision=NewPoint(200,200)CurrentTurtle.CurrentAngle=-90CurrentTurtle.LineLength=LineLength'CreateatemporarynextpointDimNextTurtleAsNewLindemayerCurrentPoint'CreateastacktoallowbranchingDimPointListAsNewStack(OfLindemayerCurrentPoint)'ThedrawnlinesDimresultAsNewList(OfLine)ForiAsInteger=0ToGrowString.Length-1IfGrowString(i)="F"cThen'CalculatethenextpointNextTurtle=GetNextPoint(CurrentTurtle)'Drawthecurveresult.Add(GetLine(CurrentTurtle,NextTurtle))'MovetheturtleCurrentTurtle=NextTurtle.CloneElseIfGrowString(i)="f"cThen'MovetheturtlewithoutdrawingalineCurrentTurtle=GetNextPoint(CurrentTurtle)ElseIfGrowString(i)="+"cThenCurrentTurtle.CurrentAngle+=AngleElseIfGrowString(i)="-"cThenCurrentTurtle.CurrentAngle-=AngleElseIfGrowString(i)="["cThenPointList.Push(CurrentTurtle.Clone)ElseIfGrowString(i)="]"cThenCurrentTurtle=PointList.PopEndIfNextReturn(result)EndFunction这个算法有很多实现,但是就像我前面提到过的,它们是过于复杂的,可能会混淆那些想实现和理解它们的人。这些简单的规则可以生成相当复杂的结构,甚至相当复杂的树。另一种方法是通过使用递归算法来生成树分形,因为可以以使用类似于以下命令的命令:PrivatesubDrawBranch(Angle,MaxIterations)......DrawBranch(Angle+IncrementAngle,MaxIterations-1)DrawBranch(Angle-IncrementAngle,MaxIterations-1)EndSub他的文章DotNet真正的TreeTree,这正是他所采取的方法,他可以让你many不同的设置来产生不同的树。我还没有提到一件事,这就是自然树在分枝时如何降低它的横截面的方式。:达达达公布的公式是一个自然真实,是d<sub>1</sub>之前的crossection区域,d<sub>2</sub>和d<sub>3</sub>是两个新分支的区域。d<sub>1</sub>=Math.Sqrt(d<sub>2</sub><sup>2</sup>+d<sub>3</sub><sup>2</sup>)为了使sap能够到达树的顶端,我们按顺序提出了这种关系。如果两个分支,d<sub>2</sub>和d<sub>3</sub>相等,这个方程表明每个分支都是d1/Math.Sqrt(2)的。由于l系统可以以生成自然生物和植物的视频范围,因这里人们开始了解自然选择。Richard的一个简单方案是由RichardDawkins提出建议,并给出这种算法的例子,称为AI:Dawkinsbiomorphs/和其他进化的生物,由SachaBarber。我还应该提到,你也可以以在三个维度中实现l系统,这将使字符串生成器不变。例如在3D中的Hilbert曲线是可以看到的,这里是。我没有实现它需要大量的编码,并且不会显示对l系统进一步深入的深入了解。不过有本书由Lindenmayeret编写。这可以免费下载,这里有很多3D结构出现在这里。为了展示differentiate不同的形状,我将公理设置为:-F-F-F-F-F-F以及每次迭代的交换规则:F=F+F-F-F+F给定4次迭代和角度等于60度,我们得到一个Koch像雪花:将角度设置为90度,而给出这里Pattern:同样,将角度设置为120度,我们得到一个Sierpinski三角形的版本:这三种模式都是截然不同的,但唯一有变化的是角度。它们做了重叠,意味着多次绘制相同的线条,但它显示了创建不同的形状需要多少。Kronecker积与分形To我们需要做的是,生成一个Kronecker分形fractal这两个矩阵中定义的Kronecker乘积的算法,这可以通过下面的方法来完成:'''<summary>'''From"MathematicltoolsincomutergraphicswithC#implementations",byHardy&Steeb,WorldScientific'''</summary>'''<paramname="M"/>Matrixx'''<paramname="N"/>MAtrixB'''<returns/>'''<remarks/>PrivateFunctionKronecker(ByValM(,)AsDouble,ByValN(,)AsDouble)AsDouble(,)DimR(M.GetLength(0)*N.GetLength(0),M.GetLength(1)*N.GetLength(1))AsDoubleForiAsInteger=0ToM.GetLength(0)-1ForjAsInteger=0ToM.GetLength(1)-1ForkAsInteger=0ToN.GetLength(0)-1ForlAsInteger=0ToN.GetLength(1)-1R(i*N.GetLength(0)+k,j*N.GetLength(1)+l)=M(i,j)*N(k,l)NextNextNextNextReturnREndFunction现在你需要做的就是用0到1的值填充两个矩阵,然后将它们相乘。绘制图像make0black和1,这就是它真正需要的。此外,还有其他的可能实现图形和允许从0到1以外的数字,但是你需要相应地更改代码。扩散有限聚合他说,是最容易理解的分形之一,然后生成它,然后用下面的类比,drunken寻找旅馆,然后在那里找到一个。他开始形成任意的点,随机移动到他的九个邻居之一,直到达到一个邻居的邻居。下面给出了为醉酒小人生成起始点的代码:'''<summary>'''Selectastartingpointononeofthe4edges,andselectonepixel'''</summary>'''<paramname="width"/>'''<paramname="height"/>'''<returns>'''<remarks>PrivateFunctionGenerateStartPoint(ByValwidthAsInteger,ByValheightAsInteger)AsPointDimst,x,yAsIntegerst=Rand.Next(1,5)SelectCasestCase1x=0y=Rand.Next(0,height-1)Case2x=Rand.Next(0,width-1)y=0Case3x=width-1y=Rand.Next(0,height-1)Case4x=Rand.Next(0,width-1)y=height-1EndSelectReturnNewPoint(x,y)EndFunction</remarks>要移动,需要选择一个任意点,位于当前点的旁边。我已经选择了模拟与itselfs重叠的rectangle,像一个像这样的球体。如果想转到右边,当前站点位于最右边,它将移到左侧等等的开头,如下所示:'''<summary>'''Thiswillassumethattherectangleisconnectedinasphere,whenitreachesmaximumitwillstarton0againforbothdirections'''</summary>'''<paramname="CurrentPoint"/>Thecurrentpointlocation'''<paramname="height"/>Theheightofthesuroundingrectangle'''<paramname="width"/>Theheightofthesuroundingrectangle'''<returns>Arandommovetooneofitsneighborpoints</returns>'''<remarks>PrivateFunctionMoveToNeighbor(ByValCurrentPointAsPoint,ByValheightAsInteger,ByValwidthAsInteger)AsPointDimx,y,a,bAsIntegerx=CurrentPoint.Xy=CurrentPoint.Ya=widthb=heightDimseedAsInteger=Rand.Next(1,9)'Ifoneassumesthestartingpointx;yis10;10youllseethe'thatitwillmovetothefollowingneighboringpointSelectCaseseedCase1'Movetopointx;y=9;10Ifx=0Thenx=a-1Elsex-=1EndIfCase2'Movetopointx;y=9;9Ifx=0Thenx=a-1Elsex-=1EndIfIfy=0Theny=b-1Elsey-=1EndIfCase3'Movetopointx;y=10,9Ify=0Theny=b-1Elsey-=1EndIfCase4'Movetopointx;y=11;10Ifx=a-1Thenx=0Elsex+=1EndIfCase5'Movetopointx;y=11;11Ifx=a-1Thenx=0Elsex+=1EndIfIfy=b-1Theny=0Elsey+=1EndIfCase6'Movetopointx;y=10;11Ify=b-1Theny=0Elsey+=1EndIfCase7'Movetopointx;y=11;9Ifx=a-1Thenx=0Elsex+=1EndIfIfy=0Theny=b-1Elsey-=1EndIfCase8'Movetopointx;y=9;11Ifx=0Thenx=a-1Elsex-=1EndIfIfy=b-1Theny=0Elsey+=1EndIfEndSelectReturnNewPoint(x,y)EndFunction</remarks>这个算法可以以多种方式改变,但是我在程序中的例子是最简单的形式,因为这个示例是可行的,因此可以使用很多增强程序。这也是一个可以模拟自然界中许多现象的进程。着色sheme本文使用了两种不同的颜色模式,一种生成不同于周围颜色的独特颜色。我现在还添加了一个光滑的色彩方案,用于设置颜色的渐变点,它只是从一个颜色到下一个。这是通过使用以下代码实现的:PublicSubGetGradients(ByValstartsAsColor,ByValendsAsColor,ByValstepsAsInteger)DimstepAAsInteger=Math.Truncate((CInt(ends.A)-CInt(starts.A))/(CInt(steps)-1))DimstepRAsInteger=Math.Truncate((CInt(ends.R)-CInt(starts.R))/(CInt(steps)-1))DimstepGAsInteger=Math.Truncate((CInt(ends.G)-CInt(starts.G))/(CInt(steps)-1))DimstepBAsInteger=Math.Truncate((CInt(ends.B)-CInt(starts.B))/(CInt(steps)-1))ForiAsInteger=0Tosteps-1ColorList.Add(Color.FromArgb(CInt(starts.A)+CInt(stepA)*CInt(i),CInt(starts.R)+CInt(stepR)*CInt(i),CInt(starts.G)+CInt(stepG)*CInt(i),CInt(starts.B)+CInt(stepB)*CInt(i)))NextEndSub然而,由于颜色与List集中的给定迭代不匹配,因此存在一些缺点,因此你必须注意中的颜色,以便在不同分形中的所有迭代中有足够的颜色。颜色可以通过简单改变渐变停止点中的颜色来交换:SubNew()GradientStop.Add(Brushes.Red)GradientStop.Add(Brushes.Yellow)GradientStop.Add(Brushes.Green)GradientStop.Add(Brushes.Magenta)GradientStop.Add(Brushes.Blue)GradientStop.Add(Brushes.Purple)GradientStop.Add(Brushes.Gold)ForiAsInteger=0ToGradientStop.Count-2GetGradients(GradientStop(i).Color,GradientStop(i+1).Color,35)NextEndSub历史记录你可以能已经经看到,分形是如这里有趣的原因,它可以以用来模拟植物。生长模式。初始版本:162013年09月。引用我从这里最重要的引用开始:美国麻省理工学院(MIT)的课程系列。"计算机图形学中的数学工具"用C#实现,由大学科学家,&willi博士Steeb编写从"基于C#实现的计算机图形数学工具"下载的源代码可以从这里下载到这里。ManfredSchroederFractals分形。混沌。幂定律"。这是一本非常可以读的书,有许多不同类型的分形的信息。其他有用的联机资源包括:/wiki/Hausdorff_dimension/wiki/List_of_fractals_by_Hausdorff_dimension/fe/HTML_version/link/FE4W/c4.htmHausdorff维数,它的特性以及它在Schleicher(PDF文档)中的惊奇HYPERLINK"http://langexplr.blogspot.no/2007/08/explo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论