Koch曲线

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

package com.elvalad;

import java.awt.*;

/**
 * Created by elvalad on 2014/12/28.
 */
public class Koch {
    private double x1;
    private double y1;
    private double x2;
    private double y2;
    private Color color = new Color(43, 77, 219);

    /**
     * Koch曲线构造函数
     * @param x1 Koch曲线起始点横坐标
     * @param y1 Koch曲线起始点纵坐标
     * @param x2 Koch曲线终止点横坐标
     * @param y2 Koch曲线终止点纵坐标
     * @param color Koch曲线的颜色
     */
    public Koch(double x1, double y1, double x2, double y2, Color color) {
        this.x1 = x1;
        this.y1 = y1;
        this.x2 = x2;
        this.y2 = y2;
        this.color = color;
    }

    /**
     * @param g
     */
    public void draw(Graphics g) {
        g.setColor(this.color);
        this.drawShape(g, this.x1, this.y1, this.x2, this.y2);
    }

    /**
     *
     * @param g
     * @param x1 Koch曲线起始点横坐标
     * @param y1 Koch曲线起始点纵坐标
     * @param x2 Koch曲线终止点横坐标
     * @param y2 Koch曲线终止点纵坐标
     */
    private void drawShape(Graphics g, double x1, double y1, double x2, double y2) {
        double c = 1.0;
        double x3 = 0;
        double y3 = 0;
        double x4 = 0;
        double y4 = 0;
        double x5 = 0;
        double y5 = 0;
        double l = 0;
        double alpha = 0;
        g.setColor(this.color);
        if (((x2 - x1)*(x2 - x1) + (y2 - y1)*(y2 - y2)) < c) {
            g.drawLine((int)x1, 500 - (int)y1, (int)x2, 500 - (int)y2);
        } else {
            x3 = x1 + (x2 - x1) / 3;
            y3 = y1 + (y2 - y1) / 3;
            x4 = x2 - (x2 - x1) / 3;
            y4 = y2 - (y2 - y1) / 3;
            l = Math.sqrt(((y2 - y1)*(y2 - y1) + (x2 - x1)*(x2 - x1))) / 3;
            alpha = Math.atan((y4 - y3) / (x4 - x3));
            if ((alpha >= 0) && (x4 - x3) < 0 ||
                    (alpha <= 0) && (x4 - x3 < 0)) {
                alpha = alpha + Math.PI;
            }
            x5 = x3 + Math.cos(alpha + Math.PI / 3)*l;
            y5 = y3 + Math.sin(alpha + Math.PI / 3)*l;
            drawShape(g, x1, y1, x3, y3);
            drawShape(g, x3, y3, x5, y5);
            drawShape(g, x5, y5, x4, y4);
            drawShape(g, x4, y4, x2, y2);
        }
    }
}

时间: 2024-08-14 23:23:00

Koch曲线的相关文章

KochSnow曲线

