这几天在因为在和别人合作写一个程序,就在想比如我要写一个科赫曲线,那么我写来给别人用的话,怎样是用着最方便的,即使是别人没有去详细看你的代码,拿到手就像写一个界面那样,直接 new 一个对象,然后调用函数就 ok 啦!然后我就想到啦封装,就是我直接写一个科赫曲线的类,有不同的构造器方法,也就是提供给别人不同的选择,比如想自定义偏转角,步长,起始点,递归次数 等等。
然后,这个我是用L-system 规则写的科赫曲线,而L-system就是自定义规则,然后生成最终用来画线的字符串,比如字符 'F'代表在画布上画一条长度为一定的直线,"-"和"+"则代表偏转的角度,比如:
F的规则: F -> F-F++F-F
递归: F-F++F-F-F-F++F-F++F-F++F-F-F-F++F-F
实现的效果:
代码:
public class KeheLine { private String goal; private int angle=0; private int leftangle=60; private int rightangle=60; private int length=300; private int depth=1; private double x1=200,y1=500; private double pi=Math.PI; /** * 无参数构造 */ public KeheLine(){ String son="F-F++F-F"; this.goal=getString(son, 1); } /** * 自定义规则构造器 * @param son */ public KeheLine(String son){ this.goal=getString(son, 1); } /** * 自定义规则和递归层次的构造器 * @param son 定义的规制字符串 * @param depth 深度 */ public KeheLine(String son,int depth){ this.goal=getString(son, depth); this.depth=depth; } /** * 自定义规则和递归层次和旋转角的科赫曲线的构造器 * @param son 定义的规制字符串 * @param depth 深度 * @param angle 旋转角 */ public KeheLine(String son,int depth,int angle){ this.goal=getString(son, depth); this.angle=angle; this.depth=depth; } /** * 自定义规则和递归层次和旋转角和左右偏转角相等的科赫曲线的构造器 * @param son 定义的规制字符串 * @param depth 深度 * @param angle 旋转角 * @param leftangle 偏转角 */ public KeheLine(String son,int depth,int angle ,int leftangle){ this.goal=getString(son, depth); this.angle=angle; this.leftangle=leftangle; this.rightangle=leftangle; this.depth=depth; } /** * 自定义规则和递归层次和旋转角和左右偏转角不相等的科赫曲线的构造器 * @param son 定义的规制字符串 * @param depth 深度 * @param angle 旋转角 * @param leftangle 左偏转角 * @param rightangle 右偏转角 */ public KeheLine(String son,int depth,int angle ,int leftangle,int rightangle){ this.goal=getString(son, depth); this.angle=angle; this.leftangle=leftangle; this.rightangle=rightangle; this.depth=depth; } /** * 自定义规则和递归层次和旋转角和左右偏转角不相等的科赫曲线的构造器 * @param son 定义的规制字符串 * @param depth 深度 * @param angle 旋转角 * @param leftangle 左偏转角 * @param rightangle 右偏转角 */ public KeheLine(String son,int depth,int angle ,int leftangle,int rightangle,int length ){ this.goal=getString(son, depth); this.angle=angle; this.leftangle=leftangle; this.rightangle=rightangle; this.length=length; this.depth=depth; } /** * 得到科赫曲线的字符串 * @param son 定义的规制字符串 */ public String getString(String son,int depth){ String relust="F"; for(int i=0;i<depth;i++){ StringBuffer str=new StringBuffer(); for(int j=0;j<relust.length();j++){ if(relust.charAt(j)=='F'){ str.append(son); }else{ str.append(relust.charAt(j)); } } relust=str.toString(); } return relust; } /** * 画科赫曲线 * @param g 画布对象 */ public void drawKehe(Graphics g){ System.out.println("depth=:"+depth); double rangle=angle; double rlength=length/(4*depth); for(int i=0;i<goal.length();i++){ if(goal.charAt(i)=='F'){ double x2=x1+rlength*Math.cos(rangle*pi/180); double y2=y1-rlength*Math.sin(rangle*pi/180); g.setColor(Color.green); g.drawLine((int)x1,(int) y1, (int)x2, (int)y2); x1=x2; y1=y2; }else if(goal.charAt(i)=='-'){ rangle+=leftangle; }else if(goal.charAt(i)=='+'){ rangle-=rightangle; }else if(goal.charAt(i)=='*'){ rangle+=angle; } } } }
相关推荐
NULL 博文链接:https://xiaozhouzhou.iteye.com/blog/1893645
包括二十多个分形程序,从最简单的科赫曲线到曼代尔波集合.内容参见 分形艺术程序设计>>. (运行程序时,右键点出快捷菜单.先选定图形再作图.看复平面上的分形时, 请将const int STEP=4改为1.) 本程序用CB5编写,在...
VB 分形图科赫格子的实现
大家一起来玩分形,本程序为基于图片的分形程序,让分形创作变为一种游戏! <br>简单来说程序有两大特色: <br> 一、引入SQFormula复数计算引擎 <br> 利用该引擎,本程序实现了迭代公式、终止条件公式和...
部分与整体以某种形式相似的形,称为分形,科赫曲线是一种外形像雪花的几何曲线,所以又称为雪花曲线,它是分形曲线中的一种,画法如下
利用分形写的科赫雪花,可以进行拖动、拾取的功能,按N、M改变雪花的边数
分形几何 教材 [分形几何——数学基础及其应用].(英国)Kenneth.Falconer-OCR
科赫曲线matlab程序代码,仅供了解原理,了解迭代过程。
分形对象——形、机遇和维数. 分形创始人的力作
这是一个用MATLAB语言写的生成科赫曲线的程序,其中科赫曲线是分形理论中的常见图形。
IDL+ENVI计算地球化学元素异常或者遥感影像的多重分形分维曲线。
NULL 博文链接:https://luliangy.iteye.com/blog/1266548
python设计科赫曲线分形树
分形-Koch曲线的MATLAB代码
互联网货币基金的多重分形分析——以余额宝、理财通为例.pdf
%分形插值曲线函数 %x为插值点,五个插值点(1,2),(2,2.5),(3,4),(4,6),(5,3) % n为迭代次数 % example1; 来自于:周承新,陈慧琴;分形插值曲线的MATLAB实现[J];科技广场;2009,3:119-120. % 但有所改动,没有初始输入...
Python中的turtle作图工具,我们可以画出各种各样的美妙的图形,分形图就是其中之一,彩色螺旋线是分形图中极具代表性的图之一,每位学习Python的IT民工都会实际上手操作的一个小实验。希望这个资源可以为你们提供到...
本代码描述了基于c#语言将一条直线进行分形,模拟海岸线的生成。具体实现为先计算一次,以生成任意两点间的KOCH曲线,然后自己设置迭代次数进行迭代产生任意迭代次数的KOCH曲线
学习OpenGL分形的一个很好的例子! 递归 是关键
利用分形插值得到曲线的变化趋,进而得到相关参数可能的值。