zoukankan      html  css  js  c++  java
  • 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);
            }
        }
    }

    ------------------------------- 问道,修仙 -------------------------------
  • 相关阅读:
    Perl 简介
    一定时间后延时变长问题
    CPAN常见问题集
    J2SE简介
    brian的Perl问题之万能指南
    清洁工 VS 亿万富翁
    关于VC中的"stdafx.h"
    Perl模式匹配
    wiki介绍
    生活中10大省钱小秘诀 白领一族"必备诀窍"
  • 原文地址:https://www.cnblogs.com/elvalad/p/4190736.html
Copyright © 2011-2022 走看看