Ignore:
Timestamp:
2011-07-07T10:51:48+02:00 (13 years ago)
Author:
bastiK
Message:

applied #6540 (anonymous contribution) - New gps-trace coloring method: direction

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java

    r4143 r4207  
    7878import org.openstreetmap.josm.tools.ImageProvider;
    7979import org.openstreetmap.josm.tools.UrlLabel;
     80import org.openstreetmap.josm.tools.Utils;
    8081
    8182public class GpxLayer extends Layer {
     
    304305    }
    305306
    306     private static Color[] colors = new Color[256];
     307    private final static Color[] colors = new Color[256];
    307308    static {
    308309        for (int i = 0; i < colors.length; i++) {
     
    311312    }
    312313
     314    private final static Color[] colors_cyclic = new Color[256];
     315    static {
     316        for (int i = 0; i < colors_cyclic.length; i++) {
     317            //                    red   yellow  green   blue    red
     318            int[] h = new int[] { 0,    59,     127,    244,    360};
     319            int[] s = new int[] { 100,  84,     99,     100 };
     320            int[] b = new int[] { 90,   93,     74,     83 };
     321
     322            float angle = 4 - i / 256f * 4;
     323            int quadrant = (int) angle;
     324            angle -= quadrant;
     325            quadrant = Utils.mod(quadrant+1, 4);
     326
     327            float vh = h[quadrant] * w(angle) + h[quadrant+1] * (1 - w(angle));
     328            float vs = s[quadrant] * w(angle) + s[Utils.mod(quadrant+1, 4)] * (1 - w(angle));
     329            float vb = b[quadrant] * w(angle) + b[Utils.mod(quadrant+1, 4)] * (1 - w(angle));
     330
     331            colors_cyclic[i] = Color.getHSBColor(vh/360f, vs/100f, vb/100f);
     332        }
     333    }
     334
     335    /**
     336     * transition function:
     337     *  w(0)=1, w(1)=0, 0<=w(x)<=1
     338     * @param x number: 0<=x<=1
     339     * @return the weighted value
     340     */
     341    private static float w(float x) {
     342        if (x < 0.5) {
     343            return 1 - 2*x*x;
     344        } else {
     345        return 2*(1-x)*(1-x);
     346        }
     347    }
     348   
    313349    // lookup array to draw arrows without doing any math
    314     private static int ll0 = 9;
    315     private static int sl4 = 5;
    316     private static int sl9 = 3;
    317     private static int[][] dir = { { +sl4, +ll0, +ll0, +sl4 }, { -sl9, +ll0, +sl9, +ll0 }, { -ll0, +sl4, -sl4, +ll0 },
     350    private final static int ll0 = 9;
     351    private final static int sl4 = 5;
     352    private final static int sl9 = 3;
     353    private final static int[][] dir = { { +sl4, +ll0, +ll0, +sl4 }, { -sl9, +ll0, +sl9, +ll0 }, { -ll0, +sl4, -sl4, +ll0 },
    318354        { -ll0, -sl9, -ll0, +sl9 }, { -sl4, -ll0, -ll0, -sl4 }, { +sl9, -ll0, -sl9, -ll0 },
    319355        { +ll0, -sl4, +sl4, -ll0 }, { +ll0, +sl9, +ll0, -sl9 }, { +sl4, +ll0, +ll0, +sl4 },
     
    322358    // the different color modes
    323359    enum colorModes {
    324         none, velocity, dilution
     360        none, velocity, dilution, direction
    325361    }
    326362
     
    430466                                break;
    431467
     468                            case direction:
     469                                // unfortunately "heading" misses a cos-factor in the
     470                                // longitudes to account for the convergence of meridians
     471                                double dirColor = oldWp.getCoor().heading(trkPnt.getCoor()) / (2.0 * Math.PI) * 256;
     472                                // Bad case first
     473                                if (dirColor != dirColor || dirColor < 0.0 || dirColor >= 256.0) {
     474                                    trkPnt.customColoring = colors_cyclic[0];
     475                                } else {
     476                                    trkPnt.customColoring = colors_cyclic[(int) (dirColor)];
     477                                }
     478                                break;
    432479                            case dilution:
    433480                                if (trkPnt.attr.get("hdop") != null) {
     
    647694        }
    648695
     696        @Override
    649697        public void actionPerformed(ActionEvent e) {
    650698            JPanel msg = new JPanel(new GridBagLayout());
     
    702750        }
    703751
     752        @Override
    704753        public void actionPerformed(ActionEvent e) {
    705754            JPanel msg = new JPanel(new GridBagLayout());
     
    876925            Main.worker.submit(
    877926                    new Runnable() {
     927                        @Override
    878928                        public void run() {
    879929                            try {
     
    10871137
    10881138        Collections.sort((ArrayList<WayPoint>) waypoints, new Comparator<WayPoint>() {
     1139            @Override
    10891140            public int compare(WayPoint a, WayPoint b) {
    10901141                return a.time <= b.time ? -1 : 1;
     
    14051456                if (sel.length > 1) {
    14061457                    Arrays.sort(sel, new Comparator<File>() {
     1458                        @Override
    14071459                        public int compare(File a, File b) {
    14081460                            return a.lastModified() <= b.lastModified() ? -1 : 1;
Note: See TracChangeset for help on using the changeset viewer.