真是不好意思,一直在补以前的内容,好像显得博客特别的乱,并且以后还会有几篇也是补写的博客。
科赫曲线,我想讲当时我写的两个方法,当时也想了好久,其实究其原因还是自己的畏难情绪和缺乏耐心。
科赫曲线就是通过递归来出其曲线,关键是找到规律。
第一个方法,我只想给出源代码,因为这是我糊里糊涂写出来的,我也不知道从何说起。
/**
* 科赫曲线
* @author 剑晨
*
*/
public class DrawKoch extends JFrame{
double angle=Math.PI/3;//角度60
Graphics g;//画布
public static void main(String args []){//程序入口
DrawKoch dk= new DrawKoch();
dk.init();
}
public void init(){
setSize(800,800);
setDefaultCloseOperation(3);
setVisible(true);
}
public void paint(Graphics g){
super.paint(g);
draw(100,400,700,400,4,g,Math.PI/3);
}
/**
* 画曲线方法
* @param x1 y1 x2 y2坐标
* @param deepth 递归深度
* @param g 画布
* @param angle 角度
*/
public void draw(int x1,int y1,int x2,int y2,int deepth,Graphics g,double angle){
if(deepth<=0){//递归深度为0时画线
g.drawLine( x1,y1,x2,y2);
}
else{
//第1个三分点的坐标
int x3=x1+(x2-x1)/3;
int y3=y1+(y2-y1)/3;
//第2个三分点的坐标
int x4=x1+2*(x2-x1)/3;
int y4=y1+2*(y2-y1)/3;
//通过线长和角度计算两个三分点中间点的坐标
int l=(int) Math.sqrt((x4-x3)*(x4-x3)+(y4-y3)*(y4-y3));
int x5=(int) (x3+l*Math.cos(angle));
int y5=(int) (y3- l*Math.sin(angle));
//递归
draw(x1,y1,x3,y3,deepth-1, g,angle);
draw(x3,y3,x5,y5,deepth-1,g,angle+Math.PI/3);
draw(x5,y5,x4,y4,deepth-1, g,angle-Math.PI/3);
draw(x4,y4,x2,y2,deepth-1, g,angle);
}
}
}
效果图如下:
第二个方法,这是我讲一下我写的过程的方法。同样是递归,中间点的计算也是通过线长和角度计算。不过我事先并没有考虑别的,只是按照找到的规律递归,如下代码那样,并没考虑这样是否有角度的错误,只是先画出来再说,然后再不断改正。
/**
* 画科赫的方法
* @param x1 y1 x2 y2 坐标
* @param deepth 递归深度
*/
public void draw(double x1,double y1,double x2,double y2,int deepth){
if(deepth<=1){//深度为1,画线
g.drawLine((int)x1,(int)y1,(int)x2,(int)y2);
}else{
//第一个三分点
double x3=x1+(x2-x1)/3;
double y3=y1+(y2-y1)/3;
//第二个三分点
double x4=x1+2*(x2-x1)/3;
double y4=y1+2*(y2-y1)/3;
//顶点
double l=Math.sqrt((x4-x3)*(x4-x3)+(y4-y3)*(y4-y3));
double angle=Math.atan((y4-y3)/(x4-x3));
double x5=x3+Math.cos(angle-Math.PI/3)*l;
double y5=y3+Math.sin(angle-Math.PI/3)*l;
//递归
draw(x1,y1,x3,y3,deepth-1);
draw(x3,y3,x5,y5,deepth-1);
draw(x5,y5,x4,y4,deepth-1);
draw(x4,y4,x2,y2,deepth-1);
}
}
果然,成功永远不可能那么简单。他出现了错误,如下图。
然后我就通过改变递归深度来观察出现错误点的规律,然后发现了规律,就加了一段代码。只是一句,却改变了结果。
/**
* 画科赫的方法
* @param x1 y1 x2 y2 坐标
* @param deepth 递归深度
*/
public void draw(double x1,double y1,double x2,double y2,int deepth){
if(deepth<=1){//深度为1,画线
g.drawLine((int)x1,(int)y1,(int)x2,(int)y2);
}else{
//第一个三分点
double x3=x1+(x2-x1)/3;
double y3=y1+(y2-y1)/3;
//第二个三分点
double x4=x1+2*(x2-x1)/3;
double y4=y1+2*(y2-y1)/3;
//顶点
double l=Math.sqrt((x4-x3)*(x4-x3)+(y4-y3)*(y4-y3));
double angle=Math.atan((y4-y3)/(x4-x3));
//特别点的处理(新加的一句代码!!!!!!!!!!!!!!!!!!!!)
if(x4<x3&&y4<=y3||x4<x3&&y4>=y3){
angle=angle+Math.PI;
}
double x5=x3+Math.cos(angle-Math.PI/3)*l;
double y5=y3+Math.sin(angle-Math.PI/3)*l;
//递归
draw(x1,y1,x3,y3,deepth-1);
draw(x3,y3,x5,y5,deepth-1);
draw(x5,y5,x4,y4,deepth-1);
draw(x4,y4,x2,y2,deepth-1);
}
}
效果图如下。
- 大小: 3.9 KB
- 大小: 2.5 KB
- 大小: 2.4 KB
分享到:
相关推荐
包括二十多个分形程序,从最简单的科赫曲线到曼代尔波集合.内容参见 分形艺术程序设计>>. (运行程序时,右键点出快捷菜单.先选定图形再作图.看复平面上的分形时, 请将const int STEP=4改为1.) 本程序用CB5编写,在...
部分与整体以某种形式相似的形,称为分形,科赫曲线是一种外形像雪花的几何曲线,所以又称为雪花曲线,它是分形曲线中的一种,画法如下
科赫曲线matlab程序代码,仅供了解原理,了解迭代过程。
这是一个用MATLAB语言写的生成科赫曲线的程序,其中科赫曲线是分形理论中的常见图形。
NULL 博文链接:https://luliangy.iteye.com/blog/1266548
python设计科赫曲线分形树
NULL 博文链接:https://xiaozhouzhou.iteye.com/blog/1893645
通过选择迭代次数生成科赫曲线(或科赫雪花)分形的应用程序。 只需解压缩并运行 Koch_curve_GUI.m 文件。
这是一个在 n 次迭代后绘制分形“Koch flake”的函数。 此实现的特点是使用复数和矢量化。
包括二十多个分形程序,从最简单的科赫曲线到曼代尔波集合.内容参见 分形艺术程序设计>>. (运行程序时,右键点出快捷菜单.先选定图形再作图.看复平面上的分形时, 请将const int STEP=4改为1.) 本程序用CB5编写,在...
基于科赫雪花曲线激励装置的涡流传感器的金属裂纹检测研究,陈国龙,张卫民,本文提出并研制了一种由分形几何理论中科赫雪花图形为激励装置的涡流传感器新型结构方案,并对这种结构进行了理论和实验研究。...
一个利用分形绘制的雪花图,学习分形的朋友们可以看看。这是个MATLAB版本
Python 分形算法代码详解 分形算法代码详解 ⽬录 ⽬录 1. 前⾔ 什么是分形算法?... 分形算法 分形算法 2.1 科赫雪花 科赫雪花 科赫雪花是由瑞典数学家科赫在 1904 年提出的⼀种不规则⼏何图形,也称为雪花曲线。 分
matlab开发-Kochm。绘制“科赫曲线”分形图的函数。
结果表明:MATLAB对分形图像的处理简单、方便,通过科赫曲线、谢宾斯基填料等有规分形图形分形维数的计算表明该方法计算出的结果准确、可靠。对大气颗粒物的分形维数的计算表明,不同不规则程度的颗粒物有不同的分形...
9.2.5 科赫曲线 9.2.6 分形蕨 9.2.7 灰度映射 9.3 Mandelbort集 9.4 Julia集 9.5 分形和克罗内克积 9.6 Lindenmayer系统和分形学 9.7 威尔斯特拉斯函数 9.8 Levy?Flight随机游走 第10章 元胞自动机 10.1 引言 10.2 ...
非递归分形开发的名为“ KochCreate”的Web应用程序使用非递归... 有3个代码文件: index.html dynamic_koch.js panelfile.js KochCreate的默认视图” 边= 3且阶数= 4的科赫曲线 通过用户输入生成的变体 随机产生的变体