zoukankan      html  css  js  c++  java
  • 测试

    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();
    
    	}
    }
    
  • 相关阅读:
    Html笔记(四)图像
    Html笔记(三)列表
    Html笔记(二)字体
    Html笔记(一)概述
    mysql基础~经典题目
    MGR架构~原理细节分析(8.0最新版)
    hiveserver2
    恋爱心理
    和谐之道
    智者遇事求心,庸者遇事求境
  • 原文地址:https://www.cnblogs.com/code-wangjun/p/5551650.html
Copyright © 2011-2022 走看看