测试

package com.work8;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JPanel;


class MGraph{
	//创建一个邻接矩阵的类;
	private static final int INFI=9999;
	private ArrayList VertexList;      //图节点的储存点;
	private double[][] Edges;          //图边的储存点;
	private int arcNum;                //图边的数量储存容器;
	private int vexNum;                //图的节点的数量的储存容器;
	private boolean[] info;
	
	public MGraph(int n){
		//初始化邻接矩阵,矩阵的边和节点;
		VertexList=new ArrayList(n);
		Edges=new double[n][n];
		info=new boolean[n];
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				    Edges[i][j]=INFI; 
			}
		}
		for(int i=0;i<n;i++){
			info[i]=false;
		}
		arcNum=0;
		vexNum=0;
	}
	
	public void setVertex(int  v){
		//在列表的表尾增加一个元素;
		VertexList.add(v);
	}
	
	public int   getVertex(int i){
		if(VertexList.get(i)!=null){
		 return (int) VertexList.get(i);   //返回i位置是否有点;
		}
		else{
			return INFI;
		}
	}
	
	public int getVertexLocation(int v){
		//已知点v的值,判断该点在图的位置;
		for(int i=0;VertexList.get(i)!=null;i++){
			if((int)VertexList.get(i)==v){
				return i;
			}
		}
		return INFI;
	}
	
	public void setinfo(int i){
		//表示i位置的点是已经连接入网的,并将i位置的点的标记设为true;
		info[i]=true;
	}
	
	public boolean getinfo(int i){
		//判断i位置的点是否已经连接入网,如果i位置的点已经连接入网了,则返回true,否则返回false;
		if(info[i]==true){
			return true;
		}
		else{
			return false;
		}
	}
	
	public void setArc(int x,int y ,double Distance){
		//更改节点x和y之间的距离;
		Edges[x][y]=Distance;
	}
	
	public double getArc(int x,int y){
		//输出x和y节点之间的距离;
		return Edges[x][y];
	}
	
	public int GetVexNum(){
		//返回图的节点数目;
		return VertexList.size();
	}
}

class Node{
	//节点的储存结构;
	private int x;
	private int y;
	
	public void setNode_x(int x){
		this.x=x;
	}
	public void setNode_y(int y){
		this.y=y;
	}
	public int  GetNode_x(){
		return x;
	}
	public int  GetNode_y(){
		return y;
	}
}

class SaveNode{
	//建立一个特殊的数据结构,用于储存;
	Node[] save;
	public SaveNode(){
		save=new Node[10000];
	}
	
	public void setNode(Node[] node){
		this.save=node;
	}
	 public Node[] getNode(){
		 return save;
	 }
}


class NodeConnect  extends JPanel {
	public int k=0;
	private static final int Max=100;
	private static final int INFI=9999;
	public static final int step=10;
	
	Node[] Value=new Node[Max];       //存储需要接连入网的各个节点的位置;
	MGraph Graph=new MGraph(Max);     //初始化路网;
	int[][] Graph_sort=new int [Max][Max];   //初始化路网,确定路网需要怎么连;
	SaveNode[] Save=new SaveNode[Max];
	
