package nbtool.gui.field; import java.awt.*; import java.awt.geom.*; import java.lang.Math; import nbtool.data.NBitesTeamBroadcast; public class NaoRobot { private final static float naoRobotSize = 15.f; private final static int playerNumberOffset = 10; double halfViewAngle = Math.toRadians(31); public int fieldWalkingToX, fieldWalkingToY, playerNumber, fieldBallX, fieldBallY, fieldSharedBallX, fieldSharedBallY; public float fieldX,fieldY,fieldH,fieldXDist,fieldYDist,fieldKickDestX, fieldKickDestY, radius; int screenX, screenY, screenKickDestX, screenKickDestY,screenWalkingToX, screenWalkingToY, screenBallX, screenBallY,screenSharedBallX, screenSharedBallY, ballDist; float screenXDist, screenYDist, screenH, ballBearing; public boolean in_kicking_state = false; public boolean seeing_ball = false; public boolean fallen = false; public boolean sharedBall = false; protected Color naoColor; float TO_RAD = (float) (Math.PI/180); public NaoRobot() { screenX = 0; screenY = 0; setRadiusAndColor(); } NaoRobot(float xCoord, float yCoord) { screenX = (int) xCoord; screenY = (int) yCoord; screenH = 0.0f; setRadiusAndColor(); } NaoRobot(float xCoord, float yCoord, float heading) { screenX = (int) xCoord; screenY = (int) yCoord; screenH = -heading; setRadiusAndColor(); } public void setRadiusAndColor() { radius = naoRobotSize; naoColor = Color.cyan; } public void drawNaoLoc(Graphics2D g2, boolean shouldFlip) { if(shouldFlip) { screenX = (int) (FieldConstants.FIELD_WIDTH-screenX); screenH = (float) (Math.PI+screenH); } else { screenY = (int) (FieldConstants.FIELD_HEIGHT-screenY); } g2.setColor(naoColor); g2.fill(new Ellipse2D.Float(screenX-naoRobotSize/2, screenY-naoRobotSize/2, naoRobotSize, naoRobotSize)); //heading g2.setColor(Color.black); g2.setStroke(new BasicStroke(3)); int xDist = (int)(20 * Math.cos(screenH)+screenX); int yDist = (int)(20 * Math.sin(screenH)+screenY); g2.drawLine((int)screenX,(int)(screenY),xDist,yDist); //field of view g2.setColor(Color.red); g2.setStroke(new BasicStroke(2)); //right xDist = (int)(20 * Math.cos(screenH+halfViewAngle)+screenX); yDist = (int)(20 * Math.sin(screenH+halfViewAngle)+screenY); g2.drawLine((int)screenX,(int)screenY,xDist,yDist); //left xDist = (int)(20 * Math.cos(screenH-halfViewAngle)+screenX); yDist = (int)(20 * Math.sin(screenH-halfViewAngle)+screenY); g2.drawLine((int)screenX,(int)screenY,xDist,yDist); } public void drawNaoWV(Graphics2D g2, boolean shouldFlip) { if(shouldFlip) { screenX = (int) (FieldConstants.FIELD_WIDTH-fieldX); screenY = (int) fieldY; screenH = (float) (180+fieldH); screenKickDestX = (int) (FieldConstants.FIELD_WIDTH-fieldKickDestX); screenKickDestY = (int) fieldKickDestY; screenWalkingToX = (int) (FieldConstants.FIELD_WIDTH-fieldWalkingToX); screenWalkingToY = (int) fieldWalkingToY; } else { screenX = (int) fieldX; screenY = (int) (FieldConstants.FIELD_HEIGHT- fieldY); screenH = fieldH; screenKickDestX = (int) fieldKickDestX; screenKickDestY = (int) (FieldConstants.FIELD_HEIGHT-fieldKickDestY); screenWalkingToX = (int) fieldWalkingToX; screenWalkingToY = (int) (FieldConstants.FIELD_HEIGHT-fieldWalkingToY); } g2.setColor(naoColor); g2.fill(new Ellipse2D.Float(screenX-naoRobotSize/2, screenY-naoRobotSize/2, naoRobotSize, naoRobotSize)); //heading g2.setColor(Color.black); g2.setStroke(new BasicStroke(3)); screenXDist = (float)(20 * Math.cos(TO_RAD*screenH)+screenX); screenYDist = (float)(20 * Math.sin(TO_RAD*screenH)+screenY); g2.draw(new Line2D.Float(screenX, screenY, screenXDist, screenYDist)); //field of view g2.setColor(Color.red); g2.setStroke(new BasicStroke(2)); //right screenXDist = (float)(20 * Math.cos(TO_RAD*screenH+halfViewAngle)+screenX); screenYDist = (float)(20 * Math.sin(TO_RAD*screenH+halfViewAngle)+screenY); g2.draw(new Line2D.Float(screenX, screenY, screenXDist, screenYDist)); //left screenXDist = (float)(20 * Math.cos(TO_RAD*screenH-halfViewAngle)+screenX); screenYDist = (float)(20 * Math.sin(TO_RAD*screenH-halfViewAngle)+screenY); g2.draw(new Line2D.Float(screenX, screenY, screenXDist, screenYDist)); //player number g2.setColor(naoColor); g2.drawString(Integer.toString(playerNumber), screenX+playerNumberOffset, screenY-playerNumberOffset); //where am i kicking g2.setColor(Color.blue); if(!in_kicking_state) { screenKickDestX = (int)screenX; screenKickDestY = (int)screenY; } g2.draw(new Line2D.Float(screenX,screenY,screenKickDestX,screenKickDestY)); //where am i walking g2.setColor(Color.red); if(!fallen) { screenWalkingToX = (int)screenX; screenWalkingToY = (int)screenY; } g2.drawLine((int)screenX,(int)screenY,screenWalkingToX,screenWalkingToY); //where is my ball g2.setColor(Color.orange); if(seeing_ball) { Point ballCenter = new Point((int)(screenX+ballDist*Math.cos(TO_RAD*screenH+TO_RAD*ballBearing)), (int)(screenY-ballDist*Math.sin(TO_RAD*screenH+TO_RAD*ballBearing))); g2.fill(new Ellipse2D.Double(ballCenter.x, ballCenter.y, 8, 8)); g2.drawString(Integer.toString(playerNumber), ballCenter.x+1, ballCenter.y-1); } //where is my shared ball | only for player 4&5: chasers g2.setColor(new Color(204,0,100)); if(sharedBall) { g2.fill(new Ellipse2D.Double(screenSharedBallX-4, screenSharedBallY-4,8,8)); g2.drawString(Integer.toString(playerNumber), screenSharedBallX+1, screenSharedBallX-1); } } public void wvNao(NBitesTeamBroadcast tb) { fieldX = tb.dataWorldModel.getMyX(); fieldY = tb.dataWorldModel.getMyY(); fieldH = -tb.dataWorldModel.getMyH(); playerNumber = tb.dataTeamPacket.getPlayerNumber(); if(tb.dataWorldModel.getFallen()) { naoColor = Color.red; } else { naoColor = Color.cyan; } if(tb.dataWorldModel.getInKickingState()) { in_kicking_state = true; fieldKickDestX = (int)tb.dataWorldModel.getKickingToX(); fieldKickDestY = (int)tb.dataWorldModel.getKickingToY(); } if(!tb.dataWorldModel.getFallen()) { fallen = true; fieldWalkingToX = (int)tb.dataWorldModel.getWalkingToX(); fieldWalkingToY = (int)tb.dataWorldModel.getWalkingToY(); } if(tb.dataWorldModel.getBallOn()) { seeing_ball = true; ballDist = (int) tb.dataWorldModel.getBallDist(); ballBearing = (int) tb.dataWorldModel.getBallBearing(); } } public void wvSharedBall(NBitesTeamBroadcast tb) { sharedBall = true; float sinHB, cosHB; float hb = TO_RAD*fieldH+TO_RAD*tb.dataWorldModel.getBallBearing(); sinHB = (float) Math.sin(hb); cosHB = (float) Math.cos(hb); float newBallX = fieldX + tb.dataWorldModel.getBallDist()*cosHB; float newBallY = fieldY + tb.dataWorldModel.getBallDist()*sinHB; fieldBallX = (int) newBallX; fieldBallY = (int) newBallY; } public void moveTo(float xCoord, float yCoord, float heading) { screenX = (int)xCoord; screenY = (int)yCoord; screenH = -heading; } public float getX() { return fieldX; } public float getY() { return fieldY; } public float getH() { return fieldH; } }