Hilbert空间填充曲线在图像采样等方面十分有用关于什么希尔伯特

空间填充曲线看这里:http://en.wikipedia.org/wiki/Hilbert_curve

程序效果:

模拟Hilbert空间填充曲线效果,点击鼠标自动叠加!运行效果截图

Hilbert源程序代码:

package com.gloomyfish.p_w_picpath.hilbert;

import java.awt.Color;

import java.awt.Graphics;

import java.awt.Point;

public class Hilbert {

public static final int WHEELSIZE = 1024;

// four edges

public static final int NORTH = 0;

public static final int EAST = 90;

public static final int SOUTH = 180;

public static final int WEST = 270;

// four corners

public static final int NE = 45;

public static final int SE = 135;

public static final int SW = 225;

public static final int NW = 315;

// attributes

private Point location;

private Color[] colorWheel;

private int colorIdx;

public Hilbert() {

// build color lookup table

this.colorWheel = new Color[1024];

for (int i = 0; i < 128; ++i)

this.colorWheel[i] = new Color(0, 255 - i, i);

for (int j = 128; j < 256; ++j)

this.colorWheel[j] = new Color(0, j, j);

for (int k = 0; k < 256; ++k)

this.colorWheel[(k + 256)] = new Color(0, 255 - k, 255);

for (int l = 0; l < 128; ++l)

this.colorWheel[(l + 512)] = new Color(0, l, 255 - l);

for (int i1 = 0; i1 < 128; ++i1)

this.colorWheel[(i1 + 640)] = new Color(0, 127 - i1, 127 - i1);

for (int i2 = 0; i2 < 256; ++i2)

this.colorWheel[(i2 + 768)] = new Color(0, i2, 0);

this.colorIdx = 0;

}

public void process(Graphics graphic, int level, int width, int height) {

this.location = null;

if(level > 32 )

{

graphic.drawString("could get max depth is 32!", 40, 40);

return;

}

hilbert(graphic, level, 0, 0, width, height, 0, 225);

}

public void hilbert(Graphics g, int depth, int startx, int starty, int width, int height, int startgray, int endgray) {

int centerX = width / 2;

int centerY = height / 2;

if (depth == 0) {

if (this.location != null) {

g.setColor(this.colorWheel[this.colorIdx]);

g.drawLine(this.location.x, this.location.y,

startx + centerX, starty + centerY);

if (++this.colorIdx >= 1024)

this.colorIdx = 0;

}

this.location = new Point(startx + centerX, starty + centerY);

return;

}

switch (startgray) {

case 0:

if (endgray == 225) {

hilbert(g, depth - 1, startx, starty + centerY, centerX, centerY, 90, 225); // bottom-left

hilbert(g, depth - 1, startx, starty, centerX, centerY, 0, 225); // upper-left

hilbert(g, depth - 1, startx + centerX, starty, centerX, centerY, 0, 225); // upper-right

hilbert(g, depth - 1, startx + centerX, starty + centerY, centerX, centerY, 270, 45); // bottom-right

return;

}

if (endgray != 135)

return;

hilbert(g, depth - 1, startx + centerX, starty + centerY, centerX, centerY, 270, 135);

hilbert(g, depth - 1, startx + centerX, starty, centerX, centerY, 0, 135);

hilbert(g, depth - 1, startx, starty, centerX, centerY, 0, 135);

hilbert(g, depth - 1, startx, starty + centerY, centerX, centerY, 90, 315);

return;

case 90:

if (endgray == 315) {

hilbert(g, depth - 1, startx, starty, centerX,

centerY, 180, 315);

hilbert(g, depth - 1, startx + centerX, starty,

centerX, centerY, 90, 315);

hilbert(g, depth - 1, startx + centerX, starty

+ centerY, centerX, centerY, 90, 315);

hilbert(g, depth - 1, startx, starty + centerY,

centerX, centerY, 0, 135);

return;

}

if (endgray != 225)

return;

hilbert(g, depth - 1, startx, starty + centerY, centerX,

centerY, 0, 225);

hilbert(g, depth - 1, startx + centerX, starty + centerY,

centerX, centerY, 90, 225);

hilbert(g, depth - 1, startx + centerX, starty, centerX,

centerY, 90, 225);

hilbert(g, depth - 1, startx, starty, centerX, centerY,

180, 45);

return;

case 180:

if (endgray == 45) {

hilbert(g, depth - 1, startx + centerX, starty,

centerX, centerY, 270, 45);

hilbert(g, depth - 1, startx + centerX, starty

+ centerY, centerX, centerY, 180, 45);

hilbert(g, depth - 1, startx, starty + centerY,

centerX, centerY, 180, 45);

hilbert(g, depth - 1, startx, starty, centerX,

centerY, 90, 225);

return;

}

if (endgray != 315)

return;

hilbert(g, depth - 1, startx, starty, centerX, centerY,

90, 315);

hilbert(g, depth - 1, startx, starty + centerY, centerX,

centerY, 180, 315);

hilbert(g, depth - 1, startx + centerX, starty + centerY,

centerX, centerY, 180, 315);

hilbert(g, depth - 1, startx + centerX, starty, centerX,

centerY, 270, 135);

return;

case 270:

if (endgray == 45) {

hilbert(g, depth - 1, startx + centerX, starty,

centerX, centerY, 180, 45);

hilbert(g, depth - 1, startx, starty, centerX,

centerY, 270, 45);

hilbert(g, depth - 1, startx, starty + centerY,

centerX, centerY, 270, 45);

hilbert(g, depth - 1, startx + centerX, starty

+ centerY, centerX, centerY, 0, 225);

return;

}

if (endgray != 135)

return;

hilbert(g, depth - 1, startx + centerX, starty + centerY,

centerX, centerY, 0, 135);

hilbert(g, depth - 1, startx, starty + centerY, centerX,

centerY, 270, 135);

hilbert(g, depth - 1, startx, starty, centerX, centerY,

270, 135);

hilbert(g, depth - 1, startx + centerX, starty, centerX,

centerY, 180, 315);

return;

}

}

}