	public NodeConnect(){
		//利用构造函数方法,建立一个线程;
		new Thread(new Runnable(){

			@Override
			public void run() {
				StartValue();
			     
				int i=1;
				while(i<11){
					AddValue(i,i+1);
					i=i+2;
					repaint();
					try {
						Thread.sleep(5000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					 
				 }
					
			 }
				
			}).start();
	}
	
	public  void StartValue(){
		//初始化路网,作为路网仿真的初始值;
	    Node Nanchang=new Node();
	    Nanchang.setNode_x(243);
	    Nanchang.setNode_y(181);
	    Node Jiujiang=new Node();
	    Jiujiang.setNode_x(260);
	    Jiujiang.setNode_y(57);
	    Node Xianning=new Node();
	    Xianning.setNode_x(81);
	    Xianning.setNode_y(41);
	    Node Jingdezhen=new Node();
	    Jingdezhen.setNode_x(360);
	    Jingdezhen.setNode_y(140);
	    Node Fuzhou=new Node();
	    Fuzhou.setNode_x(301);
	    Fuzhou.setNode_y(272);
	    Node Xinyu=new Node();
	    Xinyu.setNode_x(143);
	    Xinyu.setNode_y(260);
	    Node Yichun=new Node();
	    Yichun.setNode_x(90);
	    Yichun.setNode_y(291);
	    Node Pingxiang=new Node();
	    Pingxiang.setNode_x(23);
	    Pingxiang.setNode_y(317);
	    Node Yingtan=new Node();
	    Yingtan.setNode_x(374);
	    Yingtan.setNode_y(232);
	    Node Shangrao=new Node();
	    Shangrao.setNode_x(470);
	    Shangrao.setNode_y(207);
	    Node Ruichang=new Node();
	    Ruichang.setNode_x(220);
	    Ruichang.setNode_y(60);
	    Node Jian=new Node();
	    Jian.setNode_x(150);
	    Jian.setNode_y(373);
	    Node Wuyishan=new Node();
	    Wuyishan.setNode_x(478);
	    Wuyishan.setNode_y(280);
		Value[0]=Nanchang;
		Value[1]=Jiujiang;
		Value[2]=Ruichang;
		Value[3]=Jingdezhen;
		Value[4]=Yingtan;
		Value[5]=Xinyu;
		Value[6]=Jian;
		Value[7]=Xianning;
		Value[8]=Yichun;
		Value[9]=Fuzhou;
		Value[10]=Pingxiang;
		Value[11]=Shangrao;
		Value[12]=Wuyishan;
		
		//初始化路网,整个路网当中只有合肥一个点,其余点慢慢加上去;
		Graph.setVertex(0);                    //在未连接的路网中加入合肥这个点;
		int logo=Graph.getVertexLocation(0);   //得到0的位置;
		Graph.setinfo(logo);                   //set true表示0点已经连接入网;
		
		for(int i=1;i<Max;i++){      //合肥到任何点的距离都初始化为INFI;
			Graph.setArc(logo, i, INFI);
		}
		
		for(int i=0;i<Max;i++){                 //将Graph_sort置0;
			for(int j=0;j<Max;j++){
				Graph_sort[i][j]=0;
			}
		}
	}
	
	public void AddValue(int n1,int n2){
		//加入未连接点的方法,随机加入两个点;
		Graph.setVertex(n1);                      //将n1点加入图中;
		int logo1=Graph.getVertexLocation(n1);    //返回n1的坐标位置;
		Graph.setVertex(n2);                      //将n2加入图中;
		int logo2=Graph.getVertexLocation(n2);    //返回n2的坐标位置;
		for(int i=0;Graph.getinfo(i);i++){
			int temp=i;
			Graph.setArc(temp, logo1, Math.sqrt((Value[temp].GetNode_x()-Value[logo1].GetNode_x())*(Value[temp].GetNode_x()-Value[logo1].GetNode_x())
			             +(Value[temp].GetNode_y()-Value[logo1].GetNode_y())*(Value[temp].GetNode_y()-Value[logo1].GetNode_y())));
			Graph.setArc(logo1, temp, Math.sqrt((Value[temp].GetNode_x()-Value[logo1].GetNode_x())*(Value[temp].GetNode_x()-Value[logo1].GetNode_x())
		             +(Value[temp].GetNode_y()-Value[logo1].GetNode_y())*(Value[temp].GetNode_y()-Value[logo1].GetNode_y())));
			
			Graph.setArc(temp, logo2, Math.sqrt((Value[temp].GetNode_x()-Value[logo2].GetNode_x())*(Value[temp].GetNode_x()-Value[logo2].GetNode_x())
			             +(Value[temp].GetNode_y()-Value[logo2].GetNode_y())*(Value[temp].GetNode_y()-Value[logo2].GetNode_y())));	
			Graph.setArc(logo2, temp, Math.sqrt((Value[temp].GetNode_x()-Value[logo2].GetNode_x())*(Value[temp].GetNode_x()-Value[logo2].GetNode_x())
		             +(Value[temp].GetNode_y()-Value[logo2].GetNode_y())*(Value[temp].GetNode_y()-Value[logo2].GetNode_y())));	
		}
		double max=INFI;
		int k1=0,k2=0;
		for(int i=0;Graph.getinfo(i);i++){
			if(Graph.getArc(i, logo1)<max){
				max=Graph.getArc(i, logo1);
				k1=i;
			}
		}
		Graph_sort[k1][logo1]=1;
		
		for(int i=0;Graph.getinfo(i);i++){
			if(Graph.getArc(i, logo2)<max){
				max=Graph.getArc(i, logo2);
				k2=i;
			}
		}
		Graph_sort[k2][logo2]=1;
		Graph.setinfo(logo1);       //将logo1和logo2  	
		Graph.setinfo(logo2);       //set true 加入路网;

///////////////////////////////////////////////////////////////////////////
		//根据Graph_sort的数组情况选择点的连接方式;
		for(int i=0;Graph.getinfo(i);i++){
			if(Graph_sort[i][logo1]==1&&Graph_sort[i][logo2]==1){
				 Node[] save=new Node[10000];
			     ThreeNodeLine(Value[logo1],Value[logo2],Value[i],save);
			     SaveNode savenode=new SaveNode();
			     savenode.setNode(save);
			     Save[k++]=savenode;
			     
			     Node[] save1=new Node[10000];
			     TwoNodeLine(Value[logo1],Value[logo2],save1);
			     SaveNode savenode1=new SaveNode();
			     savenode1.setNode(save1);
			     Save[k++]=savenode1;
			}
			if(Graph_sort[i][logo1]==1&&Graph_sort[i][logo2]!=1){
				 Node[] save=new Node[10000];
			     TwoNodeLine(Value[logo1],Value[i],save);
			     SaveNode savenode=new SaveNode();
			     savenode.setNode(save);
			     Save[k++]=savenode;
			}
			if(Graph_sort[i][logo1]!=1&&Graph_sort[i][logo2]==1){
				 Node[] save=new Node[10000];
			     TwoNodeLine(Value[logo2],Value[i],save);
			     SaveNode savenode=new SaveNode();
			     savenode.setNode(save);
			     Save[k++]=savenode;
			}
		}
		for(int i=0;i<Max;i++){                 //将Graph_sort置0;
			for(int j=0;j<Max;j++){
				Graph_sort[i][j]=0;
			}
		}
	}
	

	private void TwoNodeLine(Node x,Node y,Node[] Save){
		int Temp_x,Temp_y,kx,ky;
		Temp_x=x.GetNode_x()-y.GetNode_x();
		Temp_y=x.GetNode_y()-y.GetNode_y();
		kx=(int)((Temp_x/Math.sqrt(Temp_x*Temp_x+Temp_y*Temp_y))*step);
		ky=(int)((Temp_y/Math.sqrt(Temp_x*Temp_x+Temp_y*Temp_y))*step);
		Save[0]=y;
		for(int i=1;i<INFI-1;i++){
			if(Save[i]==x){
				break;
			}
			else{
				Node che=new Node();
				che.setNode_x(Save[i-1].GetNode_x()+kx);
				che.setNode_y(Save[i-1].GetNode_y()+ky);
				Save[i]=che;
				Temp_x=x.GetNode_x()-Save[i].GetNode_x();
				Temp_y=x.GetNode_y()-Save[i].GetNode_y();
				kx=(int)((Temp_x/Math.sqrt(Temp_x*Temp_x+Temp_y*Temp_y))*step);
				ky=(int)((Temp_y/Math.sqrt(Temp_x*Temp_x+Temp_y*Temp_y))*step);
			}
		}
	}
	
	private void ThreeNodeLine(Node x,Node y,Node z,Node[] Save){
		int Temp_x,Temp_y,kx,ky;
		int Temp_x1=x.GetNode_x()-z.GetNode_x();
		int Temp_y1=x.GetNode_y()-z.GetNode_y();
		int Temp_x2=y.GetNode_x()-z.GetNode_x();
		int Temp_y2=y.GetNode_y()-z.GetNode_y();
		int Kx1=(int)((Temp_x1/Math.sqrt(Temp_x1*Temp_x1+Temp_y1*Temp_y1))*step);
		int Ky1=(int)((Temp_y1/Math.sqrt(Temp_x1*Temp_x1+Temp_y1*Temp_y1))*step);
		int Kx2=(int)((Temp_x2/Math.sqrt(Temp_x2*Temp_x2+Temp_y2*Temp_y2))*step);
		int Ky2=(int)((Temp_y2/Math.sqrt(Temp_x2*Temp_x2+Temp_y2*Temp_y2))*step);
		Save[0]=z;
		for(int i = 1;i<INFI-1;i++){
			if(Kx1+Kx2==0&&Ky1+Ky2==0){
				break;
			}
			else
			{
				Temp_x=Kx1+Kx2;
				Temp_y=Ky1+Ky2;
				kx=(int)((Temp_x/Math.sqrt(Temp_x*Temp_x+Temp_y*Temp_y))*step);
				ky=(int)((Temp_y/Math.sqrt(Temp_x*Temp_x+Temp_y*Temp_y))*step);
				Node che=new Node();
				che.setNode_x(Save[i-1].GetNode_x()+kx);
				che.setNode_y(Save[i-1].GetNode_y()+ky);
				Save[i]=che;
				Temp_x1=x.GetNode_x()-Save[i].GetNode_x();
				Temp_y1=x.GetNode_y()-Save[i].GetNode_y();
				Temp_x2=y.GetNode_x()-Save[i].GetNode_x();
				Temp_y2=y.GetNode_y()-Save[i].GetNode_y();
				Kx1=(int)((Temp_x1/Math.sqrt(Temp_x1*Temp_x1+Temp_y1*Temp_y1))*step);
				Ky1=(int)((Temp_y1/Math.sqrt(Temp_x1*Temp_x1+Temp_y1*Temp_y1))*step);
				Kx2=(int)((Temp_x2/Math.sqrt(Temp_x2*Temp_x2+Temp_y2*Temp_y2))*step);
				Ky2=(int)((Temp_y2/Math.sqrt(Temp_x2*Temp_x2+Temp_y2*Temp_y2))*step);
			}
		}
	}
	
	public void paintComponent(Graphics G){
		super.paintComponent(G);
		Graphics2D G2D=(Graphics2D)G;
		for(int i=0;Value[i]!=null;i++){
			G2D.fillOval(Value[i].GetNode_x(), Value[i].GetNode_y(), 10, 10);
		}
		for(int i=0;Save[i]!=null;i++)
		{
			Node[] node=new Node[1000];
			node=Save[i].getNode();
			for(int j=0;node[j]!=null;j++){
				G2D.fillOval(node[j].GetNode_x(), node[j].GetNode_y(), 3, 3);
			}
		}
		
	}
	
}
	


public class Work8 {
	private static  void GuiShow(){
		JFrame frame=new JFrame();
		frame.setTitle("work6Test");
		frame.setSize(400, 400);
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		NodeConnect Panel=new NodeConnect();
		frame.add(Panel);
	}

	public static void main(String[] args) {
		GuiShow();

	}
}
原文地址:https://www.cnblogs.com/code-wangjun/p/5551650.html