⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hilbert.java

📁 这个是Hilbert曲线的实现算法,可以具体演示出每级曲线的绘制过程,最多可实现8级曲线的绘制.
💻 JAVA
字号:


import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*; 


class Canvas extends Panel
{
 Image buffer;
 public void initBuffer() 
  {
    Dimension dim = getSize();
    buffer = createImage(dim.width, dim.height);
  }
 public Graphics getBufferGraphics()
  {
    return buffer.getGraphics();
  }
 public Dimension getBufferSize() 
  {
    int wd = buffer.getWidth(this);
    int hi = buffer.getHeight(this);
    return new Dimension(wd,hi);
  } 
 public void paint(Graphics g) 
  { 
    update(g); 
  }
 public void update(Graphics g) 
  {
    Dimension bd = getBufferSize();
    Dimension dim = getSize();
    g.drawImage(buffer,dim.width/2-bd.width/2,dim.height/2-bd.height/2,this);
  } 
} 





public class Hilbert extends JApplet implements Runnable,ActionListener,ItemListener,ChangeListener
{
  int m_nX0, m_nY0; //画笔当前坐标
  int m_nX1, m_nY1; //画笔目的坐标
  int m_nHeight; //单位线段长度
  private JButton m_btnRun; 
  private JButton m_btnStop; 
  private ButtonGroup m_bg;
  private JRadioButton m_rdoHirbert;
  private JRadioButton m_rdoSierpinski;
  private JCheckBox m_chkRecordActions;
  private JLabel m_lblTitle;
  private JLabel m_lblCurves;
  private JLabel m_lblSpeed1;
  private JLabel m_lblSpeed2;
  private JLabel m_lblLevel;
  private List m_lstActions;
  private JTextField m_txtLevel;
  private JSlider m_sldSpeed;
  private Thread m_thread;
  private Canvas m_canvas;
  private Graphics m_graphics;
  private int m_nDelay;
  private boolean m_bRecordActions;

