Koch曲线是一种分形,完整的Koch曲线像雪花,维基百科上记录Koch曲线最早出现在海里格·冯·科赫的论文《关于一条连续而无切线,可由初等几何构作的曲线》中,它的定义如下,给定线段AB,科赫曲线可以由以下步骤生成:

  • 将线段分成三等份(AC,CD,DB)
  • 以CD为底,向外(内外随意)画一个等边三角形DMC
  • 将线段CD移去
  • 分别对AC,CM,MD,DB重复1~3

完整的Koch雪花是由一个等边三角形分别按照以上步骤得到的分形曲线。

一些关于Koch曲线的介绍:

http://en.wikipedia.org/wiki/Koch_snowflake

http://www.matrix67.com/blog/archives/243

用Java实现Koch曲线的代码Koch.java

  1. package com.elvalad;
  2.  
  3. import java.awt.*;
  4.  
  5. /**
  6. * Created by elvalad on 2014/12/28.
  7. */
  8. public class Koch {
  9. private double x1;
  10. private double y1;
  11. private double x2;
  12. private double y2;
  13. private Color color = new Color(43, 77, 219);
  14.  
  15. /**
  16. * Koch曲线构造函数
  17. * @param x1 Koch曲线起始点横坐标
  18. * @param y1 Koch曲线起始点纵坐标
  19. * @param x2 Koch曲线终止点横坐标
  20. * @param y2 Koch曲线终止点纵坐标
  21. * @param color Koch曲线的颜色
  22. */
  23. public Koch(double x1, double y1, double x2, double y2, Color color) {
  24. this.x1 = x1;
  25. this.y1 = y1;
  26. this.x2 = x2;
  27. this.y2 = y2;
  28. this.color = color;
  29. }
  30.  
  31. /**
  32. * @param g
  33. */
  34. public void draw(Graphics g) {
  35. g.setColor(this.color);
  36. this.drawShape(g, this.x1, this.y1, this.x2, this.y2);
  37. }
  38.  
  39. /**
  40. *
  41. * @param g
  42. * @param x1 Koch曲线起始点横坐标
  43. * @param y1 Koch曲线起始点纵坐标
  44. * @param x2 Koch曲线终止点横坐标
  45. * @param y2 Koch曲线终止点纵坐标
  46. */
  47. private void drawShape(Graphics g, double x1, double y1, double x2, double y2) {
  48. double c = 1.0;
  49. double x3 = 0;
  50. double y3 = 0;
  51. double x4 = 0;
  52. double y4 = 0;
  53. double x5 = 0;
  54. double y5 = 0;
  55. double l = 0;
  56. double alpha = 0;
  57. g.setColor(this.color);
  58. if (((x2 - x1)*(x2 - x1) + (y2 - y1)*(y2 - y2)) < c) {
  59. g.drawLine((int)x1, 500 - (int)y1, (int)x2, 500 - (int)y2);
  60. } else {
  61. x3 = x1 + (x2 - x1) / 3;
  62. y3 = y1 + (y2 - y1) / 3;
  63. x4 = x2 - (x2 - x1) / 3;
  64. y4 = y2 - (y2 - y1) / 3;
  65. l = Math.sqrt(((y2 - y1)*(y2 - y1) + (x2 - x1)*(x2 - x1))) / 3;
  66. alpha = Math.atan((y4 - y3) / (x4 - x3));
  67. if ((alpha >= 0) && (x4 - x3) < 0 ||
  68. (alpha <= 0) && (x4 - x3 < 0)) {
  69. alpha = alpha + Math.PI;
  70. }
  71. x5 = x3 + Math.cos(alpha + Math.PI / 3)*l;
  72. y5 = y3 + Math.sin(alpha + Math.PI / 3)*l;
  73. drawShape(g, x1, y1, x3, y3);
  74. drawShape(g, x3, y3, x5, y5);
  75. drawShape(g, x5, y5, x4, y4);
  76. drawShape(g, x4, y4, x2, y2);
  77. }
  78. }
  79. }