UI部分代码:

package com.gloomyfish.p_w_picpath.hilbert;

import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.Dimension;

import java.awt.Graphics;

import java.awt.event.MouseEvent;

import java.awt.event.MouseListener;

import javax.swing.JComponent;

import javax.swing.JFrame;

public class HilbertUI extends JComponent implements MouseListener {

/**

*

*/

private static final long serialVersionUID = 1L;

private int level;

private Hilbert hilbert;

private Dimension size;

public HilbertUI() {

this.level = 1;

size = new Dimension(405, 405);

this.hilbert = new Hilbert();

addMouseListener(this);

}

@Override

protected void paintComponent(Graphics g) {

g.setColor(Color.BLACK);

g.clearRect(0, 0, (int)size.getWidth(), (int)size.getHeight());

this.hilbert.process(g, this.level, (int)size.getWidth()-5, (int)size.getHeight()-5);

}

@Override

public Dimension getPreferredSize() {

return size;

}

@Override

public Dimension getMaximumSize() {

return size;

}

@Override

public Dimension getMinimumSize() {

return size;

}

public void mousePressed(MouseEvent paramMouseEvent) {

}

public void mouseEntered(MouseEvent paramMouseEvent) {

}

public void mouseExited(MouseEvent paramMouseEvent) {

}

public void mouseReleased(MouseEvent paramMouseEvent) {

}

public void mouseClicked(MouseEvent event) {

int i = event.getModifiers();

if ((i & 0x10) > 0)

this.level += 1;

else if (((i & 0xC) > 0) && (this.level > 0))

this.level -= 1;

repaint();

}

public static void main(String[] args)

{

JFrame mainFrame = new JFrame("Hilbert Demo - Gloomyfish");

mainFrame.getContentPane().setLayout(new BorderLayout());

mainFrame.getContentPane().add(new HilbertUI(), BorderLayout.CENTER);

mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

mainFrame.pack();

mainFrame.setVisible(true);

}

}

