/***************************/ /* Path Finder V1.0 1997 */ /* for Java API 1.1.3 */ /* Qing Li */ /***************************/ import java.applet.*; import java.awt.*; import java.awt.event.*; import java.net.*; import java.util.*; public class Path extends Applet implements Runnable { // image for double-buffering. Image backBuffer,newbackBuffer; // graphics context of double-buffering. Graphics backBufferG,newbackBufferG; // overload interface Runnable's run() Thread animator; int num_obstacle = 3; int obstacle_size = 40; int obstacle_edges = 4; int num_gem = 3; int gem_radius = 10; int rover_width = 30; int rover_height = 20; int rover_angle = 0; int delay = 10; double tmp; int p_inter , tmp_n; Vector myScene = new Vector(); Vector myPath = new Vector(); Vector inter_p = new Vector(); // tmp point bw oringin and target points Point p1 = new Point(0,0); // origin point Point p2 = new Point(0,0); // target point Vector obs = new Vector(); // create "more than enough" empty objects -- use "vector" later. //Vector dressed_obstacles = new Vector(); //D_Obstacle D_obs = new D_Obstacle(); D_Obstacle[] dressed_obstacles = { new D_Obstacle(), new D_Obstacle(), new D_Obstacle(), new D_Obstacle(), new D_Obstacle(), new D_Obstacle(), new D_Obstacle(), new D_Obstacle(), new D_Obstacle(), new D_Obstacle(), new D_Obstacle(), new D_Obstacle(), new D_Obstacle(), new D_Obstacle(), new D_Obstacle(), new D_Obstacle(), new D_Obstacle(), new D_Obstacle(), new D_Obstacle(), new D_Obstacle(), new D_Obstacle(), }; Vector gems = new Vector(); //D_Gem D_gem = new D_Gem(); D_Gem[] dressed_gems = { new D_Gem(), new D_Gem(), new D_Gem(), new D_Gem(), new D_Gem(), new D_Gem(), new D_Gem(), new D_Gem(), new D_Gem(), new D_Gem(), new D_Gem(), new D_Gem(), new D_Gem(), new D_Gem(), new D_Gem(), new D_Gem(), new D_Gem(), new D_Gem(), new D_Gem(), new D_Gem(), new D_Gem(), new D_Gem(), new D_Gem(), new D_Gem() }; Rover rover = new Rover(this); public void init() { String arg; int i, j, k, x, y; boolean success; // get parameters from applet tag fields arg = getParameter("num_obstacle"); if (arg != null) num_obstacle = Integer.parseInt(arg); arg = getParameter("obstacle_size"); if (arg != null) obstacle_size = Integer.parseInt(arg); arg = getParameter("obstacle_edges"); if (arg != null) obstacle_edges = Integer.parseInt(arg); arg = getParameter("num_gem"); if (arg != null) num_gem = Integer.parseInt(arg); arg = getParameter("gem_radius"); if (arg != null) gem_radius = Integer.parseInt(arg); // Create double buffer with getSize of the animation box backBuffer = createImage(512+1,512+1); backBufferG = backBuffer.getGraphics(); // create random obstacles int xpoints[] = new int [obstacle_edges]; int ypoints[] = new int [obstacle_edges]; double angle[] = new double [obstacle_edges]; double alpha = 0.5; for (i=0; i=0; k--) { if (angle[k+1] < angle[k]) { // swap the two angles tmp = angle[k]; angle[k] = angle[k+1]; angle[k+1] = tmp; } } } for (j=0; j=0; j--) success = success && ( (gem_tmp.x-dressed_gems[j].x)* (gem_tmp.x-dressed_gems[j].x)+ (gem_tmp.y-dressed_gems[j].y)* (gem_tmp.y-dressed_gems[j].y) > (gem_tmp.radius+dressed_gems[j].radius)* (gem_tmp.radius+dressed_gems[j].radius) ); if(success) { dressed_gems[i].dress (x, y, gem_radius, rover_width, rover_height); gems.addElement(dressed_gems[i]); } } } // create rover success = false; while (!success) { success = true; x = Boundary.minx + (int) Math.round((Boundary.maxx - Boundary.minx) * Math.random()); y = Boundary.miny + (int) Math.round((Boundary.maxy - Boundary.miny) * Math.random()); int tmp_angle = (int) Math.round(360 * Math.random()); rover.put (x, y, rover_width, rover_height, tmp_angle); // see that the rover is contained in the boundary success = success && Boundary.contains(rover.body); // see that the rover does not initially hit obstacles success = success && (rover.hit_obstacle(dressed_obstacles, num_obstacle) == -1); // see that the rover does not initially hit gems success = success && (rover.hit_gem(dressed_gems, num_gem) == -1); } repaint(); animator = new Thread(this); } public void start() { // Event myevent = new Event(Restart,1004,"Restart"); if (animator.isAlive()) { animator.resume(); } else { // if animator is not allocated // (not "new") it's wrong to start. animator.start(); } } public void stop() { getAppletContext().showStatus("animator thread stoped"); animator.suspend(); } public void destroy() { // nomenclature of Applet mismatches Thread. animator.stop(); backBufferG.dispose(); backBuffer.flush(); } public void run() { int i, j, k; int curr_gem; double dis_min, dis; boolean blocked , success , blocked_tmp; //Point p = new Point(10,10); //Point p_ori = new Point(0,0), p_tar = new Point(0,0); //calculate path using simulated annealling try { Thread.sleep (delay); } catch (InterruptedException e) { } while(gems.size()!=0) { blocked = false; success = false; // p1 is the point where the rover is current at p1.x = rover.cmx; p1.y = rover.cmy; curr_gem=0; dis_min = 10000000000; // the diagonal of input image // find the closest gem to the rover // record the locate of that rover by p2, and index curr_gem for (i=0;i0; j--) //{ // System.out.println("here3"); // p_ori = (Point)myPath.elementAt(j); // p_tar = (Point)myPath.elementAt(j-1); // success = smartGo(dressed_obstacles, num_obstacle, // gems, p_ori, p_tar); //} //myPath.removeAllElements(); //myScene.removeAllElements(); } System.out.println("here4"); else { p_inter = 16; tmp_n = p_inter + 1; while(!success) { inter_p.removeAllElements(); p1.x = rover.cmx; p1.y = rover.cmy; // using annealling inter_p.addElement(p1); for (j=1; j< tmp_n; j++) { p.x = p1.x + (p2.x-p1.x)/tmp_n*j; p.y = p1.y + (p2.y-p1.y)/tmp_n*j; inter_p.addElement(p); } inter_p.addElement(p2); anneal(obs, num_obstacle, p1, p2, p_inter); boolean su_step = true;; for(j=0; (j0.000001; j++) { for (int m=0; m<10; m++) { for(i=1;i dy1*dx2) return +1; if ( dx1*dy2 < dy1*dx2) return -1; if ((dx1*dx2<0) || (dy1*dy2<0)) return +1; if ((dx1*dx1+dy1*dy1) < (dx2*dx2+dy2*dy2)) return +1; return +1; } /* public Vector findScene(Point p1, Vector obs, Vector gem) { // ps is the viewer, myScene is a vector difine in the // main function who call this method to record all the // visible vertices and gems int l, j, k, index_scene=-1; boolean blocked = false; Point p_test = new Point(); Vector scene = new Vector(); for(j=0; j< gem.size(); j++) { p_test.x = ((D_Gem)gem.elementAt(j)).x; p_test.y = ((D_Gem)gem.elementAt(j)).y; blocked = false; for (k=0; k< obs.size(); k++) { if(intersect(p1, p_test, ((D_Obstacle)obs.elementAt(k)).boundpoly)) { blocked = true; break;} } if(!blocked) { System.out.println(p_test); scene.addElement(p_test); index_scene++; System.out.println(scene.elementAt(index_scene)); } } for(j=0; j< obs.size(); j++) { for(l=0; l<((D_Obstacle)obs.elementAt(j)).boundpoly.npoints ; l++) { p_test.x = ((D_Obstacle)obs.elementAt(j)).boundpoly.xpoints[l]; p_test.y = ((D_Obstacle)obs.elementAt(j)).boundpoly.ypoints[l]; if( (p_test.x==p1.x) && (p_test.y==p1.y)) break; blocked = false; for (k=0; k< obs.size(); k++) { if(intersect(p1, p_test, ((D_Obstacle)obs.elementAt(k)).boundpoly)) { blocked = true; break;} } if(!blocked) { System.out.println(p_test); scene.addElement(p_test); index_scene++; System.out.println(scene.elementAt(index_scene)); } } } System.out.println("scene.size()=(in find)" +scene.firstElement() +scene.lastElement() ); for(j=0;j