人员定位轨迹之递归算法

之前我的博文也讲了轨迹
但是只适用于相邻或者隔了一个的情况;
如下图:在这里插入图片描述
我们能绘制的只是一个基站到相邻基站的情况,如果基站没有完全把手卡信息采集到,
如基站30—基站20
要想查看运动情况,则必须绘制30-22-20的轨迹,这是最基础的轨迹,如果直接绘制30-20的轨迹也可以。但是这样一来从基站30出发,到其他基站的路线就会有成千上万种,不利于维护;
现在我做的是不仅仅适用于相邻基站,即使数据库里面只采集到了30-15的路线,也能够根据基础路线绘制出符合实际的路线图;
主要思想:递归;
原始递归之前的代码如下:

package cn.com.gj;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;
public class WW {
	public static List<Route> lr=null;//寻找中介时的集合
    public static List<Point> point=new ArrayList<Point>();
    public static Point pp;
	public static List<Route> ll=new ArrayList<Route>();//最终的路线轨迹
	public static List<Route> l2=null;//最终的路线轨迹
	public static List<String> list=new ArrayList<String>(); 
	public static void main(String[] args) {
		//1.模拟一个数据库,目的是不用老是重启tomcat,假设数据库里存储了30,20号基站,不相邻的
		list.add("030");
		list.add("012");
	   //2.筛选出运动轨迹出来
		BufferedImage bi=new BufferedImage(500, 500, BufferedImage.TYPE_INT_BGR);
		 Graphics2D gh = bi.createGraphics(); 
		 int sa=0;
		 int sb=0;
		 int ea=0;
		 int eb=0;
		 int sz[]=null;
		 int zz[]=null;
		 List<Route> l2=null;
		 for (int i = 0; i < list.size()-1; i++) {
			  sz= case1(list.get(i),sa,sb);//#30的x y左边
			  zz=case1(list.get(i+1), ea, eb);//#20的x y左边
			  Plan(gh,sz,zz);
			//l2是空的,但是由于集合第一个是arraylist数组,虽然数组是空的,但是有大小所以为1   
		 }
		//2.1集合里如果只有一个数的话
		 //2.2取集合里面的第一第二个数
	    for (Route rr2 : ll) {
			System.out.println(rr2.getStarta()+":"+rr2.getEnda()+":"+rr2.getStartb()+":"+rr2.getEndb());		
			                     }
		}
	//递归函数
	
