//team crater 1.124 class project, Dec 04, 1997 import java.util.*; import java.applet.Applet; import java.io.*; import java.awt.event.*; import java.awt.*; import java.awt.image.*; public class MarsRover extends Applet implements Runnable { TextArea outputMessage; TextField gemValueOutput; Button startButton,stopButton,resetButton; Image bgImage; static Rover mRover; RoverCanvas roverCanvas; Thread runner = null; int canvasWidth = 512; int canvasHeight = 512; int total_gem_value = 0; int command[] = new int[6000]; int k,stop_point=0; ImageProcessor imageProcessor; int[] gemList, gemValueList, obstacleList; FindPath foo = new FindPath(); public MarsRover(){ setLayout(new BorderLayout()); setFont(new Font("Helvetica", Font.PLAIN, 14)); Panel controlPanel = new Panel(); controlPanel.setLayout(new GridLayout(1,0)); startButton = new Button("Start"); stopButton = new Button("Stop"); resetButton = new Button("Reset"); controlPanel.add(startButton); controlPanel.add(stopButton); controlPanel.add(resetButton); add("North",controlPanel); outputMessage = new TextArea(20,0); outputMessage.setBackground(Color.white); outputMessage.setEditable(false); add("South",outputMessage); // add roverCanvas latter in init() } public void init(){ bgImage = Toolkit.getDefaultToolkit().getImage("mars.gif"); mRover = new Rover(this); imageProcessor=new ImageProcessor(this,bgImage,canvasWidth,canvasHeight); //add canvasPanel Panel canvasPanel = new Panel(); GridBagLayout gridBag = new GridBagLayout(); canvasPanel.setLayout(gridBag); GridBagConstraints c = new GridBagConstraints(); c.anchor = GridBagConstraints.CENTER; c.gridwidth = GridBagConstraints.REMAINDER; c.fill = GridBagConstraints.HORIZONTAL; roverCanvas = new RoverCanvas(this,bgImage,mRover,canvasWidth,canvasHeight); gridBag.setConstraints(roverCanvas,c); canvasPanel.add(roverCanvas); c.gridwidth = 1; c.gridheight = 1; Label label = new Label("Total gem values = "); gridBag.setConstraints(label,c); canvasPanel.add(label); c.weightx = 0.0; c.anchor = GridBagConstraints.WEST; c.fill = GridBagConstraints.NONE; c.gridwidth = GridBagConstraints.REMAINDER; gemValueOutput = new TextField("0",15); gemValueOutput.setEditable(false); gridBag.setConstraints(gemValueOutput,c); canvasPanel.add(gemValueOutput); add("Center",canvasPanel); } public void fire(){ if (runner == null){ runner = new Thread(this); runner.setPriority(Thread.MIN_PRIORITY); runner.start(); } } public void run(){ k=stop_point; if (runner==null) System.out.println("runner=null"); imageProcessor.imageScanner(); //imageProcessor.outputToFile(); gemValueList = imageProcessor.gemValueLister(); roverCanvas.first_time_paint = false; //This native code foo.findPaths(imageProcessor.obstacleLister(), imageProcessor.gemLister(), command); while (runner != null) { if(command[k]==10) { k++; total_gem_value+=gemValueList[command[k]]; postMessage("Got one! The value is "+gemValueList[command[k]]); postGemValue(total_gem_value); } else if (command[k] == -1) { roverCanvas.final_announcement = true; roverCanvas.repaint(); postMessage("Mission Completed"); runner.stop(); runner=null; } else { mRover.move(command[k]); if(command[k] == 8 || command[k] == 9) roverCanvas.rotate_flag = true; roverCanvas.repaint(); try { Thread.sleep(5); } catch (InterruptedException e){ } } k++; } } public boolean action(Event e, Object obj) { if (obj.equals("Start")) { fire(); } else if (obj.equals("Stop")) { if(runner != null) { runner.stop(); runner = null; stop_point=k; } } else if (obj.equals("Reset")){ if(runner != null){ runner.stop(); runner = null; } stop_point = 0; total_gem_value = 0; roverCanvas.bgdraw = true; roverCanvas.bgdrawcomplete = true; roverCanvas.first_time_paint = true; roverCanvas.rotate_flag = false; roverCanvas.final_announcement = false; postGemValue(0); mRover.rover_x[0]=0; mRover.rover_x[1]=0; mRover.rover_x[2]=29; mRover.rover_x[3]=29; mRover.rover_y[0]=0; mRover.rover_y[1]=19; mRover.rover_y[2]=19; mRover.rover_y[3]=0; roverCanvas.repaint(); } return true; } public void postMessage(String message){ outputMessage.append(message+"\n"); } public void postGemValue(int value){ String str = value+""; gemValueOutput.setText(str); } public static void main(String args[]){ MarsRover marsApplet = new MarsRover(); new MainWindow(marsApplet,600,800); } } class MainWindow extends Frame{ MainWindow(MarsRover marsApplet,int iWidth,int iHeight){ setSize(iWidth,iHeight); setTitle(marsApplet.getClass().getName()); enableEvents(AWTEvent.WINDOW_EVENT_MASK); add("Center",marsApplet); marsApplet.init(); marsApplet.start(); show(); } public void processWindowEvent(WindowEvent event) { if (event.getID() == WindowEvent.WINDOW_CLOSING) { System.exit(0); } } } class RoverCanvas extends Canvas{ MarsRover roverApplet; static Rover rover; static int mWidth,mHeight; static Image bgImage; static public boolean bgdraw = true; static public boolean bgdrawcomplete = false; public boolean first_time_paint = true; public boolean rotate_flag = false; public boolean final_announcement = false; public RoverCanvas(MarsRover roverApplet,Image image,Rover rover, int iWidth,int iHeight) { mWidth = iWidth; mHeight = iHeight; this.roverApplet = roverApplet; this.rover = rover; bgImage = image; } public Dimension minimumSize() { return new Dimension(mWidth,mHeight); } public Dimension preferredSize() { return minimumSize(); } public void update(Graphics g) { if (bgdraw) { g.drawImage(bgImage,0,0,this); bgdraw = false; } if (bgdrawcomplete) { int x_vertex[] = new int[4]; int y_vertex[] = new int[4]; g.setColor(Color.black); x_vertex[0] = (int)rover.rover_x[0]; x_vertex[1] = (int)rover.rover_x[1]; x_vertex[2] = (int)rover.rover_x[2]; x_vertex[3] = (int)rover.rover_x[3]; y_vertex[0] = (int)rover.rover_y[0]; y_vertex[1] = (int)rover.rover_y[1]; y_vertex[2] = (int)rover.rover_y[2]; y_vertex[3] = (int)rover.rover_y[3]; Polygon poly=new Polygon(x_vertex,y_vertex,4); if(first_time_paint || rotate_flag) { g.fillPolygon(poly); rotate_flag = false; } else if(final_announcement) // from jyu { g.setFont(new Font("Helvetica", Font.BOLD, 30)); g.setColor(Color.white); g.drawString("Mission Complete",mWidth/4,mHeight/2); } else g.fillPolygon(poly); } } public void paint(Graphics g) { bgdraw = true; update(g); } public synchronized boolean imageUpdate(Image image,int flags, int x,int y,int w,int h){ boolean done = ((flags & ALLBITS) !=0); if(done){ if(image == bgImage){ roverApplet.postMessage("Finish loading background image"); bgdrawcomplete = true; bgdraw = true; repaint(); //roverApplet.fire(); } } return !done; } } class Rover { MarsRover marsApplet; public float rover_x[]={0,0,29,29}; public float rover_y[]={0,19,19,0}; float x_c,y_c; float local_x[]={0f,0f,0f,0f}; float local_y[]={0f,0f,0f,0f}; final float cos_five_deg = (float)Math.cos(5.0*Math.PI/180.0); final float sin_five_deg = (float)Math.sin(5.0*Math.PI/180.0); public Rover(MarsRover applet) { marsApplet = applet; x_c=y_c=0f; } public void move(int i){ int j; switch (i) { case 0: for(j=0;j<4;j++) rover_x[j]+=1; break; case 1: for(j=0;j<4;j++){ rover_x[j]+=1; rover_y[j]-=1; } break; case 2: for(j=0;j<4;j++){ rover_y[j]-=1; } break; case 3: for(j=0;j<4;j++){ rover_x[j]-=1; rover_y[j]-=1; } break; case 4: for(j=0;j<4;j++){ rover_x[j]+=-1; } break; case 5: for(j=0;j<4;j++){ rover_x[j]-=1; rover_y[j]+=1; } break; case 6: for(j=0;j<4;j++){ rover_y[j]+=1; } break; case 7: for(j=0;j<4;j++){ rover_x[j]+=1; rover_y[j]+=1; } break; case 8: rotate(5); break; case 9: rotate(-5); break; default: System.out.println("Command code out of range!"); System.out.println("Command = "+i); } } public void rotate(int theta){ int j; float cos_theta = (float)Math.cos(theta*Math.PI/180.0); float sin_theta = (float)Math.sin(theta*Math.PI/180.0); x_c=0.25f*(float)(rover_x[0]+rover_x[1]+rover_x[2]+rover_x[3]); y_c=0.25f*(float)(rover_y[0]+rover_y[1]+rover_y[2]+rover_y[3]); for(j=0;j<4;j++){ local_x[j]=(float)rover_x[j]-x_c; local_y[j]=(float)rover_y[j]-y_c; } for(j=0;j<4;j++){ rover_x[j]=x_c+cos_theta*local_x[j]-sin_theta*local_y[j]; rover_y[j]=y_c+sin_theta*local_x[j]+cos_theta*local_y[j]; } } }