Ignore:
Timestamp:
2013-09-24T00:51:57+02:00 (11 years ago)
Author:
oliverw
Message:

[josm_elevationprofile]: Speed up painting / render as lines (fix #josm8080)

Location:
applications/editors/josm/plugins/ElevationProfile/src/org/openstreetmap/josm/plugins/elevation
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/ElevationProfile/src/org/openstreetmap/josm/plugins/elevation/ElevationProfilePlugin.java

    r29921 r29950  
    5656            createColorMaps();
    5757           
    58             MainMenu.add(Main.main.menu.viewMenu, action, false, 0);
     58            // TODO: Disable this view as long as it is not stable
     59            //MainMenu.add(Main.main.menu.viewMenu, action, false, 0);
    5960        } catch (Exception e1) {
    6061            System.err.println("Init of ElevationProfilePlugin failed: " + e1);
  • applications/editors/josm/plugins/ElevationProfile/src/org/openstreetmap/josm/plugins/elevation/gui/DefaultElevationProfileRenderer.java

    r29949 r29950  
    1515package org.openstreetmap.josm.plugins.elevation.gui;
    1616
     17import java.awt.BasicStroke;
    1718import java.awt.Color;
    1819import java.awt.GradientPaint;
    1920import java.awt.Graphics;
    2021import java.awt.Graphics2D;
     22import java.awt.MultipleGradientPaint.CycleMethod;
    2123import java.awt.Point;
    2224import java.awt.RadialGradientPaint;
     
    2426import java.awt.RenderingHints;
    2527import java.awt.Shape;
    26 import java.awt.MultipleGradientPaint.CycleMethod;
     28import java.awt.Stroke;
    2729import java.awt.geom.AffineTransform;
    2830import java.awt.geom.Point2D;
     
    5355         */
    5456        private static final int BASIC_WPT_RADIUS = 1;
    55         private static final int REGULAR_WPT_RADIUS = BASIC_WPT_RADIUS * 4;
    56         private static final int BIG_WPT_RADIUS = BASIC_WPT_RADIUS * 8;
     57        private static final int BIG_WPT_RADIUS = BASIC_WPT_RADIUS * 16;
    5758
    5859        // predefined colors
     
    107108                        return Color.getHSBColor(0, 1.0f, 1.0f); // red
    108109                case ElevationGainLow:
    109                         return Color.getHSBColor(0.3f, 0.5f, 1.0f); // green with low sat
     110                        return Color.getHSBColor(0.3f, 0.7f, 1.0f); // green with low sat
    110111                case ElevationLossLow:
    111                         return Color.getHSBColor(0, 0.5f, 1.0f); // red with low sat
     112                        return Color.getHSBColor(0, 0.7f, 1.0f); // red with low sat
    112113                case FullHour:
    113114                        return MARKER_POINT;
     
    116117                case MinElevation:
    117118                        return LOW_COLOR;
    118 
    119119                case StartPoint:
    120120                        return START_COLOR;
    121121                case EndPoint:
    122122                        return END_POINT;
    123                 default:
     123                default:                   
    124124                    break;
    125125                }
     
    165165                }
    166166        }
     167       
     168        /* (non-Javadoc)
     169         * @see org.openstreetmap.josm.plugins.elevation.gui.IElevationProfileRenderer#renderWayPoints(java.awt.Graphics, org.openstreetmap.josm.plugins.elevation.gpx.IElevationProfile, org.openstreetmap.josm.gui.MapView, org.openstreetmap.josm.data.gpx.WayPoint, org.openstreetmap.josm.data.gpx.WayPoint)
     170         */
     171        @Override
     172        public void renderLine(Graphics g, IElevationProfile profile,
     173                MapView mv, WayPoint wpt1, WayPoint wpt2, ElevationWayPointKind kind) {
     174           
     175                CheckParameterUtil.ensureParameterNotNull(g, "graphics");
     176                CheckParameterUtil.ensureParameterNotNull(profile, "profile");
     177                CheckParameterUtil.ensureParameterNotNull(mv, "map view");
     178               
     179                if (wpt1 == null || wpt2 == null) {
     180                        System.err.println(String.format(
     181                                        "Cannot paint line: mv=%s, prof=%s, kind = %s", mv, profile, kind));                   
     182                        return;
     183                }
     184               
     185                // obtain and set color
     186                g.setColor(getColorForWaypoint(profile, wpt2, kind));
     187               
     188                // transform to view
     189                Point pnt1 = mv.getPoint(wpt1.getEastNorth());
     190                Point pnt2 = mv.getPoint(wpt2.getEastNorth());
     191               
     192                // use thick line, if possible
     193                if (g instanceof Graphics2D) {
     194                    Graphics2D g2 = (Graphics2D) g;
     195                    Stroke oldS = g2.getStroke();
     196                    try {
     197                        g2.setStroke(new BasicStroke(3, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
     198                        g2.drawLine(pnt1.x, pnt1.y, pnt2.x, pnt2.y);
     199                    } finally {
     200                        // must be restored; otherwise other layers may using this style, too
     201                        g2.setStroke(oldS);
     202                    }
     203                } else {
     204                    // only poor man's graphics
     205                    g.drawLine(pnt1.x, pnt1.y, pnt2.x, pnt2.y);
     206                }
     207        }
    167208
    168209        /**
     
    184225
    185226                Color c = getColorForWaypoint(profile, wpt, kind);
    186 
    187                 if (c == null) {
    188                         System.err.println(String.format(
    189                                         "Cannot determine color: mv=%s, prof=%s, wpt=%s", mv,
    190                                         profile, wpt));
    191                 }
    192 
    193227                Point pnt = mv.getPoint(wpt.getEastNorth());
    194                 int rad = REGULAR_WPT_RADIUS;
    195                 int r2 = REGULAR_WPT_RADIUS / 2;
    196228               
    197                 g.setColor(c);
    198                 g.fillOval(pnt.x - r2, pnt.y - r2, rad, rad);
    199 
    200229                /* Paint full hour label */
    201230                if (kind == ElevationWayPointKind.FullHour) {
     
    547576                // nothing to do currently
    548577        }
     578
     579       
    549580}
  • applications/editors/josm/plugins/ElevationProfile/src/org/openstreetmap/josm/plugins/elevation/gui/ElevationProfileDialog.java

    r29948 r29950  
    118118                               
    119119                JPanel dataPanel = new JPanel();
    120                 GridLayout gridLayout = new GridLayout(3, 6);
     120                GridLayout gridLayout = new GridLayout(2, 6);
    121121                dataPanel.setLayout(gridLayout);
    122122
  • applications/editors/josm/plugins/ElevationProfile/src/org/openstreetmap/josm/plugins/elevation/gui/ElevationProfileLayer.java

    r29949 r29950  
    2727import org.openstreetmap.josm.data.gpx.WayPoint;
    2828import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
    29 import org.openstreetmap.josm.data.projection.Projection;
    3029import org.openstreetmap.josm.gui.MapView;
    3130import org.openstreetmap.josm.gui.dialogs.LayerListPopup;
     
    3635import org.openstreetmap.josm.tools.ImageProvider;
    3736
    38 import sun.java2d.loops.FillRect;
    39 
    4037/**
    4138 * Layer class to show additional information on the elevation map, e. g. show
     
    163160        WayPoint lastWpt = null;
    164161
    165 
    166162        renderer.beginRendering();
     163       
    167164        if (profile != null) {
    168165            // choose smaller font
     
    172169
    173170            try {
    174                 int npts = 0;
    175171                // paint way points one by one
    176172                for (WayPoint wpt : profile.getWayPoints()) {
     
    178174                        // determine way point
    179175                        ElevationWayPointKind kind = classifyWayPoint(lastWpt, wpt);
    180 
    181                         // render way point
     176                        // render way point as line
     177                        renderer.renderLine(g, profile, mv, lastWpt, wpt, kind);
     178                        // render single way point
    182179                        renderer.renderWayPoint(g, profile, mv, wpt, kind);
    183                         npts++;
    184180                    } // else first way point -> is paint later
    185181
    186                     // remember some things for next iteration
     182                    // remember last wpt for next iteration
    187183                    lastWpt = wpt;
    188184                }
    189185
    190                 System.out.println("Rendered " + npts + ", " + profile.getWayPoints().size());
    191186                // now we paint special way points in emphasized style
    192187
     
    249244            if (actEle > lastEle) { // we went uphill?
    250245                // TODO: Provide parameters for high/low thresholds
    251                 if (slope > 3) kind =ElevationWayPointKind.ElevationGainLow;
     246                if (slope > 2) kind =ElevationWayPointKind.ElevationGainLow;
    252247                if (slope > 10) kind =ElevationWayPointKind.ElevationGainHigh;
    253248            } else {
    254                 if (slope > 3) kind =ElevationWayPointKind.ElevationLossLow;
     249                if (slope > 2) kind =ElevationWayPointKind.ElevationLossLow;
    255250                if (slope > 10) kind =ElevationWayPointKind.ElevationLossHigh;
    256251            }
     
    268263    @Override
    269264    public void visitBoundingBox(BoundingXYVisitor v) {
    270         // TODO Auto-generated method stub
     265        // What to do here?     
    271266    }
    272267
  • applications/editors/josm/plugins/ElevationProfile/src/org/openstreetmap/josm/plugins/elevation/gui/IElevationProfileRenderer.java

    r29948 r29950  
    4444        /**
    4545         * Renders the way point with the lowest elevation.
     46         *
    4647         * @param g The graphics context.
    4748         * @param profile The elevation profile that contains the way point.
     49         * @param mv the associated view
    4850         * @param wpt The way point to render.
    49          * @param kind The way point kind (see {@link ElevationWayPointKind}).   
     51         * @param kind The way point kind (see {@link ElevationWayPointKind}).
    5052         */
    5153        void renderWayPoint(Graphics g, IElevationProfile profile, MapView mv, WayPoint wpt, ElevationWayPointKind kind);
     54       
     55        /**
     56         * Render line between two way points. This is intended to render speed or slope.
     57         *
     58         * @param g The graphics context.
     59         * @param profile The elevation profile that contains the way point.
     60         * @param mv the associated view
     61         * @param wpt1 the first way point
     62         * @param wpt2 the second way point
     63         */
     64        void renderLine(Graphics g, IElevationProfile profile, MapView mv, WayPoint wpt1, WayPoint wpt2, ElevationWayPointKind kind);
    5265       
    5366        /**
Note: See TracChangeset for help on using the changeset viewer.