package metrobotics; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.Shape; import java.awt.Stroke; import java.awt.Toolkit; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.geom.AffineTransform; import java.awt.geom.Path2D; import java.util.ArrayList; import javax.swing.BorderFactory; import javax.swing.JLabel; import javax.swing.JPanel; /** * @author Pablo Munoz - Metrobotics * */ public class Grid extends JPanel{ //Path2D.Double arrow = createArrow(); JLabel robotInUse; ArrayList<Robot> robots; int numRobots; Path2D.Double [] arrows; AffineTransform [] at; Shape [] shapes; Image [] robotImages; private Rectangle[] rectangles; Graphics2D g2; final int ratioPixelsMeters = 60; Grid(final JLabel robotInUse, final ArrayList<Robot> robots){ super(); this.robotInUse = robotInUse; this.robots = robots; this.numRobots = robots.size(); setBackground(Color.white); //Toolkit tk = Toolkit.getDefaultToolkit(); int Width = 750; //(int)(tk.getScreenSize().getWidth() * 0.40); //0.80); int Height = 325; //(int)(tk.getScreenSize().getHeight() * 0.30); //60); double ratioPixelsMeters = 60; Dimension d = new Dimension(Width, Height); setPreferredSize(d); setBorder(BorderFactory.createRaisedBevelBorder()); //robotImages = new Image[robots.size()]; // for(int i = 0; i<numRobots; i++){ // rectangles[i] = new Rectangle(10, 10); // } } protected void paintComponent(Graphics g) { super.paintComponent(g); g2 = (Graphics2D)g; //g2.translate(this.getWidth()/2, this.getHeight()/2); // New Origin //g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, // RenderingHints.VALUE_ANTIALIAS_ON); // PAblo is checking the limits for the DEMO g2.setStroke(new BasicStroke((float) 4)); g2.setColor(Color.green); g2.drawLine(0, 0, 0, 325); // 1 because... g2.drawLine(0, 325, 500, 325); g2.drawLine(500, 325, 500, 0); g2.drawLine(500, 0, 0, 0); g2.setStroke(new BasicStroke((float) 0.5)); g2.setColor(Color.black); drawGrid(g2); int i=0; if(Gui.debug){ System.out.println("In Grid. Num of robots " + robots.size()); } rectangles = new Rectangle[robots.size()]; // This rectangles are used to grab the robot from the map. at = new AffineTransform[robots.size()]; for (Robot x : robots){ // TODO: // Rotate from center of the image. if(Gui.debug){ System.out.println("Repainting robots in Grid: i " + i + " x " + x.getGridX() + " y " + x.getGridY() + " Theta " + x.getGridTheta() + " Confidence " + x.getConfidence()); } at[i] = AffineTransform.getTranslateInstance(x.getGridX()*ratioPixelsMeters, (this.getHeight()-x.getGridY()*ratioPixelsMeters)); //*50); at[i].rotate(-x.getGridTheta()); //Math.toRadians((-x.getGridTheta()))); rectangles[i] = new Rectangle((int)x.getGridX()*ratioPixelsMeters-40, (int) (this.getHeight()-x.getGridY())*ratioPixelsMeters-40, 80, 80); //g2.draw(rectangles[i]); g2.drawImage(x.getRobotGridImage(), at[i], this); String name = x.getName() + " x: " + x.getGridX() + " y: " + x.getGridY() + " theta: " + x.getGridTheta() + " confidence: " + x.getConfidence(); if(name!=null){ System.out.println("Printing coordinates"); g2.drawString(name, (int)x.getGridX()*ratioPixelsMeters + 20, (int)(this.getHeight()-(x.getGridY()*ratioPixelsMeters)) + 30); //*50; } i++; } //doSomething = false; addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { int i =0; for(Robot x : robots){ if(rectangles[i].contains(e.getX(), e.getY())){ robotInUse.setText(x.getName()); Robot.setRobotInUse(i); } else{ //robotInUse.setText(shapes[i].getBounds().x + " " + shapes[i].getBounds().y + " " + shapes[i].getBounds().width + " " + shapes[i].getBounds().height); } i++; } } }); } private void drawGrid(Graphics2D g2) { // TODO Auto-generated method stub Stroke s = g2.getStroke(); g2.setStroke(new BasicStroke((float) 0.5)); for(int i=0; i<this.getWidth(); i++){ g2.setColor(Color.blue); if(i%40==0){ g2.drawLine(i, 0, i, this.getHeight()); } } for(int i=0; i<this.getHeight(); i++){ g2.setColor(Color.blue); if(i%40==0){ g2.drawLine(0, i, this.getWidth(), i); } } // Back to old stroke g2.setStroke(s); } private Path2D.Double createArrow() { int length = 25; int barb = 15; double angle = Math.toRadians(20); Path2D.Double path = new Path2D.Double(); path.moveTo(-length/2, 0); path.lineTo(length/2, 0); double x = length/2 - barb*Math.cos(angle); double y = barb*Math.sin(angle); path.lineTo(x, y); x = length/2 - barb*Math.cos(-angle); y = barb*Math.sin(-angle); path.moveTo(length/2, 0); path.lineTo(x, y); return path; } }