[rcpilot-cvs] src/rcpilot/rcgs RcgsMap.java,1.10,1.11
Status: Beta
Brought to you by:
mjpawlowsky
From: Chris S. <cm...@us...> - 2004-06-28 08:36:06
|
Update of /cvsroot/rcpilot/src/rcpilot/rcgs In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv21206/rcpilot/rcgs Modified Files: RcgsMap.java Log Message: 1. replaced MediaTracker usage with ImageIcon(filename) (this uses mediatracker internally so it is less work for us) 2. replaced some literals with named constants 3. broke out plane/home drawing into their own methods for cleanliness 4. eliminated flicker/flash when pressing scroll/zoom buttons. Index: RcgsMap.java =================================================================== RCS file: /cvsroot/rcpilot/src/rcpilot/rcgs/RcgsMap.java,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** RcgsMap.java 28 Jun 2004 04:53:13 -0000 1.10 --- RcgsMap.java 28 Jun 2004 08:35:57 -0000 1.11 *************** *** 61,64 **** --- 61,69 ---- private static final String SCROLL_LEFT_IMAGE_PATH = "res/icons/scroll_left.jpg"; + private static final int H_ASEC_PER_DEGREE = 360000; // to hundredth asec + private static final int H_ASEC_PER_MILE_LAT = 5186; // to hundredth asec + private static final int EARTH_MILE_CIRCUMF = 24988; // miles + private static final int EARTH_ASEC_CIRCUMF = 129600000; // asecs + private Image mapImg, displayImg; *************** *** 74,78 **** private double Hscale; private double Vscale; ! // GPS stats for image loaded from disk private long srcTopLatSecs; --- 79,86 ---- private double Hscale; private double Vscale; ! ! private double displayHscale; ! private double displayVscale; ! // GPS stats for image loaded from disk private long srcTopLatSecs; *************** *** 148,152 **** // add action commands - zoomPlusButton.addActionListener(this); zoomMinusButton.addActionListener(this); --- 156,159 ---- *************** *** 241,269 **** private boolean loadMapImage(String imagePath) { - MediaTracker tracker; - boolean rval = true; // assume load will succeed boolean imageExists = (new File(imagePath)).exists(); if(imageExists) { ! mapImg = Toolkit.getDefaultToolkit().getImage(imagePath); ! ! // use mediatracker to load image for us ! ! try { ! tracker = new MediaTracker(this); ! tracker.addImage(mapImg, 0); ! tracker.waitForAll(); ! ! if(tracker.isErrorAny()) { ! System.err.println("RcgsMap.java: Error code " + ! tracker.statusID(0,false) + ! " loading image " + imagePath); ! rval = false; // load failed ! } ! ! } catch ( Exception e ) { ! System.err.println("RcgsMap.java: Exception adding mapImg to tracker."); ! } } else { --- 248,258 ---- private boolean loadMapImage(String imagePath) { boolean rval = true; // assume load will succeed boolean imageExists = (new File(imagePath)).exists(); if(imageExists) { ! Image tempImg = Toolkit.getDefaultToolkit().getImage(imagePath); ! ImageIcon ii = new ImageIcon(tempImg); ! mapImg = ii.getImage(); } else { *************** *** 379,400 **** scrollLeftButton.setBounds(2,(getHeight()/2)-16,34,34); } protected void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D) g; - Shape plane, home; - int course = (int)Rcgs.tdata.getCourse(); - g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g2.setColor(UserPreferences.getVidColor()); - g2.fillRect(0,0,getWidth(),getHeight()); - // in hundredths of a second/pixel ! double displayHscale = Hscale / zoomLevel; ! double displayVscale = Vscale / zoomLevel; if(imgUpdateRequired) { --- 368,465 ---- scrollLeftButton.setBounds(2,(getHeight()/2)-16,34,34); } + + private void drawPlane(Graphics2D g) { + + // grab relevant data from telemetry object + + int course = (int)Rcgs.tdata.getCourse(); + int planeLatSecs = Rcgs.tdata.getGPSLatitude(); + int planeLonSecs = Rcgs.tdata.getGPSLongitude(); + + // calculate plane position on current display + + int planeLatPix = (int)((displayTopLatSecs-planeLatSecs)/displayVscale); + int planeLonPix = (int)((planeLonSecs-displayLeftLonSecs)/displayHscale); + + Shape plane = Shapes.getShapeIcon(Shapes.PLANE_SHAPE, planeLonPix, planeLatPix, course); + + g.setColor(Color.red); + g.fill(plane); + g.setColor(Color.black); + g.draw(plane); + } + + private void drawHome(Graphics2D g) { + + // grab relevant data from user preferences + + int homeLatSecs = UserPreferences.getHomeLatitude(); + int homeLonSecs = UserPreferences.getHomeLongitude(); + + // calculate home position on current display + + int homeLatPix = (int)((displayTopLatSecs-homeLatSecs)/displayVscale); + int homeLonPix = (int)((homeLonSecs-displayLeftLonSecs)/displayHscale); + + Shape home = Shapes.getShapeIcon(Shapes.HOME_SHAPE, homeLonPix, homeLatPix, 0); + + g.setColor(Color.green); + g.fill(home); + g.setColor(Color.black); + g.draw(home); + + g.setFont(new Font("Arial", Font.BOLD, 12)); + g.drawString("H",homeLonPix-3,homeLatPix+7); + + // calculate arcseconds/mile for this latitude + // so we can draw accurate 1,2,...,N mile radius + // arcs around home base. + + double homeLatDegrees = (double)homeLatSecs/H_ASEC_PER_DEGREE; + + double hAsecPerMileLon = EARTH_ASEC_CIRCUMF/(EARTH_MILE_CIRCUMF * + Math.cos(Math.toRadians(homeLatDegrees))); + + // number of pixels on each axis + // corresponding to one mile. + + double oneMileArcRadiusLat = H_ASEC_PER_MILE_LAT * (1/(double)displayVscale); + double oneMileArcRadiusLon = hAsecPerMileLon * (1/(double)displayHscale); + + // draw arcs around home + + g.setStroke(new BasicStroke(2)); + g.setColor(Color.red); + + for(int i = 0; i < 36; i++) { + g.draw(new Arc2D.Float(homeLonPix-(int)oneMileArcRadiusLon, + homeLatPix-(int)oneMileArcRadiusLat, + (int)(oneMileArcRadiusLon*2), // one mile diameter + (int)(oneMileArcRadiusLat*2), // ditto + i*10,5,Arc2D.OPEN)); + g.draw(new Arc2D.Float(homeLonPix-(int)(oneMileArcRadiusLon*2), + homeLatPix-(int)(oneMileArcRadiusLat*2), + (int)(oneMileArcRadiusLon*4), // 2 mile diameter + (int)(oneMileArcRadiusLat*4), // ditto + i*10,5,Arc2D.OPEN)); + g.draw(new Arc2D.Float(homeLonPix-(int)(oneMileArcRadiusLon*4), + homeLatPix-(int)(oneMileArcRadiusLat*4), + (int)(oneMileArcRadiusLon*8), // 4 mile diameter + (int)(oneMileArcRadiusLat*8), // ditto + i*10,5,Arc2D.OPEN)); + } + } protected void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D) g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // in hundredths of a second/pixel ! displayHscale = Hscale / zoomLevel; ! displayVscale = Vscale / zoomLevel; if(imgUpdateRequired) { *************** *** 418,422 **** FilteredImageSource fis = new FilteredImageSource(mapImg.getSource(), cif); ! displayImg = createImage(fis).getScaledInstance(getWidth(),getHeight(),Image.SCALE_FAST); imgUpdateRequired = false; --- 483,490 ---- FilteredImageSource fis = new FilteredImageSource(mapImg.getSource(), cif); ! // use an ImageIcon object to handle the mediatracker details for us ! Image tempImg = createImage(fis).getScaledInstance(getWidth(),getHeight(),Image.SCALE_FAST); ! ImageIcon ii = new ImageIcon(tempImg); ! displayImg = ii.getImage(); imgUpdateRequired = false; *************** *** 425,507 **** // Passing 'this' as last arg results in imageUpdate() method // being called repeatedly until image is fully loaded. This ! // way we can poll the loading process and make sure the image ! // is displayed. ! ! g2.drawImage(displayImg, 0,0,this); ! ! // calculate pixel locations for drawing graphics ! // over map. ! ! // in hundredths of a second ! int homeLatSecs = UserPreferences.getHomeLatitude(); ! int homeLonSecs = UserPreferences.getHomeLongitude(); ! ! int planeLatSecs = Rcgs.tdata.getGPSLatitude(); ! int planeLonSecs = Rcgs.tdata.getGPSLongitude(); ! ! // in pixels ! int homeLatPix = (int)((displayTopLatSecs-homeLatSecs)/displayVscale); ! int homeLonPix = (int)((homeLonSecs-displayLeftLonSecs)/displayHscale); ! ! int planeLatPix = (int)((displayTopLatSecs-planeLatSecs)/displayVscale); ! int planeLonPix = (int)((planeLonSecs-displayLeftLonSecs)/displayHscale); ! ! // draw plane ! plane = Shapes.getShapeIcon(Shapes.PLANE_SHAPE, planeLonPix, planeLatPix, course); ! ! g2.setColor(Color.red); ! g2.fill(plane); ! g2.setColor(Color.black); ! g2.draw(plane); ! ! // draw home ! ! // calculate arcseconds/mile for this latitude ! // so we can draw accurate 1,2,...,N mile radius ! // arcs around home base. ! ! double homeLatDegrees = (double)homeLatSecs/360000; ! ! double asecVPerMile = 5186; ! double asecHPerMile = 129600000/(24988*Math.cos(Math.toRadians(homeLatDegrees))); ! ! // number of pixels on each axis ! // corresponding to one mile. ! ! double oneMileArcVRadius = asecVPerMile * (1/(double)displayVscale); ! double oneMileArcHRadius = asecHPerMile * (1/(double)displayHscale); ! ! home = Shapes.getShapeIcon(Shapes.HOME_SHAPE, homeLonPix, homeLatPix, 0); ! ! g2.setColor(Color.green); ! g2.fill(home); ! g2.setColor(Color.black); ! g2.draw(home); ! ! g2.setFont(new Font("Arial", Font.BOLD, 12)); ! g2.drawString("H",homeLonPix-3,homeLatPix+7); ! // draw arcs around home ! g2.setStroke(new BasicStroke(2)); ! g2.setColor(Color.red); ! for(int i = 0; i < 36; i++) { ! g2.draw(new Arc2D.Float(homeLonPix-(int)oneMileArcHRadius, ! homeLatPix-(int)oneMileArcVRadius, ! (int)(oneMileArcHRadius*2), // one mile diameter ! (int)(oneMileArcVRadius*2), // ditto ! i*10,5,Arc2D.OPEN)); ! g2.draw(new Arc2D.Float(homeLonPix-(int)(oneMileArcHRadius*2), ! homeLatPix-(int)(oneMileArcVRadius*2), ! (int)(oneMileArcHRadius*4), // 2 mile diameter ! (int)(oneMileArcVRadius*4), // ditto ! i*10,5,Arc2D.OPEN)); ! g2.draw(new Arc2D.Float(homeLonPix-(int)(oneMileArcHRadius*4), ! homeLatPix-(int)(oneMileArcVRadius*4), ! (int)(oneMileArcHRadius*8), // 4 mile diameter ! (int)(oneMileArcVRadius*8), // ditto ! i*10,5,Arc2D.OPEN)); ! } } --- 493,505 ---- // Passing 'this' as last arg results in imageUpdate() method // being called repeatedly until image is fully loaded. This ! // way we can guarantee paint is called after image is loaded. ! g2.setColor(UserPreferences.getVidColor()); ! g2.fillRect(0,0,getWidth(),getHeight()); ! g2.drawImage(displayImg, 0,0,null); ! drawPlane(g2); ! drawHome(g2); } *************** *** 510,517 **** } - private void updateZoomDependantVariables() { - - } - private boolean increaseZoom() { boolean zoomPerformed = false; --- 508,511 ---- *************** *** 705,719 **** } - - public boolean imageUpdate(Image img, int infoflags, - int x, int y, int w, int h) { - if (infoflags != ALLBITS) - return true; - else { - repaint(); - return false; - } - } - public void componentResized(ComponentEvent e) { imgUpdateRequired = true; --- 699,702 ---- |