Skip to content

大师兄的博客

专注无聊20年,数过的小羊连起来可以绕地球两圈

Menu
  • 首页
  • 技术交流
    • 原创
    • WebGL教程
    • js小程序在线演示
    • 摘要总结
  • 小评论
    • 动漫短评
    • 其他短评
  • 日志/心情
    • My Piano
    • 絮絮叨叨
    • 长篇大论
  • 关于我
    • 留言板
Menu

【koch】无聊一画。

Posted on 2013 年 6 月 7 日2013 年 6 月 7 日 by wysaid

Blog url:  https://wysaid.org/570.html

无聊一水,零优化画了个koch。贴下:

QQ20130605152655 QQ20130605152716 QQ20130605152721

QQ20130605152726 QQ20130605152731 QQ20130605152736 QQ20130605152741 QQ20130605152750

贴代码:

分形图形之 Koch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
/* Author: wysaid
* Title: Koch Line
* Blog: https://wysaid.org/
* Date:2013-6-6
*/
 
#include <graphics.h>
#include <vector>
#include <cmath>
 
#define        PI        3.14159f
#define PI2        (2*PI)
#define FLOATCOMP0(x)        (x < 0.01f && x > -0.01f)
 
using std::vector;
 
const float g_sqrt3 = sqrtf(3.0f);
 
const float g_angle = PI / 6.0f;
 
float getAngleByNormal(float x, float y)
{
        float d = sqrtf(x*x+y*y);
        if(FLOATCOMP0(d)) return .0f;
        float angle = asinf(y / d);
        if(x > .0f)
        {
                if(y > .0f)        return angle;
                else return PI2 + angle;
        }
        else
        {
                return PI - angle;
        }
}
 
struct Point
{
        Point(){}
        Point(float a, float b):x(a), y(b) {}
        float x, y;
        Point kochNewPoint(Point& p)
        {
                float dis = (p-*this).normalSize();
                float disP = dis / g_sqrt3;
                float angle = getAngleByNormal(p.x - x, p.y - y) + g_angle;
                return Point(x + disP * cos(angle), y + disP*sin(angle));
        }
        float normalSize()
        {
                return sqrtf(x*x+y*y);
        }
        Point operator+(Point& p)
        {
                return Point(x+p.x, y+p.y);
        }
        Point operator-(Point& p)
        {
                return Point(x - p.x, y - p.y);
        }
        Point operator*(float f)
        {
                return Point(x * f, y * f);
        }
};
 
vector<Point> g_vp;
 
void drawFractal(Point a, Point b, int n)
{
        vector<Point> tmp;
        g_vp.clear();
        g_vp.push_back(a);
        g_vp.push_back(b);
 
        while(n--)
        {
                std::vector<Point>::iterator iter = g_vp.begin();                
                for(tmp.push_back(*iter++); iter < g_vp.end(); ++iter)
                {
                        Point m, n;                        
                        m = iter[-1];
                        n = *iter;
                        Point normal = m+n;
                        tmp.push_back(m + (n-m)*(1.0f/3.0f));
                        tmp.push_back(m.kochNewPoint(n));
                        tmp.push_back(m + (n-m)*(2.0f/3.0f));
                        tmp.push_back(n);
                }
                g_vp = tmp;
                tmp.clear();
        }
        std::vector<Point>::iterator i = g_vp.begin();
        moveto(i->x, i->y);
        for(++i; i < g_vp.end(); ++i)
        {
                setcolor(random(0x7fffff) + 0x700000);
                lineto(i->x, i->y);
        }
}
 
int main()
{
        Point a(40, 240), b(600, 240);
        initgraph(640, 480);
        int n = 0;
        while(1)
        {
                cleardevice();
                drawFractal(a, b, n);
                getch();
                flushkey();
                ++n;
        }
        closegraph();
        return 0;
}

使用vs2008以及EGE13.04 编译运行通过。如果没有EGE,点击此处

1 thought on “【koch】无聊一画。”

  1. 虫虫bear说道:
    2013 年 6 月 7 日 下午 1:17

    我能不能来水一贴…..

Comments are closed.


转载本Blog文章请注明出处:
wysaid.org

2023年 3月
日 一 二 三 四 五 六
 1234
567891011
12131415161718
19202122232425
262728293031  
« 7月    

评论

  • luo.la发表在《使用OpenAL打开麦克风录音并实时回放(类似K歌效果)》
  • 罗拉发表在《使用OpenAL打开麦克风录音并实时回放(类似K歌效果)》
  • 大喜发表在《使用OpenAL打开麦克风录音并实时回放(类似K歌效果)》
  • 罗拉套图网发表在《使用OpenAL打开麦克风录音并实时回放(类似K歌效果)》
  • 爱就爱啦发表在《使用OpenAL打开麦克风录音并实时回放(类似K歌效果)》

归档

分类

TAG

Android c C++ domain EGE host iOS JavaScript NDK OpenAL OpenGL Slideshow WebGL教程 WGE 人脸识别 分形 动漫 在线演示 小程序 常识 数学 游戏 源代码 滤镜 算法 表白 视频 评论 谷歌娘 钢琴 音乐
© 2023 大师兄的博客 | Powered by Superbs Personal Blog theme