// 1.124 Final Project // Group: Evidence import java.awt.*; import java.applet.Applet; import java.awt.image.*; import java.util.*; import java.lang.Math; import java.awt.event.*; public class Path_finder extends Applet implements Runnable { Image mBackgroundImage, mRoverImage; boolean mbBackgroundComplete = false, mbRoverComplete = false; boolean mbBackgroundDrawn = false, tmp =false; Image mOffScreenImage; Graphics mOffScreenGraphics; Rover mRover; Button mStartButton, mStopButton; Thread mRunner = null; static final int iWidth=512, iHeight=512; static final int North=0,South=4,East=2,West=6,NE=1,NW=7,SE=3,SW=5; static final int Positive = 1, Negative = -1; //definition of data structure for gems and obstacles public Vector gem[]=new Vector [1000]; //each vector for one gem // public Vector obstacle[]=new Vector [1000]; //each vector for one obstacle public int pickedup[]=new int [20]; //flags of pickup int gemnum=0,obsnum=0;; int accvalue=0; //accumulated gems value picked up Point deadpoint[]=new Point [50000], path[]=new Point [50000], ttmp[]=new Point [50000]; int pd=0, pp=0,pt=0,prev=0; //int[] iPixels = new int[iWidth * iHeight]; ; //end of definition of data structure for gems and obstacles public Path_finder() { setLayout(new BorderLayout()); Panel panel = new Panel(); mStopButton = new Button("Stop"); panel.add(mStopButton); add("South", panel); } public void init() { // Get a handle on the images. mBackgroundImage = getImage(getCodeBase(), "mars.gif"); //mRoverImage = getImage(getCodeBase(), "rover.gif"); // Create the rover. mRover = new Rover(this); // Create an offscreen buffer. mOffScreenImage = createImage(512, 512); mOffScreenGraphics = mOffScreenImage.getGraphics(); //Scan gems and obstacles tmp=ScanObj(); mRunner = new Thread(this); mRunner.setPriority(Thread.MAX_PRIORITY); mRunner.start(); } // The update method is called by the AWT whenever we make a repaint() // request. The default implementation of update() clears the background // before calling paint(), which leads to flashing. To avoid flashing, // we provide our own implementation of update. public void update(Graphics g) { if (!mbBackgroundDrawn) { mOffScreenGraphics.drawImage(mBackgroundImage, 0, 0, this); if (mbBackgroundComplete) mbBackgroundDrawn = true; } mRover.show(mOffScreenGraphics); if (mbBackgroundComplete) { g.drawImage(mOffScreenImage, 0, 0, null);} } //end of update // We still need a paint method, because paint() is called directly by // the AWT when a window is hidden and re-exposed. public void paint(Graphics g) { update(g); } // The imageUpdate method belongs to the ImageObserver // interface, // which is implemented by all AWT components. We override //the // imageUpdate method, so that we track the loading of images. public synchronized boolean imageUpdate(Image image, int flags, int x, int y, int width, int height) { boolean done = ((flags & ALLBITS) != 0); // If the image has finished loading, record this fact. if (done) { System.out.println("Loaded image."); if (image == mBackgroundImage) { mbBackgroundComplete = true; repaint(); } } return !done; } // The action method allows us to respond to the Start and Stop buttons. public boolean action(Event event, Object obj) { if (obj.equals("Stop")) { if (mRunner != null) { mRunner.stop(); mRunner = null; //mOffScreenGraphic.dispose(); //mOffScreenImage.flush(); } } return true; } //+++++++++++++++++++++++++++++++++++++== public void run() { int i,j,ingem=0; int iVX = 1, iVY = 1; boolean bHitObject,checkgem; int dir=SE; Point p1=new Point() ,p2=new Point(); //p1:rover; p2: current gem int olddir[]=new int [50]; int old_pointer=0; int kkk, jjj; int td, dis; while (mRunner != null) { for(jjj=0; jjjtd){ dis=td; j=kkk; } } } p2=(Point)(gem[j].elementAt(gem[j].size()/2)); pd=0; if(jjj>0) dir=(choose_dir(p1,(Point)(gem[j].elementAt(gem[j].size()/2)))+4)%8; boolean success=s_path(p1,p2,j,dir); //System.out.println(j+" "+success); while ( ! success){ int back=30; if(pp/4<30) back=pp/4; if (back<1) back =1; p1.x=mRover.cmx; p1.y=mRover.cmy; if ((pp) <=0) { System.out.println("give up gem["+j+"]"); break; } dir=(choose_dir(p1,path[pp-back])+4)%8; success=s_path(p1,path[pp-back],prev,dir); //p1=path[pp-back]; p1.x = mRover.cmx; p1.y = mRover.cmy; dir=(choose_dir(p1,(Point)(gem[j].elementAt(gem[j].size()/2)))+4)%8; success=s_path(p1,(Point)(gem[j].elementAt(gem[j].size()/2)),j,dir); pp=pp-back; } prev=j; //end of j cycle if(jjj==gemnum-1){ System.out.println("Mission Completed"); if (mRunner != null) { mRunner.stop(); mRunner = null;} } } } } //end of run() //+++++++++++++++++++++++++++++++++++++++++++++++++ boolean hitGem(Rover mRover, int index) { int i, x, y; if (pickedup[index]==0) { for(i=0; i> 16) & 0xff; iGreen = (iPixel >> 8) & 0xff; iBlue = iPixel & 0xff; if (color==1){ //dealing with gem pickup if (iRed == 0 && iGreen == 255 && iBlue == 0) { // for( int k1=0;k1> 16) & 0xff; iGreen = (iPixel >> 8) & 0xff; iBlue = iPixel & 0xff; if (color==1){ //dealing with gem pickup if (iRed == 0 && iGreen == 255 && iBlue == 0) { // for( int k1=0;k1> 16) & 0xff; iGreen = (iPixel >> 8) & 0xff; iBlue = iPixel & 0xff; if (color==1){ //dealing with gem pickup if (iRed == 0 && iGreen == 255 && iBlue == 0) { // for( int k1=0;k1> 16) & 0xff; iGreen = (iPixel >> 8) & 0xff; iBlue = iPixel & 0xff; if (color==1){ //dealing with gem pickup if (iRed == 0 && iGreen == 255 && iBlue == 0) { // for( int k1=0;k1> 16) & 0xff; iGreen = (iPixel >> 8) & 0xff; iBlue = iPixel & 0xff; if (iRed == 0 && iGreen == 255 && iBlue == 0) { //---- pp = (Object)new Point(0,0); Point point=(Point) pp; point.x = i; point.y = j; if (ll==0){gemnum++; gem[gemnum-1] = new Vector(30); gem[gemnum-1].addElement(pp); pp=null; // System.out.println(gemnum); ll=1; } else{ int x0=((Point)(gem[gemnum-1].lastElement())).x; int y0=((Point)(gem[gemnum-1].lastElement())).y; int x1=point.x; int y1=point.y; if ( (Math.abs(x0-x1)<=1) && (y0==y1)){ gem[gemnum-1].addElement(pp); //put the current point into the right gem Vector pp=null; } else { gemnum++; gem[gemnum-1] = new Vector(30); gem[gemnum-1].addElement(pp); //start a new gem pp=null; // System.out.println(gemnum); } } //---- } } ll=0; } // end of pixel scanning //begining of combination of pseudo objects bb=0; for( k=1;k0){ for ( k=0;kp1.x) ivx=1; else ivx=-1; if (p2.y==p1.y) ivy=0; else if(p2.y>p1.y) ivy=1; else ivy=-1; switch(ivx){ case 0: if(ivy==1) return South; else if(ivy==-1) return North; case 1: switch (ivy){ case 0: return East; //case 1: return SE; case 1: return SE; //case -1: return NE; case -1: return NE; default : break; } case -1: switch (ivy){ case 0: return West; case 1: return SW; //SW; case -1: return NW; //NW default : break; } default : break; } return SE; } //----- //--searching path boolean s_path(Point p1,Point p2, int jj,int olddir){ boolean finish=true,bHitObject=true; Point np1=new Point(); int iVX=0,iVY=0; int Counter=0; int firstdir; int mod_dir[] =new int [8]; int dead=0, theta=0; mod_dir[0]=0;mod_dir[2]=1;mod_dir[1]=-1;mod_dir[4]=2;mod_dir[3]=-2;mod_dir[6]=3;mod_dir[5]=-3;mod_dir[7]=4; if((p1.x==p2.x)&&(p1.y==p2.y)) { System.out.println("Got one"); accvalue=accvalue+gem[jj].size(); System.out.println("Total Gem Value = "+accvalue); pickedup[jj]=1; //-- pp=0; for(int ll=0;ll 90) angle_tmp -= 180; if ( angle_tmp < -90) angle_tmp += 180; f1 = angle*Math.PI/180.0 + Math.atan(2./3.); f2 = angle*Math.PI/180.0 - Math.atan(2./3.); myxpoints[0] = cmx - (int) (dia * Math.cos(f2)); myypoints[0] = cmy - (int) (dia * Math.sin(f2)); myxpoints[1] = cmx - (int) (dia * Math.cos(f1)); myypoints[1] = cmy - (int) (dia * Math.sin(f1)); myxpoints[2] = cmx + (int) (dia * Math.cos(f2)); myypoints[2] = cmy + (int) (dia * Math.sin(f2)); myxpoints[3] = cmx + (int) (dia * Math.cos(f1)); myypoints[3] = cmy + (int) (dia * Math.sin(f1)); // if hit boundary, can't rotate, return false for(i=0; i<4; i++) if ((myxpoints[i]maxx) || (myypoints[i]maxy)) { //System.out.println( "hit Wall"); return false;} // if hit an obs, can't rotate, return false int iPixel, iRed, iGreen, iBlue; int dx, dy; // from myxpoints[0] to myxpoints[1], left line; if (myxpoints[0] < myxpoints[1] ) dx = 1; if (myxpoints[0] > myxpoints[1] ) dx = -1; else dx =0; if (dx==0) dy =1; else dy = (myypoints[1]-myypoints[0])/(myxpoints[1]-myxpoints[0])*dx+1; for(j=myxpoints[0], k=myypoints[0] ; k<=myypoints[1]; k+=dy) { iPixel = iPixels[k*512+j]; iRed = (iPixel >> 16) & 0xff; iGreen = (iPixel >> 8) & 0xff; iBlue = iPixel & 0xff; if (iRed == 255 && iGreen == 0 && iBlue == 0) {System.out.println( "bottom hit obs"); return false;} j += dx; } // from myxpoints[1] to myxpoints[2], bottom line; if (myypoints[1] < myypoints[2] ) dy = 1; if (myypoints[1] > myypoints[2] ) dy = -1; else dy =0; if (dy==0) dx =1; else dx = (myxpoints[2]-myxpoints[1])/(myypoints[2]-myypoints[1])*dy+1; for(j=myxpoints[1], k=myypoints[1] ; j<=myxpoints[2]; j+=dx) { iPixel = iPixels[k*512+j]; iRed = (iPixel >> 16) & 0xff; iGreen = (iPixel >> 8) & 0xff; iBlue = iPixel & 0xff; if (iRed == 255 && iGreen == 0 && iBlue == 0) {System.out.println( "left hit obs"); return false;} k += dy; } // from myxpoints[2] to myxpoints[3], right line; if (myxpoints[2] < myxpoints[3] ) dx = 1; if (myxpoints[2] > myxpoints[3] ) dx = -1; else dx =0; if (dx==0) dy =1; else dy = (myypoints[3]-myypoints[2])/(myxpoints[3]-myxpoints[2])*dx+1; for(j=myxpoints[2], k=myypoints[2] ; k<=myypoints[3]; k+=dy) { iPixel = iPixels[k*512+j]; iRed = (iPixel >> 16) & 0xff; iGreen = (iPixel >> 8) & 0xff; iBlue = iPixel & 0xff; if (iRed == 255 && iGreen == 0 && iBlue == 0) {System.out.println( "right hit obs"); return false;} j += dx; } // from myxpoints[3] to myxpoints[0], up line; if (myypoints[3] < myypoints[0] ) dy = 1; if (myypoints[3] > myypoints[0] ) dy = -1; else dy =0; if (dy==0) dx =1; else dx = (myxpoints[0]-myxpoints[3])/(myypoints[0]-myypoints[3])*dy+1; for(j=myxpoints[3], k=myypoints[3] ; j<=myxpoints[0]; j+=dx) { iPixel = iPixels[k*512+j]; iRed = (iPixel >> 16) & 0xff; iGreen = (iPixel >> 8) & 0xff; iBlue = iPixel & 0xff; if (iRed == 255 && iGreen == 0 && iBlue == 0) {System.out.println( "up hit obs"); return false;} k += dy; } // else then rotate succesfully; angle = angle_tmp; mX = myxpoints[0]; mY = myypoints[0]; for (i=0;i<4;i++) { this.body.xpoints[i] = myxpoints[i]; this.body.ypoints[i] = myypoints[i]; } mApplet.repaint(); return (true); } return false; } public boolean contains(int x, int y) { if( (x>=mX) && (x<=mX+mWidth) && (y>=mY) && (y<=mY+mHeight)) return true; else return false; } public void show(Graphics g) { try { Thread.sleep(1); } catch (InterruptedException e) { } g.fillPolygon(body); } }