	public static List<Route>  Plan(Graphics gh,int sz[],int zz[]){
		         //把每一个要经过的点都放在一个集合里
		         pp=new Point(sz[0], sz[1]);
		         point.add(pp);
			//2.3开始寻找合适的路线
					//2.3.2属于隔了一个的关系,需要有一个中介才可以直达
					//2.3.2.1 如果不是直接关系,先把所有开始位置坐标的线段找出来,然后把每个线段的末尾坐标作为开始坐标,集合里面末尾坐标还是末尾坐标,如果存在就是这个中间线段	         
		         l2=drawline(gh, sz[0], sz[1], zz[0], zz[1]);
		         if(l2.get(0)!=null){
				         pp=new Point(zz[0], zz[1]); 
		        		 point.add(pp); 	 		        	    
						//2.3.1属于邻居关系、可以直达的路线
			            for(int i=0;i<point.size()-1;i++){
			            	Route re=new Route(point.get(i).getX(), point.get(i).getY(), point.get(i+1).getX(), point.get(i+1).getY());
			            	ll.add(re);
			            }
			          return l2;
					}
					else{// if(l2.get(0)!=null)
						for (Route rr : lr) {
							l2=null;
							sz[0]=rr.getStartb();
							sz[1]=rr.getEndb();
						 l2=drawline(gh,sz[0],sz[1],zz[0], zz[1] );
						if(l2.get(0)!=null){
								//第一次寻找中介集合
								//查看添加的元素是不是最后一位
							 pp=new Point(sz[0], sz[1]);
					         point.add(pp);
					         pp=new Point(zz[0], zz[1]); 
			        		 point.add(pp); 
								 for(int i=0;i<point.size()-1;i++){
						            	Route re=new Route(point.get(i).getX(), point.get(i).getY(), point.get(i+1).getX(), point.get(i+1).getY());
						            	ll.add(re);
						            }   //for结束	
								//1.由于集合无论是否添加一个数组,大小都是1,所以需要判断第一个是不是空的就可以了
								 break;
							                   }  //if 
							else{
								 pp=new Point(sz[0], sz[1]);
						         point.add(pp);
								for (Route rr1 : lr) {
									l2=null;
									sz[0]=rr1.getStartb();
									sz[1]=rr1.getEndb();
								 l2=drawline(gh,sz[0],sz[1],zz[0], zz[1] );
								if(l2.get(0)!=null){
										//第一次寻找中介集合
										//查看添加的元素是不是最后一位
									 pp=new Point(sz[0], sz[1]);
							         point.add(pp);
							         pp=new Point(zz[0], zz[1]); 
					        		 point.add(pp); 
										 for(int i=0;i<point.size()-1;i++){
								            	Route re=new Route(point.get(i).getX(), point.get(i).getY(), point.get(i+1).getX(), point.get(i+1).getY());
								            	ll.add(re);
								            }   //for结束	
										//1.由于集合无论是否添加一个数组,大小都是1,所以需要判断第一个是不是空的就可以了
										 break;	                 
								}  //if 
									else{
										
										for (Route rr2 : lr) {
											l2=null;
											sz[0]=rr2.getStartb();
											sz[1]=rr2.getEndb();
										 l2=drawline(gh,sz[0],sz[1],zz[0], zz[1] );
										if(l2.get(0)!=null){
												//第一次寻找中介集合
												//查看添加的元素是不是最后一位
											 pp=new Point(sz[0], sz[1]);
									         point.add(pp);
									         pp=new Point(zz[0], zz[1]); 
							        		 point.add(pp); 
												 for(int i=0;i<point.size()-1;i++){
										            	Route re=new Route(point.get(i).getX(), point.get(i).getY(), point.get(i+1).getX(), point.get(i+1).getY());
										            	ll.add(re);
										            }   //for结束	
												//1.由于集合无论是否添加一个数组,大小都是1,所以需要判断第一个是不是空的就可以了
												 break;	       
										}  //if 
											else{
												
											
											}
											          
											               }//for结束	
									
									}
									          
									               }//for结束	
									
									}
									          
									               }//for结束	
							
							}
		         
							          
	     //for结束	
				

		 return ll;
	}
	public static void common(Graphics gh,int [] sz,int [] zz){
		
		
		
		
	}
	public static List<Route> drawline(Graphics gh,int sa,int sb,int ea,int eb) {
		List<Route> list=new ArrayList<Route>();
		// 1.1#30
		Route rr =null;
		if( sa== 71 && sb == 96 ){
			lr=new ArrayList<Route>(); 
			Route r = null;
			//@22
			if(ea == 72 && eb== 281){
				gh.drawLine(71,96,72,281);
				rr = new Route(sa, sb, ea, eb);	
			}
			//lr是所有的以71,96为开始的线段的集合
			r=new Route(71,96,72,281);
			lr.add(r);
		}
		//#22
		if( sa== 72 && sb == 281){
			//@30
			 lr=new ArrayList<Route>(); 
			Route r = null;
			if(ea== 71 && eb == 96){
				gh.drawLine(72,281,71,96);	
				rr = new Route(sa, sb, ea, eb);
			}
			//@22
			else if(ea == 337 && eb == 281){
				gh.drawLine(72,281,337,281);
			    rr = new Route(sa, sb, ea, eb);
			    System.out.println("添加了我!");
			}
			r=new Route(72,281,337,281);
			 lr.add(r);
			r=new Route(72,281,71,96);
			lr.add(r);
		}
		//#20
	 if(sa== 337 && sb == 281){
		
			lr=new ArrayList<Route>(); 
			Route r = null;
			//20==22
		 if(ea == 72 && eb == 281){
			gh.drawLine(337,281,72,281);
		  rr = new Route(sa, sb, ea, eb);
		}
		// 20#--12#(1)
		 else if(ea == 396 && eb == 282) {
				gh.drawLine(337, 281, 396, 282);
			 rr = new Route(sa, sb, ea, eb);
			}
		 //#20--#21
		 else if(ea == 507 && eb == 286) {
				gh.drawLine(337, 281, 507, 286);
			 rr = new Route(sa, sb, ea, eb);
			}
		    r=new Route(337,281,72,281);
		    lr.add(r);
			r=new Route(337, 281, 396, 282);
			lr.add(r);
			r=new Route(337, 281, 507, 286);
			lr.add(r);
	 }
	 //#12
		if( sa == 396 && sb == 282){
			//20==12
			lr=new ArrayList<Route>(); 
			Route r = null;
			if(ea == 337 && eb == 281) {
				gh.drawLine(396, 282,337, 281);// 20#--12#(1)
				rr= new Route(sa, sb, ea, eb);
				}	
			r=new Route(396, 282,337, 281);
			lr.add(r);
		}
		 //#21
		if( sa == 507 && sb == 286){
			//15
			lr=new ArrayList<Route>(); 
			Route r = null;
			if(ea == 580 && eb == 286) {
				gh.drawLine(507, 286,580, 286);// 21--15
				rr= new Route(sa, sb, ea, eb);
				}	
			
			//#20
			if(ea == 337 && eb == 281) {
				gh.drawLine(507, 286,337, 281);// 21--15
				rr= new Route(sa, sb, ea, eb);
				}
			r=new Route(507, 286,580, 286);
			lr.add(r);
			r=new Route(507, 286,337, 281);
			lr.add(r);
		   }
		//端点15
		if( sa == 580 && sb == 286){
			//15-21
			lr=new ArrayList<Route>(); 
			Route r = null;
			if(ea == 507 && eb == 286) {
				gh.drawLine(580, 286,507, 286);
				rr= new Route(sa, sb, ea, eb);
				}	
			r=new Route(580, 286,507, 286);
			lr.add(r);
		  }
		list.add(rr);
		return list;
	}

	
    //知道#30 #20基站的坐标
	private static int[] case1(String a, int x, int y) {
		switch (a) {
		case "030":
			x = 71;
			y = 96;
			break;
		case "017":
			x = 145;
			y = 86;
			break;
		case "022":
			x = 72;
			y = 281;
			break;
		case "020":
			x = 337;
			y = 281;
			break;
		case "028":
			x = 352;
			y = 80;
			break;
		case "012":
			x = 396;
			y = 282;
			break;
		case "014":
			x = 420;
			y = 71;
			break;
		case "023":
			x = 441;
			y = 70;
			break;
		case "029":
			x = 509;
			y = 58;
			break;
		case "013":
			x = 441;
			y = 326;
			break;
		case "019":
			x = 503;
			y = 378;
			break;
		case "027":
			x = 600;
			y = 463;
			break;
		case "024":
			x = 149;
			y = 462;
			break;
		case "040":
			x = 149;
			y = 560;
			break;
		case "038":
			x = 736;
			y = 561;
			break;
		case "033":
			x = 690;
			y = 575;
			break;
		case "015":
			x = 580;
			y = 286;
			break;
		case "039":
			x = 446;
			y = 547;
			break;
		case "037":
			x = 446;
			y = 596;
			break;
		case "031":
			x = 656;
			y = 564;
			break;
		case "034":
			x = 656;
			y = 564;
			break;
		case "036":
			x = 549;
			y = 642;
			break;
		case "026":
			x = 549;
			y = 642;
			break;
		case "011":
			x = 694;
			y = 678;
			break;
		case "016":
			x = 444;
			y = 649;
			break;
		case "032":
			x = 690;
			y = 626;
			break;
		case "021":
			x = 507;
			y = 286;
			break;
		case "035":
			x = 650;
			y = 657;
			break;
		case "025":
			x = 650;
			y = 601;
			break;
		}
		int[] sz = { x, y };
		return sz;
	}
}

出现的问题:
Exception in thread “main” java.lang.StackOverflowError
递归之后的代码如下:

猜你喜欢

转载自blog.csdn.net/qq_37591637/article/details/82881578