希尔伯特曲线 java_Hilbert空间递归演示相关推荐

  1. 希尔伯特曲线的绘制c语言,用四叉树和希尔伯特曲线做空间索引

    <用四叉树和希尔伯特曲线做空间索引>由会员分享,可在线阅读,更多相关<用四叉树和希尔伯特曲线做空间索引(11页珍藏版)>请在人人文库网上搜索. 1.超酷算法:用四叉树和希尔伯特 ...

  2. 超酷算法:用四叉树和希尔伯特曲线做空间索引

    原文出处:http://blog.jobbole.com/81106/ 随着越来越多的数据和应用和地理空间相关,空间索引变得愈加重要.然而,有效地查询地理空间数据是相当大的挑战,因为数据是二维的(有时 ...

  3. 四叉树和希尔伯特曲线做空间索引

    前序 四叉树或四元树也被称为Q树(Q-Tree).四叉树广泛应用于图像处理.空间数据索引.2D中的快速碰撞检测.存储稀疏数据等,而八叉树(Octree)主要应用于3D图形处理.对游戏编程,这会很有用. ...

  4. 希尔伯特曲线 java_Java中空间填充Hilbert曲线的递推算法

    我正在学习用 Java编写代码,我已经学习了java编程的递归部分.我理解了递归方法的基础知识,并且我正在尝试编写填充希尔伯特曲线(和Levy C曲线)的空间,到目前为止,一切都顺利进行,直到实际的递 ...

  5. 地理空间索引实现:z 曲线、希尔伯特曲线、四叉树, 最邻近几何特征查询、范围查询

    我的GIS/CS学习笔记:https://github.com/yunwei37/ZJU-CS-GIS-ClassNotes <一个浙江大学本科生的计算机.地理信息科学知识库 > 详细代码 ...

  6. 希尔伯特曲线 java_《算法心得:高效算法的奥秘》PDF 下载

    图书目录: 译者序 序(第1版序) 前言 第1章 概述 1.1 记法 1.2 指令集与执行时间模型 1.3 习题 第2章 基础知识 2.1 操作最右边的位元 2.1.1 德摩根定律的推论 2.1.2 ...

  7. python 画希尔伯特曲线

    给你一个问题: 让你在一个N×NN\times N的点阵,让你画一条连续曲线,使得这条曲线经过这个点阵中的每个点,并且每个点只经过一次,N满足条件:N=2k,k⊂ZN=2^k, k\subset \m ...

  8. 【降维打击】希尔伯特曲线

    如何降维? <三体>中提到的降维打击,三维世界的人类看四维空间就像池塘里的鱼看池塘外的世界一样,四维打击三维,就像人类捏死蚂蚁那般.那么到底如何才能降维呢? 比如: 三维如何降到二维呢?想 ...

  9. 希尔伯特曲线的绘制c语言,[转载]希尔伯特曲线及其matlab画法

    基本概念: 希尔伯特曲线是一种能填充满一个平面正方形的分形曲线(空间填充曲线),由大卫·希尔伯特在1891年提出.由于它能填满平面,它的豪斯多夫维是2.取它填充的正方形的边长为1,第n步的希尔伯特曲线 ...

最新文章

  1. 【转】使用C#发送Http 请求实现模拟登陆(以博客园为例)
  2. “学霸”是怎样炼成的?
  3. 报名|第2期“DI极客说”,揭秘决策AI创新应用带来的行业变革
  4. Net Present Value - NPV
  5. 圆的交点 (Python)
  6. 无心剑中译叶芝诗17首
  7. 张朝阳:知识直播是长久的事情 商业模式将水到渠成
  8. C++ vector所有操作,你真的掌握vector了吗?两万总结带你干穿vector
  9. Entity Framework 学习总结之三:架构组成介绍
  10. 为什么很多程序员不用switch,而是大量的if……else if?
  11. 多版本并发控制MVCC和乐观锁OCC 是什么 区别
  12. mysql 字符串搜_Mysql搜索字符串
  13. JMeter基础 —脚本录制工具Badboy介绍
  14. 条形码类型及常见条形码介绍
  15. ArcGIS提取面数据中心线
  16. 企业用免费邮箱哪个好
  17. 字节跳动日常实习一二三面面经(后端开发)
  18. Windows7使用Programmer Dvorak键盘布局
  19. PBFT -Golang实现详解
  20. three.js使用obj + mtl文件加载材质问题

热门文章

  1. uniapp——签到、登录
  2. 弘辽科技:拼多多大词什么意思?拼多多养词有哪些技巧?
  3. Educoder - Java面向对象 - 类与对象各关卡题目总结
  4. 机械臂雅可比矩阵的矢量积求法
  5. [答疑]充值卡的状态图
  6. Linux操作系统源码解读
  7. php即时聊天实现方案
  8. 安装XP后恢复ubuntu的引导
  9. P1497[洛谷]P1852跳跳棋
  10. APP适合用什么高防来防御ddos攻击