Koch曲线的更多相关文章

  1. koch曲线与koch雪花的MATLAB实现

    代码 % -- function koch(Ax, Ay, Bx, By) % 控制递归深度 Deepth = ; % 控制图画大小 Size = ; + (By-Ay)^) < Deepth ...

  2. JavaScript图形实例:Koch曲线

    Koch曲线的构造过程是:取一条长度为L0的直线段,将其三等分,保留两端的线段,将中间的一段改换成夹角为60度的两个等长直线:再将长度为L0/3的4个直线段分别进行三等分,并将它们中间的一段均改换成夹 ...

  3. KochSnow曲线

    在这里实现了Koch曲线,而且提到我们只需要对一个等边三角形的各条边按照Koch曲线的算法进行绘图就能得到KochSnow曲线,将其实现到之前提到的绘图框架中,考虑到KochSnow的实现主要依赖Ko ...

  4. 海岸线、科赫曲线、turtle、递归

    本章绘图要点: turtle模块:python标准库自带的一个模块,可用来绘制二维图形.该模块封装了底层的数据处理逻辑,向外提供了更符合手工绘图习惯的接口函数,适用于绘制对质量.精度要求不高的图形. ...

  5. 分形几何算法和实现(C语言)

    初识分形 1.分形的含义: 英文单词Fractal,它是由美籍法国数学家曼德勃罗(Benoit Mandelbrot)创造出来的.其含义是不规则的.破碎的.分数的.曼德勃罗是想用此词来描述自然界中传统 ...

  6. win-tc图形库编程

    本文地址:http://www.cnblogs.com/archimedes/p/win-tc-graphics-use.html,转载请注明源地址. 由于最近接到一个紧急任务,需要实现一个程序,显示 ...

  7. 高效的多维空间点索引算法 — Geohash 和 Google S2

    原文地址:https://www.jianshu.com/p/7332dcb978b2   引子 每天我们晚上加班回家,可能都会用到滴滴或者共享单车.打开 app 会看到如下的界面:     app ...

  8. 分形之拆分三角形(Split Triangle)

    前面讲了谢尔宾斯基三角形,它是不停地将一个三角形拆分三个与之相似的三角形.这一节给大家展示的图形是将一个等腰钝角三角形不停地拆分两个与之相似的三角形. 核心代码: static void SplitT ...

  9. 计算机图形学 opengl版本 第三版------胡事民 第三章更多的绘图工具

    opengl  计算机图形学 第三版   第二部分   第三章更多的绘图工具 3.1   概述 第2章中  我们绘图使用的是屏幕窗口的基础坐标系    以像素为单位 屏幕坐标从左下角x从0延伸到scr ...

随机推荐

  1. HTML5自学笔记[ 5 ]JSON的新方法

    eval和JSON.parse的区别:eval:可以解析任何字符串为js:parse:只能解析JSON形式的字符串变为js(更安全). json格式的字符串中的属性名必须加双引号“”. stringi ...

  2. Ubuntu配置LAMP+MediaWiki及常见问题

    /*在实验室觉得文档传来传去太麻烦了,干脆在实验室内部搞个wiki算了,于是网上搜集搜集资料,配了一个,由于时间仓促,mediaWiki比较高级的东西没来的及细看,等以后用的时候再完善吧*/ 环境:U ...

  3. isDebugEnabled作用

       早上写了日志级别,然后想起在使用的时候经常用isDebugEnabled,一鼓作气.彻底弄懂它: 现象 if (logger.isDebugEnabled()) { logger.debug(m ...

  4. 有关Rander生成随机数的问题

    首先我们说的是要生成一个随机数要求传入两个参数.一个表示生成的个数,另外一个表示生成的长度 . public void shengchengsuijishu(int lenght) { '}; Ran ...

  5. (28)odoo中css可用颜色对照表

    颜色 颜色英文代码 形像颜色 HEX格式 RGB格式 LightPink 浅粉红 #FFB6C1 255,182,193 Pink 粉红 #FFC0CB 255,192,203 Crimson 猩红 ...

  6. Jdk1.8+Eclipse+MySql+Tomcat开发Java应用的环境搭建

    Java学习开发的入门教程,方便大家在学习java开发过程中掌握最基本的环境搭建 有视频,有真相 http://www.chuanke.com/1340360-164338.html jdk是操作系统 ...

  7. Maximal Rectangle [LeetCode]

    Problem Description: Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle co ...

  8. iOS开发之——从零开始完成页面切换形变动画

    前言 某天我接到了UI发给我的两张图: 需求图.png 看到图的时候我一脸懵逼,显然我需要做一个页面切换的指示动画.老实说,从大三暑假开始做iOS开发也一年有余了,但是遇到复杂动画总是唯恐避之不及,只 ...

  9. SAP 快速报表

    快速报表,这个名字不知道是不是第一个用,不过以这种方式做的报表,速度确实挺快的,应该比QUERY快,还简单 T-CODE:SQVI 进入界面后,输入一个报表名称,点击新建,这时候可以选择,单表查询,链 ...

  10. MySQL 命令杂记

    mysql> show processlist; 如果是root帐号,你能看到所有用户的当前连接.如果是其它普通帐号,只能看到自己占用的连接.show processlist;只列出前100条, ...