Hilbert 空间填充曲线的产生式规则
2015-05-31 20:41
260 查看
Hilbert空间填充曲线在图像采样等方面十分有用关于什么希尔伯特
空间填充曲线看这里:http://en.wikipedia.org/wiki/Hilbert_curve
程序效果:
模拟Hilbert空间填充曲线效果,点击鼠标自动叠加!运行效果截图
Hilbert源程序代码:
[java] view
plaincopy
package com.gloomyfish.image.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部分代码:
[java] view
plaincopy
package com.gloomyfish.image.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);
}
}
转自 http://blog.csdn.net/jia20003/article/details/19362619
空间填充曲线看这里:http://en.wikipedia.org/wiki/Hilbert_curve
程序效果:
模拟Hilbert空间填充曲线效果,点击鼠标自动叠加!运行效果截图
Hilbert源程序代码:
[java] view
plaincopy
package com.gloomyfish.image.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部分代码:
[java] view
plaincopy
package com.gloomyfish.image.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);
}
}
转自 http://blog.csdn.net/jia20003/article/details/19362619
相关文章推荐
- SMP
- AOP之代理模式(三)
- ECharts初识与Echarts-java类库应用
- 3.srs文档
- Windows Server 2012 之文件服务器(FTP)
- SHELL脚本if语句
- 浅析_tmain()与main()的区别
- http怎么加入超时和代理
- HDU 3966 Aragorn's Story
- 第五次作业
- Android-Activity状态保存
- C++ 11 的一些重要新特性
- 浏览器缓存机制
- 把关闭窗口改为最小化
- 第十一周项目4-点类派生直线类
- tile地图的组合算法
- 2-12-2 摩托车继承自行车和机动车
- 第十二周上机项目1 教室兼干部类
- 【黑马程序员】----java基础---继承、抽象、接口
- 第十一周项目3-职员有薪水了(2)