绘制希尔伯特曲线
2014-11-24 10:12 guocm 阅读(602) 评论(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);
}
}*/