  public void init() 
    {
       Container ct=getContentPane();
       ct.setLayout(null);
       m_lblTitle= new JLabel("Hirbert and Sierpinski Curves Demo");
       m_lblTitle.setBounds(460,2,230, 25);
       ct.add(m_lblTitle);
       m_lblCurves= new JLabel("Curves:");
       m_lblCurves.setBounds(460,30,46, 25);
       ct.add(m_lblCurves);
       m_rdoHirbert=new JRadioButton("Hirbert",true);
m_rdoHirbert.setBounds(516,31,60, 25);
ct.add(m_rdoHirbert);
m_rdoSierpinski=new JRadioButton("Sierpinski",false);
m_rdoSierpinski.setBounds(580,31,80, 25);
ct.add(m_rdoSierpinski);
m_bg=new ButtonGroup();
m_bg.add(m_rdoHirbert);
m_bg.add(m_rdoSierpinski);
m_lblSpeed1= new JLabel("Speed: Low");
m_lblSpeed1.setBounds(460,60,80, 25);
ct.add(m_lblSpeed1);
m_sldSpeed=new JSlider(Scrollbar.HORIZONTAL,0,600,500);
m_sldSpeed.setBounds(540,63,100, 16);
ct.add(m_sldSpeed);
m_sldSpeed.addChangeListener(this);
m_lblSpeed2= new JLabel("High");
m_lblSpeed2.setBounds(644,60,50, 25);
ct.add(m_lblSpeed2);
m_lblLevel= new JLabel("Curves Level:");
m_lblLevel.setBounds(460,90,100, 25);
ct.add(m_lblLevel);
m_txtLevel= new JTextField("4");
m_txtLevel.setBounds(560,94,40, 20);
ct.add(m_txtLevel);
m_btnRun= new JButton("Start");
m_btnRun.setBounds(606,93,70, 20);
m_btnRun.addActionListener(this);
ct.add(m_btnRun);
m_btnStop= new JButton("Stop");
m_btnStop.setBounds(606,93,70, 20);
m_btnStop.addActionListener(this);
ct.add(m_btnStop);
m_chkRecordActions= new JCheckBox("Enable Actions Recorder:");
m_chkRecordActions.setBounds(460,120,200, 20);
ct.add(m_chkRecordActions);
m_chkRecordActions.addItemListener(this);
m_lstActions=new List();
m_lstActions.setBounds(460,144,210,290);
ct.add(m_lstActions);
m_btnStop.setVisible(false);
m_canvas = new Canvas();
m_canvas.setBackground(Color.black);
m_canvas.setBounds(2,2,436,436);
ct.add(m_canvas);
validate();
m_canvas.initBuffer(); 
m_graphics=m_canvas.getBufferGraphics(); 
}

public void itemStateChanged(ItemEvent e)
{
if(m_chkRecordActions.isSelected())
{
m_bRecordActions=true;
}
else
{
m_bRecordActions=false;
}
}

public void stateChanged(ChangeEvent e)
{
m_nDelay=m_sldSpeed.getMaximum()-m_sldSpeed.getValue();
}

public void actionPerformed(ActionEvent event)
{
if (event.getSource()==m_btnRun)
{ 
m_thread = new Thread(this);
m_thread.start();
m_btnRun.setVisible(false);
m_btnStop.setVisible(true);
m_txtLevel.setEnabled(false);
m_rdoHirbert.setEnabled(false);
m_rdoSierpinski.setEnabled(false);
}
else if (event.getSource()==m_btnStop)
{ 
m_thread.stop();
m_btnRun.setVisible(true);
m_btnStop.setVisible(false);
m_txtLevel.setEnabled(true);
m_rdoHirbert.setEnabled(true);
m_rdoSierpinski.setEnabled(true);
}
}

public void setpolt()
{
m_nX0=m_nX1;
m_nY0=m_nY1;
}

public void plot()
{
m_graphics.drawLine(m_nX0, m_nY0, m_nX1,m_nY1);
m_nX0=m_nX1;
m_nY0=m_nY1;
m_canvas.repaint();
delay(); 
}

public void A_Hirbert(int i)
{
recordAction("IN: A_Hirbert( "+i+" )");
if(i>0)
{
D_Hirbert(i-1);m_nX1=m_nX1-m_nHeight;plot();
A_Hirbert(i-1);m_nY1=m_nY1+m_nHeight;plot();
A_Hirbert(i-1);m_nX1=m_nX1+m_nHeight;plot();
B_Hirbert(i-1);
}
recordAction("OUT: A_Hirbert( "+i+" )");
}

public void A_Sierpinski(int i)
{
recordAction("IN: A_Sierpinski( "+i+" )");
if(i>0)
{ A_Sierpinski(i-1);m_nX1+=m_nHeight;m_nY1+=m_nHeight;plot();
B_Sierpinski(i-1);m_nX1=m_nX1+2*m_nHeight;plot();
D_Sierpinski(i-1);m_nX1+=m_nHeight;m_nY1-=m_nHeight;plot();
A_Sierpinski(i-1);
}
recordAction("OUT: A_Sierpinski( "+i+" )");
}

public void B_Hirbert(int i)
{
recordAction("IN: B_Hirbert( "+i+" )");
if(i>0)
{
C_Hirbert(i-1);m_nY1=m_nY1-m_nHeight;plot();
B_Hirbert(i-1);m_nX1=m_nX1+m_nHeight;plot();
B_Hirbert(i-1);m_nY1=m_nY1+m_nHeight;plot();
A_Hirbert(i-1);
}
recordAction("OUT: B_Hirbert( "+i+" )"); 
}

public void B_Sierpinski(int i)
{
recordAction("IN: B_Sierpinski( "+i+" )");
if(i>0)
{
B_Sierpinski(i-1);m_nX1-=m_nHeight;m_nY1+=m_nHeight;plot();
C_Sierpinski(i-1);m_nY1=m_nY1+2*m_nHeight;plot();
A_Sierpinski(i-1);m_nX1+=m_nHeight;m_nY1+=m_nHeight;plot();
B_Sierpinski(i-1);
}
recordAction("OUT: B_Sierpinski( "+i+" )");
}

public void C_Hirbert(int i)
{
recordAction("IN: C_Hirbert( "+i+" )"); 
if(i>0)
{
B_Hirbert(i-1);m_nX1=m_nX1+m_nHeight;plot();
C_Hirbert(i-1);m_nY1=m_nY1-m_nHeight;plot();
C_Hirbert(i-1);m_nX1=m_nX1-m_nHeight;plot();
D_Hirbert(i-1);
}
recordAction("OUT: C_Hirbert( "+i+" )"); 
}

public void C_Sierpinski(int i)
{
recordAction("IN: C_Sierpinski( "+i+" )"); 
if(i>0)
{
C_Sierpinski(i-1);m_nX1-=m_nHeight;m_nY1-=m_nHeight;plot();
D_Sierpinski(i-1);m_nX1=m_nX1-2*m_nHeight;plot();
B_Sierpinski(i-1);m_nX1-=m_nHeight;m_nY1+=m_nHeight;plot();
C_Sierpinski(i-1);
}
recordAction("OUT: C_Sierpinski( "+i+" )"); 
}

public void D_Hirbert(int i)
{
recordAction("IN: D_Hirbert( "+i+" )"); 
if(i>0)
{
A_Hirbert(i-1);m_nY1=m_nY1+m_nHeight;plot();
D_Hirbert(i-1);m_nX1=m_nX1-m_nHeight;plot();
D_Hirbert(i-1);m_nY1=m_nY1-m_nHeight;plot();
C_Hirbert(i-1);
}
recordAction("OUT: D_Hirbert( "+i+" )"); 
}

public void D_Sierpinski(int i)
{
recordAction("IN: D_Sierpinski( "+i+" )"); 
if(i>0)
{
D_Sierpinski(i-1);m_nX1+=m_nHeight;m_nY1-=m_nHeight;plot();
A_Sierpinski(i-1);m_nY1=m_nY1-2*m_nHeight;plot();
C_Sierpinski(i-1);m_nX1-=m_nHeight;m_nY1-=m_nHeight;plot();
D_Sierpinski(i-1);
}
recordAction("OUT: D_Sierpinski( "+i+" )"); 
}

public void run()
{
m_lstActions.removeAll();
if(m_rdoHirbert.isSelected())
  drawHirbert(); 
else
  drawSierpinski();
m_btnRun.setVisible(true);
m_btnStop.setVisible(false);
m_txtLevel.setEnabled(true);
m_rdoHirbert.setEnabled(true);
m_rdoSierpinski.setEnabled(true);
}
//************************************************************************
public void drawHirbert()   
	{        
	recordAction("START: Hirbert Curves");                   //记录操作内容           
	int i=0;        
	int n=Integer.parseInt(m_txtLevel.getText());            //得到用户输入的层数        
	Dimension dm = m_canvas.getBufferSize();                 //得到缓冲画布的尺寸        
	m_nHeight=dm.height;                                     //原始高度        
	int x0=m_nHeight/2;                                      //初始化起始坐标        
	int y0=x0;        
	m_graphics.clearRect(0,0,dm.width,dm.height);            //清空画布        
	m_graphics.setColor(Color.WHITE);        
	do        
		{            
		recordAction("LOOP: i="+i+"...");                
		i=i+1;                                               //从第一层开始循环至第n层            
		m_nHeight=m_nHeight/2;             
		x0=x0+(m_nHeight/2);            
		y0=y0-(m_nHeight/2);             
		m_nX1=x0;            
		m_nY1=y0;            
		setpolt();                                           //设置当前坐标为(m_nX1,m_nY1)            
		A_Hirbert(i);                                        //进入递归
		//A_Hirbert(i);m_nX1+=m_nHeight;m_nY1+=m_nHeight;plot();
        //B_Hirbert(i);m_nX1-=m_nHeight;m_nY1+=m_nHeight;plot();
        //C_Hirbert(i);m_nX1-=m_nHeight;m_nY1-=m_nHeight;plot();
        //D_Hirbert(i);m_nX1+=m_nHeight;m_nY1-=m_nHeight;plot();
		}
		while(i!=n);        
		recordAction("END: Hirbert Curves");        
    }
//***********************************************************************
public void drawSierpinski()
{
recordAction("START: Sierpinski Curves"); 
int i=0;
int n=Integer.parseInt(m_txtLevel.getText());
Dimension dm = m_canvas.getBufferSize();
m_nHeight=dm.height/4;
int x0=m_nHeight*2;
int y0=m_nHeight;
m_graphics.clearRect(0,0,dm.width,dm.height);
m_graphics.setColor(Color.RED);
do
{
recordAction("LOOP: i="+i+"..."); 
i=i+1;
x0=x0-m_nHeight;
m_nHeight=m_nHeight/2;
y0=y0-m_nHeight;
m_nX1=x0;
m_nY1=y0;
setpolt();
A_Sierpinski(i);m_nX1+=m_nHeight;m_nY1+=m_nHeight;plot();
B_Sierpinski(i);m_nX1-=m_nHeight;m_nY1+=m_nHeight;plot();
C_Sierpinski(i);m_nX1-=m_nHeight;m_nY1-=m_nHeight;plot();
D_Sierpinski(i);m_nX1+=m_nHeight;m_nY1-=m_nHeight;plot();
}
while(i!=n);
recordAction("END: Sierpinski Curves"); 
}
/*public void drawHirbert()
	{}
public void drawSierpinski()
{        
	recordAction("START: Hirbert Curves");                   //记录操作内容           
	int i=0;        
	int n=Integer.parseInt(m_txtLevel.getText());            //得到用户输入的层数        
	Dimension dm = m_canvas.getBufferSize();                 //得到缓冲画布的尺寸        
	m_nHeight=dm.height;                                     //原始高度        
	int x0=m_nHeight/2;                                      //初始化起始坐标        
	int y0=x0;        
	m_graphics.clearRect(0,0,dm.width,dm.height);            //清空画布        
	m_graphics.setColor(Color.WHITE);        
	do        
		{            
		recordAction("LOOP: i="+i+"...");                
		i=i+1;                                               //从第一层开始循环至第n层            
		m_nHeight=m_nHeight/2;             
		x0=x0+(m_nHeight/2);            
		y0=y0-(m_nHeight/2);             
		m_nX1=x0;            
		m_nY1=y0;            
		setpolt();                                           //设置当前坐标为(m_nX1,m_nY1)            
		A_Hirbert(i);                                        //进入递归
		//A_Hirbert(i);m_nX1+=m_nHeight;m_nY1+=m_nHeight;plot();
        //B_Hirbert(i);m_nX1-=m_nHeight;m_nY1+=m_nHeight;plot();
        //C_Hirbert(i);m_nX1-=m_nHeight;m_nY1-=m_nHeight;plot();
        //D_Hirbert(i);m_nX1+=m_nHeight;m_nY1-=m_nHeight;plot();
		}
		while(i!=n);        
		recordAction("END: Hirbert Curves");        
    }*/
public void delay()
{
try 
{
Thread.sleep(m_nDelay);
}
catch(InterruptedException e)
{
};  
}

public void recordAction(String action)
{
if(m_bRecordActions)
m_lstActions.addItem(action);
}

} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -