代码改变世界

绘制希尔伯特曲线

2014-11-24 10:12  guocm  阅读(590)  评论(0编辑  收藏  举报

转自:http://www.easyx.cn/samples/View.aspx?id=57

#include "stdafx.h"

#include <graphics.h>
#include <conio.h>
#include <string>
using namespace std;

int g_len; // Hilbert 曲线的单位长度
//string a;
//string a = "123";

// 递归绘制 Hilbert 曲线
void hilbert(string cmd, int level)
{
static BYTE d = 0; // 方向
static POINT c[4] = {1, 0, 0, -1, -1, 0, 0, 1}; // 方向对应的轴系数

if (level < 0) return;

// 处理命令字符串
int i = 0;
while(cmd[i])
{
switch(cmd[i++])
{
case '+': d = (d + 1) & 3; break;
case '-': d = (d - 1) & 3; break;
case 'X': hilbert("+YF-XFX-FY+", level - 1); break;
case 'Y': hilbert("-XF+YFY+FX-", level - 1); break;
case 'F': linerel(c[d].x * g_len, c[d].y * g_len); break;
}
}
}

// 主函数
char a;
void main()
{
// 设置绘图环境
initgraph(800, 600); // 设置窗口大小
outtextxy(20, 550, a);
rectangle(143, 23, 657, 537); // 绘制表示范围的矩形框
setorigin(144, 24); // 设置原点坐标
setcolor(RED); // 设置颜色
setfillstyle(BLACK);

int level = '5'; // 设置初始级别

do
{
if (level >= '1' && level <= '10') // 仅处理 1~8
{
level -= '0'; // 转换为对应的数字值
bar(0, 0, 511, 511); // 清空绘图区
g_len = 512 >> level; // 计算单位长度
moveto(g_len / 2, 512 - g_len / 2); // 设定起点

hilbert("X", level); // 递归绘制 Hilbert 曲线
}
}

while( (level =_getch()) != 27 ); // 按 ESC 退出

// closegraph();
}
/*
#include <graphics.h>
#include <conio.h>
#include <stdio.h>
#include <stdio.h>

void star1(int x, int y, int r);
void star2(int x, int y, int r);

void main()
{
int graphdriver, graphmode, x, y, r;
graphdriver = DETECT;
initgraph(&graphdriver, &graphmode, " ");
setcolor(LIGHTMAGENTA);
star1(160, 160, 80);
_getch();
star2(480, 320, 80);
_getch();
}

void star1(int x, int y, int r)
{
if(r > 0)
{
star1(x - r, y + r, r/2);
star1(x + r, y + r, r/2);
star1(x - r, y - r, r/2);
star1(x + r, y - r, r/2);
bar(x - r, y + r, x + r, y - r);
}
}

void star2(int x, int y, int r)
{
if(r > 0)
{
star2(x - r, y + r, r/2);
star2(x + r, y + r, r/2);
star2(x - r, y - r, r/2);
star2(x + r, y - r, r/2);
rectangle(x - r, y + r, x + r, y - r);
}
}*/