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

📄 graph.java

📁 主要是利用java语言实现可视化的最小路径算法。
💻 JAVA
字号:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.Border;
import java.math.*;

class Graph implements MouseMotionListener, MouseListener{
	static ImagePanel panel;                  //定义画布
        int x1, y1, x2, y2;
        int[] X = new int[100];
        int[] Y = new int[100];
        Edge[] edges = new Edge[500];           //定义边的数组
        int PointNum, EdgeNum;                 //定义点的序号,边的序号
        static JLabel label;                  //显示点和线的信息


	public Graph(){
		JFrame f = new JFrame("MyImageMover");
		panel = new ImagePanel();
                label = new JLabel(" ");

		panel.addMouseListener(this);
		panel.addMouseMotionListener(this);

		f.getContentPane().add(panel, BorderLayout.CENTER);
                f.getContentPane().add(label, BorderLayout.SOUTH);
                PointNum = EdgeNum = 0;

   		f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);      //设置窗口的关闭方式
                f.pack();
                f.setVisible(true);
	}

	public void myPaint(MouseEvent e){
		panel.clicked = true;
                panel.getGraphics().drawOval(e.getX(), e.getY(), 3, 3);   //画小圈表示点
	}

        public double Distance(int a1, int b1, int a2, int b2){
          return Math.sqrt( (a1-a2)*(a1-a2) + (b1-b2)*(b1-b2) );       //求两点之间的实际距离作为线段的权值
        }

	public void mousePressed(MouseEvent e) {
          x1 = e.getX();                                              //鼠标按下获取起点的坐标 
          y1 = e.getY();
	}


	public void mouseReleased(MouseEvent e) {              
          int p1=-1, p2=-1, i;
          double dist;
          Graphics g = panel.getGraphics();

          x2 = e.getX();						//鼠标放下获取终点的坐标
          y2 = e.getY();
          g.setColor(Color.cyan);

          dist = Distance(x1, y1, x2, y2);                              //求两点的距离 
          label.setText(""+dist);
          if(dist > 5){                                                 
            for(i=0; i<PointNum; i++){					//控制两个点不重合
              if(Distance(X[i], Y[i], x1, y1) < 3) p1 = i;              //如果距离小于3的话就是原来的点
                else if(Distance(X[i], Y[i], x2, y2) < 3) p2 = i;       //如果距离大于3的话就是新的点
            }
            label.setText("p1"+p1+" p2"+p2);
            if((p1==-1) || (p2==-1)) return;

            g.setColor(Color.green);					 //设置点的颜色
            g.drawLine(X[p1], Y[p1], X[p2], Y[p2]);                      //1,2两点间画线
            edges[EdgeNum++] = new Edge(p1, p2, dist);                   //创建边
          }  
          else{                                                          
            g.setColor(Color.blue);            //如果距离不是小于5的话,鼠标放下时画了一个新的点
            g.drawOval(x1-2, y1-2, 4, 4);
            X[PointNum] = x1;
            Y[PointNum] = y1;
            PointNum++;                        //点集加1
          }
        }

        public void mouseDragged(MouseEvent e) {}    //重写接口的鼠标动作
        public void mouseClicked(MouseEvent e) {}
	public void mouseMoved(MouseEvent e) {}
	public void mouseEntered(MouseEvent e) {}
	public void mouseExited(MouseEvent e) {}

	class ImagePanel extends JPanel{           
		Image img;
		boolean clicked = false;
		int x = 100, y = 100;
	    Dimension preferredSize = new Dimension(400,250);  //设置大小

		  public ImagePanel(){                           //画边框
                  img = Toolkit.getDefaultToolkit().getImage("T4.gif");
                  Border raisedBevel = BorderFactory.createRaisedBevelBorder();
                  Border lowedBevel = BorderFactory.createLoweredBevelBorder();
                  Border compond = BorderFactory.createCompoundBorder(raisedBevel,lowedBevel);
                  setBorder(compond);
		}

	    public Dimension getPreferredSize(){
	        return preferredSize;
	    }
	}

        class Edge{                                           //定义边的结构
          public int p0, p1;
          public double distance;

          public Edge(){}
          public Edge(int i, int j, double d){
            p0 = i;
            p1 = j;
            distance = d;
          }
        }
          public void SaveData(){						//保存数据
          int i;

          if(LineLen == 0){
            label.setText("Can't save before compute Convex Hull.");
            return;
          }

          try{
            DataOutputStream fileWriter = new DataOutputStream(new FileOutputStream("Data.swj"));//建立或打开文件

            fileWriter.writeInt(PointNum);				//写入点的数量
            for (i = 0; i < PointNum; i++) {				//写入各点坐标,先为横坐标,后为纵坐标
              fileWriter.writeInt(X[i]);
              fileWriter.writeInt(Y[i]);
            }

            fileWriter.writeInt(LineLen);				//写入凸包点的点数
            for(i = 0; i <= LineLen; i++) {
              fileWriter.writeInt(LineList[i]);				//写入各凸包点
            }
          }catch(Exception e){
            label.setText("Error in writing file.");			//显示出错信息
          }
        }
        public void LoadData(){						//读取数据
            Graphics g = panel.getGraphics();				//获取Graphis变量,以便画图
            int i, p0, p1;						//循环变量

            try{
                DataInputStream fileReader = new DataInputStream(new FileInputStream("Data.swj"));//打开数据文件

                PointNum = fileReader.readInt();			//读取点的数量
                for(i = 0; i < PointNum; i++){				//依次读入各点
                  X[i] = fileReader.readInt();
                  Y[i] = fileReader.readInt();

                  g.setColor(Color.blue);				//画点
                  g.drawOval(X[i]-2, Y[i]-2, 4, 4);
                }

                LineLen = fileReader.readInt();				//读取凸包点数
                p0 = fileReader.readInt();				//读第一个点
                for(i = 0; i < LineLen; i++){				//依次读取下一个点,并连线
                  p1 = fileReader.readInt();
                  System.out.println(p1);
                  DrawLine(p0, p1);
                  p0 = p1;
                }
                public void ClrScr(){						//擦除屏幕
          Graphics g = panel.getGraphics();
          int i, p1, p2, p3, p4;					//p1至p4分别为上下左右的边界点

          if(PointNum == 0) return;

          p1 = p2 = p3 = p4 = 0;
          for(i = 0; i < PointNum; i++){
            if(Y[i] < Y[p1]) p1 = i;					//记录最上与最下的点
              else if(Y[i] > Y[p2]) p2 = i;
            if(X[i] < X[p3]) p3 = i;					//记录最左与最右的点
              else if(X[i] > X[p4]) p4 = i;
          }

          g.clearRect(X[p3]-2, Y[p1]-2, X[p4]-X[p3]+5, Y[p2]-Y[p1]+5);	//清除区域
        }

	public static void main(String[] args){
		new Graph();
	}
}

⌨️ 快捷键说明

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