在这里实现了Koch曲线,而且提到我们只需要对一个等边三角形的各条边按照Koch曲线的算法进行绘图就能得到KochSnow曲线,将其实现到之前提到的绘图框架中,考虑到KochSnow的实现主要依赖Koch曲线的绘图算法,所以讲KochSnow作为Koch类的子类实现,在这个子类中实现一个新的构造函数,同时重写父类的draw方法,在这个方法中调用三次父类的drawShape方法对三条边进行绘图即可. package com.elvalad; import java.awt.*; /** * Cre

清晰认知事物概念

李笑来在文章<快速学习的几个基本原则>中提到:“我们脑子里每个概念都需要清楚的定义,一切的 “聪明” 都源自于清楚.准确.必要的概念(及其定义).”第一次看到这句话时,我有一种醍醐灌顶的感觉,发现之前自己刻意对事物概念思考的动因被一语道破. 从小到大我们对周遭事物的认识每时每刻都在一层一层地扩大.小时候对基本事物的认知开始于各个不同的名词,比如玻璃球.橙子.自行车,后来加入形容词,则赋予了名词形象的不同,比如:圆圆的球,黄色的香蕉.彪悍的老虎等等,基于对基本图像的识别,如果加入情感体系,则可以

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

初识分形 1.分形的含义: 英文单词Fractal,它是由美籍法国数学家曼德勃罗(Benoit Mandelbrot)创造出来的.其含义是不规则的.破碎的.分数的.曼德勃罗是想用此词来描述自然界中传统欧几里得几何学所不能描述的一大类复杂无规的几何对象. 2.分形的几何特征: 自相似性:自相似,便是局部与整体的相似. 自仿射性:自仿射性是自相似性的一种拓展.如果,将自相似性看成是局部到整体在各个方向上的等比例变换的结果的话,那么,自仿射性就是局部到整体在不同方向上的不等比例变换的结果.前者称为自相

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

前面讲了谢尔宾斯基三角形,它是不停地将一个三角形拆分三个与之相似的三角形.这一节给大家展示的图形是将一个等腰钝角三角形不停地拆分两个与之相似的三角形. 核心代码: static void SplitTriangle(const Vector3& v1, const Vector3& v2, const Vector3& v3, Yreal angle, Vector3* pVertices) { Vector3 dir12 = v1 - v2; Yreal len12 = D3DX

分形的程序实现

近一段时间一直在研究分形,写了几个分形相关的程序,这是其中一个.程序中里面包含近20种分形图形的生成算法. (1)科赫(Koch)雪花 (2)列维(levy)曲线 (3)龙形曲线(Dragon Curve) (4)C折线 (5)谢尔宾斯基(Sierpinski)三角形 (6)谢尔宾斯基(Sierpinski)地毯 (7)谢尔宾斯基(Sierpinski)四面体 (8)拆分三角形 (9)分形树(Tree) (10)分形二叉树(Binary Tree) (11)希尔伯特-皮亚诺(Hilbert-Pe

关于维度

1.什么是维度. 其实这个话题是欧氏几何的一个延伸.我们称零维的点,一维的线,二维的面,三维的体,四维的时空.你要注意到,这里0,1,2,3,4都是整数.你有没有想过,到底什么是维度?有没有分数维?比如3.1415926维.讨论这个的数学分支被称为分形数学.事实上分形数学已经广泛应用于物理,化学,地质,金融,社会科学等的方方面面,甚至到艺术及时尚.那么什么叫分形,什么是维度?先从一组图看起. 图0: 大自然中分形结构的例子 这组图特点在于,每个图中,某一部分挑出来都跟整体有类似性:比如,每根树枝

win-tc图形库编程

本文地址:http://www.cnblogs.com/archimedes/p/win-tc-graphics-use.html,转载请注明源地址. 由于最近接到一个紧急任务,需要实现一个程序,显示一些分形几何中的图形,例如:Koch曲线 感觉java的swing的界面太繁琐,好吧,是我不熟.于是打算用C语言来实现,但是又不想太麻烦,于是想到了win-tc(还是在虚拟机里面直接装一个xp系统,网上各种win7 64位的版本最后证明都不靠谱),下载win-tc 2.0后直接运行,win-tc自带

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

原文地址:https://www.jianshu.com/p/7332dcb978b2 引子 每天我们晚上加班回家,可能都会用到滴滴或者共享单车.打开 app 会看到如下的界面: app 界面上会显示出自己附近一个范围内可用的出租车或者共享单车.假设地图上会显示以自己为圆心,5公里为半径,这个范围内的车.如何实现呢?最直观的想法就是去数据库里面查表,计算并查询车距离用户小于等于5公里的,筛选出来,把数据返回给客户端. 这种做法比较笨,一般也不会这么做.为什么呢?因为这种做法需要对整个表里面的每一

Koch.Glitsch.KG.TOWER.v5.01.013 1CD

2014.07.18 Bentley.Limcon.03.63.01.14 1CD Bentley.Microstran.Advanced.09.20.01.21 1CD Bentley.MSTower.06.20.01.09 1CD Geometric.Glovius.Pro.v3.9.Win32_64 1CD Latitude Geographics Geocortex Essentials v4.1.3 1CD Synopsys.VCS.vI-2014.03-2.Linux64 1CD T