`
NX
  • 浏览: 12224 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论
  • smartan: 话说这就是所谓的以时间换空间吧
    队列
  • NX: 是的,真心感谢各位提出的意见和建议,我也在修改代码,主要是在怎 ...
    队列
  • xchd: 队列不是先进先出吗?好像没有体现这点。
    队列
  • kidding87: 你这里应该和jdk学习下,动态的容量,怎么去扩容,你这里效率非 ...
    队列

分形之科赫曲线小结

阅读更多
科赫曲线又被称为雪花曲线,是分形中的一种,画科特曲线的基本思路是先画一个给定边长和顶点坐标的正三角形,通过数学方法求出另外两个点的坐标,然后从界面获得要递归的次数(递归一次三角形的每一条边就被分为三等分以此类推),求出每一条边最终被分成了多长的小等分,最后从某一个顶点开始画最小等份的_/\_形状并逐层向上返回(另外两个端点也一样)。


要注意的地方:
1、 从界面输入的递归次数是String类型的,在用之前要将其转换为int类型的
//获取递归次数
   String a = jta.getText();
//将String “a”转为int a
times = Integer.parseInt(a);
2、 要画线段的起始坐标先定义为double,因为用数学函数求出的是double类型的数据,画的时候再强制转换为int,这样可以使得误差小一些。
3、 要将给出的角度转换为弧度角,例如angle为180度(无法表示出),所以就要转化为Math.PI(3.141592657)弧度
      R = Math.PI/180*angle;
 

 
具体代码如下:
package com20130318;

import java.awt.Color;

import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

/**
* 写一个画科特曲线的类
* @author 
*
*/
public class Koch extends JFrame{
//主函数
public static void main(String args[]){
Koch ko = new Koch();
ko.showInfo();
}


public void showInfo(){
//创建一个固定大小的窗体对象
JFrame jf = new JFrame();
jf.setSize(400,400);
//设置窗体的布局管理
java.awt.FlowLayout fl = new java.awt.FlowLayout();
    jf.setLayout(fl);
   
jf.setResizable(false);
jf.setDefaultCloseOperation(3);
//jf.getContentPane().setBackground(Color.BLACK);

//创建一个标签

String str="递归层数:";
JLabel jl = new JLabel(str);
jf.add(jl);
//标签长度
JTextField jta = new JTextField(10);
jf.add(jta);
jf.setVisible(true);

//得到画布对象
Graphics gr = jf.getGraphics();

//创建一个鼠标监听器
MyMouseListener lis = new MyMouseListener();
lis.gr = gr;
lis.jta = jta;
jf.addMouseListener(lis);
}
}






package com20130318;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JTextField;
/**
* 自定义一个鼠标监听器类
* @author Administrator
*
*/
public class MyMouseListener implements MouseListener{
Graphics gr;
JTextField jta;
//times用来记录递归调用的次数
int times ;      
double angle;
//(x0,y0)表示要画线段的起始坐标,先定义为double,画线段时再强制转换为int
double x0;    
double y0;
//length表示当前线段的长度
double length; 


/**
*  自定义mouseClicked方法  用来获取递归次数
*/
public void mouseClicked(MouseEvent e) {
   gr.clearRect(50, 50,600,600);
//获取递归次数
   String a = jta.getText();
   //将String “5”转为int “5”
   times = Integer.parseInt(a);
  
   paint(gr);
//    try {
//    Thread.sleep(200);
//    }catch(Exception ef){}
//

}


/**
* 定义一个paint方法
* @param g  传入画布参数
*/
public void paint(Graphics g) { 
gr.setColor(Color.BLUE);
//  返回3的time次幂的值
int N = (int) Math.pow(3, times);
//求出当前长度
length = 200.0 / N;        

/**
* 画 "/ "(x0,y0)左下的端点,,因为三角形的顶点坐标为(150,100),所以y0 = (int)(Math.sqrt(3)*100)+50
*/
angle = -60;        
x0 = 50;        
y0 = (int)(Math.sqrt(3) * 100) + 100;
drawKoch(g, times, angle); 

/**
* 画 "\" (x0,y0)左上的端点(150,100)
*/
angle = 60;        
x0 = 150;        
y0 = 100;        
drawKoch(g, times, angle);

/**
* 画" _ "(x0,y0)右端点
*/
angle = 180;        
x0 = 250;        
y0 = (int)(Math.sqrt(3) * 100) + 100;        
drawKoch(g, times, angle);      
}      




public void drawKoch(Graphics g, int n, double angle) {           
double x1, y1, R; 

if (n == 0) {
//转化为弧度角,例如angle为180度(无法表示出),则可以转化为Math.PI(3.1415926)弧度
R = Math.PI / 180 * angle; 

//每次求出离当前端点最近的下一端点坐标,并画出该线段
x1 = length * Math.cos(R) + x0;            
y1 = length * Math.sin(R) + y0;
g.drawLine((int) x0, (int) y0, (int) x1, (int) y1);
//更换当前端点坐标
x0 = x1;            
y0 = y1;            
return;        
   } 
        
/**
  * 画出的曲线依次是_/\_
  */
drawKoch(g, n-1, angle); 
drawKoch(g, n-1, angle - 60);        
drawKoch(g, n-1, angle + 60);        
drawKoch(g, n-1, angle);     
}      





@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub

}

@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub

}

@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub

}

@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub

}

}
0
1
分享到:
评论

相关推荐

    二十个分形(科赫曲线到曼代尔波集合)-源代码

    包括二十多个分形程序,从最简单的科赫曲线到曼代尔波集合.内容参见 分形艺术程序设计>>. (运行程序时,右键点出快捷菜单.先选定图形再作图.看复平面上的分形时, 请将const int STEP=4改为1.) 本程序用CB5编写,在...

    VB 分形图科赫格子的实现

    科赫曲线的生成过程是将一条直线段分成三等份,然后在中间三分之一处添加一个正六边形的两对对角线,重复此过程于每一段新生成的线段上。科赫格子则是将这种规则应用到二维网格上,每次迭代都会使线条变得更加复杂。...

    Koch.rar_科赫曲线MATLAB_科赫曲线及其他迭代分形代码

    科赫曲线matlab程序代码,仅供了解原理,了解迭代过程。

    生成科赫曲线程序

    这是一个用MATLAB语言写的生成科赫曲线的程序,其中科赫曲线是分形理论中的常见图形。

    IDL+ENVI计算地球化学元素异常或者遥感影像的多重分形分维曲线。

    本主题将深入探讨如何使用IDL和ENVI来计算地球化学元素异常或遥感影像的多重分形分维曲线。 首先,让我们了解什么是多重分形。分形是自然界中普遍存在的几何形态,它们具有自相似性,即使在不同尺度下观察也能发现...

    java分形绘制科赫雪花曲线(科赫曲线)代码分享

    科赫雪花曲线(Koch Snowflake Curve)是一种典型的分形曲线,因其形状类似于雪花而得名。这个概念源自数学家弗里德里希·维克托·科赫在1904年提出的一种构造方法。 科赫雪花曲线的构造过程基于一个简单的迭代规则...

    python设计科赫曲线分形树

    python设计科赫曲线分形树

    科赫曲线MATLAB代码

    科赫曲线是一种典型的分形几何图形,具有自相似的特性。它是由瑞典数学家赫尔曼·冯·科赫于1904年首次提出的。科赫曲线的生成过程是通过不断迭代一个基本的构造单元来实现的。本文将基于提供的MATLAB代码,详细解析...

    玩玩分形 科赫曲线.jar

    NULL 博文链接:https://luliangy.iteye.com/blog/1266548

    分形插值曲线函数

    %分形插值曲线函数 %x为插值点,五个插值点(1,2),(2,2.5),(3,4),(4,6),(5,3) % n为迭代次数 % example1; 来自于:周承新,陈慧琴;分形插值曲线的MATLAB实现[J];科技广场;2009,3:119-120. % 但有所改动,没有初始输入...

    毕业设计MATLAB_科赫曲线.zip

    科赫曲线是一种著名的分形几何图形,它通过迭代过程构建,每次迭代都将直线段替换为更复杂的形状,以此形成自相似的雪花状结构。在MATLAB中实现科赫曲线,涉及到的主要知识点包括: 1. **MATLAB基础**:MATLAB是一...

    雪花分形-OpenGL

    雪花分形最著名的例子是科赫雪花,它是通过将等边三角形的每一条边替换为更复杂的形状(通常是四个小等边三角形)来构建的,这个过程可以无限重复,每次迭代都会增加图形的复杂度。 在OpenGL中实现雪花分形,首先...

    分形理论形成Koch曲线

    本代码描述了基于c#语言将一条直线进行分形,模拟海岸线的生成。具体实现为先计算一次,以生成任意两点间的KOCH曲线,然后自己设置迭代次数进行迭代产生任意迭代次数的KOCH曲线

    koch(n):在 n 次迭代后绘制分形“科赫片”的函数。-matlab开发

    科赫曲线(Koch curve)是最早被研究的分形之一,由瑞典数学家费利克斯·科赫在1904年提出。科赫曲线通过迭代过程生成,每次迭代都将直线段替换为更复杂的结构。在此背景下,我们讨论的是如何在MATLAB中利用复数和...

    Java_科赫曲线

    基本步骤是将一条直线段分为三等份,然后在中间三分之一处添加一个60度角的小三角形,这样原来的线段就被三条新的线段替代了。重复此过程,每次迭代都会增加更多的线段,使得曲线越来越复杂。科赫曲线通常通过递归...

    L系统_重写系统_希尔伯特曲线_谢尔宾斯基三角形_科赫曲线

    雪花曲线是科赫曲线的一种变体,它基于科赫曲线的构建原理,但每次迭代时在每个三角形的顶点处添加等边三角形的三分之一边。经过无限迭代,形成的曲线具有无限长度,包围的区域却只有有限的面积,而且其边界具有令人...

    分形浅谈——科赫曲线和L-System

    NULL 博文链接:https://xiaozhouzhou.iteye.com/blog/1893645

    matlab.zip_分形_分形插值_分形插值matlab_分形插值曲线

    2. 分形维度估计:通过计算数据点的盒维数或相关维数,确定分形曲线的分形维度。 3. 构建分形模型:根据分形维度,选择合适的分形模型(如分形网络、分形树等)。 4. 迭代插值:通过迭代算法,将数据点映射到分形...

    fractalInt20.0分形包, 绘出各种分形曲线的软件

    分形曲线是分形理论的核心内容之一,它们通常不是平滑连续的,而是具有无穷的细节和复杂的分支结构。著名的分形曲线有曼德勃罗集合、朱利亚集合、科赫曲线等。这些曲线的生成通常通过迭代函数系统实现,每次迭代都会...

Global site tag (gtag.js) - Google Analytics