/* * Copyright (C) 2012 Dr. John Lindsay <jlindsay@uoguelph.ca> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package whitebox.cartographic; import java.util.ArrayList; /** * * @author Dr. John Lindsay <jlindsay@uoguelph.ca> */ public final class PointMarkers { public enum MarkerStyle { CIRCLE, SQUARE, TRIANGLE, TRIANGLE2, DIAMOND, THICK_CROSS, CROSS, X, SIMPLE_STAR, NULL; } public static ArrayList<double[][]> getAllSymbols(float markerSize) { ArrayList<double[][]> markers = new ArrayList<>(); markers.add(PointMarkers.getCircle(markerSize)); markers.add(PointMarkers.getSquare(markerSize)); markers.add(PointMarkers.getTriangle(markerSize)); markers.add(PointMarkers.getTriangle2(markerSize)); markers.add(PointMarkers.getDiamond(markerSize)); markers.add(PointMarkers.getThickCross(markerSize)); markers.add(PointMarkers.getCross(markerSize)); markers.add(PointMarkers.getX(markerSize)); markers.add(PointMarkers.getSimpleStar(markerSize)); return markers; } public static MarkerStyle findMarkerStyleFromIndex(int index) { switch (index) { case 0: return MarkerStyle.CIRCLE; case 1: return MarkerStyle.SQUARE; case 2: return MarkerStyle.TRIANGLE; case 3: return MarkerStyle.TRIANGLE2; case 4: return MarkerStyle.DIAMOND; case 5: return MarkerStyle.THICK_CROSS; case 6: return MarkerStyle.CROSS; case 7: return MarkerStyle.X; case 8: return MarkerStyle.SIMPLE_STAR; default: return MarkerStyle.CIRCLE; } } public static MarkerStyle findMarkerStyleFromString(String style) { if (style.toLowerCase().equals("circle")) { return MarkerStyle.CIRCLE; } else if (style.toLowerCase().equals("square")) { return MarkerStyle.SQUARE; } else if (style.toLowerCase().equals("triangle")) { return MarkerStyle.TRIANGLE; } else if (style.toLowerCase().equals("triangle2")) { return MarkerStyle.TRIANGLE2; } else if (style.toLowerCase().equals("diamond")) { return MarkerStyle.DIAMOND; } else if (style.toLowerCase().equals("cross")) { return MarkerStyle.CROSS; } else if (style.toLowerCase().equals("x")) { return MarkerStyle.X; } else if (style.toLowerCase().equals("simple_star")) { return MarkerStyle.SIMPLE_STAR; } return MarkerStyle.CIRCLE; } public static double[][] getMarkerData(MarkerStyle markerStyle, float markerSize) { switch (markerStyle) { case CROSS: return getCross(markerSize); case DIAMOND: return getDiamond(markerSize); case SIMPLE_STAR: return getSimpleStar(markerSize); case SQUARE: return getSquare(markerSize); case THICK_CROSS: return getThickCross(markerSize); case TRIANGLE: return getTriangle(markerSize); case TRIANGLE2: return getTriangle2(markerSize); case X: return getX(markerSize); default: return getCircle(markerSize); } } public static double[][] getCircle(float markerSize) { double[][] ret = new double[1][3]; float halfMS = markerSize / 2.0f; ret[0][0] = 2; // Elipse2D instruction ret[0][1] = halfMS; // x ret[0][2] = markerSize; // y return ret; } public static double[][] getSquare(float markerSize) { double[][] ret = new double[5][3]; float halfMS = markerSize / 2.0f; ret[0][0] = 0; // moveTo instruction ret[0][1] = -halfMS; // x ret[0][2] = -halfMS; // y ret[1][0] = 1; // lineTo instruction ret[1][1] = halfMS; // x ret[1][2] = -halfMS; // y ret[2][0] = 1; // lineTo instruction ret[2][1] = halfMS; // x ret[2][2] = halfMS; // y ret[3][0] = 1; // lineTo instruction ret[3][1] = -halfMS; // x ret[3][2] = halfMS; // y ret[4][0] = 1; // lineTo instruction ret[4][1] = -halfMS; // x ret[4][2] = -halfMS; // y return ret; } public static double[][] getTriangle(float markerSize) { double[][] ret = new double[4][3]; float halfMS = markerSize / 2.0f; ret[0][0] = 0; // moveTo instruction ret[0][1] = 0; // x ret[0][2] = -halfMS; // y ret[1][0] = 1; // lineTo instruction ret[1][1] = halfMS; // x ret[1][2] = halfMS; // y ret[2][0] = 1; // lineTo instruction ret[2][1] = -halfMS; // x ret[2][2] = halfMS; // y ret[3][0] = 1; // lineTo instruction ret[3][1] = 0; // x ret[3][2] = -halfMS; // y return ret; } public static double[][] getTriangle2(float markerSize) { double[][] ret = new double[4][3]; float halfMS = markerSize / 2.0f; ret[0][0] = 0; // moveTo instruction ret[0][1] = 0; // x ret[0][2] = halfMS; // y ret[1][0] = 1; // lineTo instruction ret[1][1] = halfMS; // x ret[1][2] = -halfMS; // y ret[2][0] = 1; // lineTo instruction ret[2][1] = -halfMS; // x ret[2][2] = -halfMS; // y ret[3][0] = 1; // lineTo instruction ret[3][1] = 0; // x ret[3][2] = halfMS; // y return ret; } public static double[][] getDiamond(float markerSize) { double[][] ret = new double[5][3]; float halfMS = markerSize / 2.0f; ret[0][0] = 0; // moveTo instruction ret[0][1] = 0; // x ret[0][2] = -halfMS * 1.2; // y ret[1][0] = 1; // lineTo instruction ret[1][1] = halfMS; // x ret[1][2] = 0; // y ret[2][0] = 1; // lineTo instruction ret[2][1] = 0; // x ret[2][2] = halfMS * 1.2; // y ret[3][0] = 1; // lineTo instruction ret[3][1] = -halfMS; // x ret[3][2] = 0; // y ret[4][0] = 1; // lineTo instruction ret[4][1] = 0; // x ret[4][2] = -halfMS * 1.2; // y return ret; } public static double[][] getCross(float markerSize) { double[][] ret = new double[4][3]; float halfMS = markerSize / 2.0f; ret[0][0] = 0; // moveTo instruction ret[0][1] = 0; // x ret[0][2] = -halfMS; // y ret[1][0] = 1; // lineTo instruction ret[1][1] = 0; // x ret[1][2] = halfMS; // y ret[2][0] = 0; // moveTo instruction ret[2][1] = -halfMS; // x ret[2][2] = 0; // y ret[3][0] = 1; // lineTo instruction ret[3][1] = halfMS; // x ret[3][2] = 0; // y return ret; } public static double[][] getX(float markerSize) { double[][] ret = new double[4][3]; float halfMS = markerSize / 2.0f; ret[0][0] = 0; // moveTo instruction ret[0][1] = -halfMS; // x ret[0][2] = -halfMS; // y ret[1][0] = 1; // lineTo instruction ret[1][1] = halfMS; // x ret[1][2] = halfMS; // y ret[2][0] = 0; // moveTo instruction ret[2][1] = -halfMS; // x ret[2][2] = halfMS; // y ret[3][0] = 1; // lineTo instruction ret[3][1] = halfMS; // x ret[3][2] = -halfMS; // y return ret; } public static double[][] getSimpleStar(float markerSize) { double[][] ret = new double[8][3]; float halfMS = markerSize / 2.0f; ret[0][0] = 0; // moveTo instruction ret[0][1] = -halfMS; // x ret[0][2] = -halfMS; // y ret[1][0] = 1; // lineTo instruction ret[1][1] = halfMS; // x ret[1][2] = halfMS; // y ret[2][0] = 0; // moveTo instruction ret[2][1] = -halfMS; // x ret[2][2] = halfMS; // y ret[3][0] = 1; // lineTo instruction ret[3][1] = halfMS; // x ret[3][2] = -halfMS; // y ret[4][0] = 0; // moveTo instruction ret[4][1] = 0; // x ret[4][2] = halfMS * 1.2; // y ret[5][0] = 1; // lineTo instruction ret[5][1] = 0; // x ret[5][2] = -halfMS * 1.2; // y ret[6][0] = 0; // moveTo instruction ret[6][1] = -halfMS * 1.2; // x ret[6][2] = 0; // y ret[7][0] = 1; // lineTo instruction ret[7][1] = halfMS * 1.2; // x ret[7][2] = 0; // y return ret; } public static double[][] getThickCross(float markerSize) { double[][] ret = new double[13][3]; float halfMS = markerSize / 2.0f; float thickness = markerSize / 6.0f; ret[0][0] = 0; // moveTo instruction ret[0][1] = -thickness; // x ret[0][2] = -halfMS; // y ret[1][0] = 1; // lineTo instruction ret[1][1] = thickness; // x ret[1][2] = -halfMS; // y ret[2][0] = 1; // lineTo instruction ret[2][1] = thickness; // x ret[2][2] = -thickness; // y ret[3][0] = 1; // lineTo instruction ret[3][1] = halfMS; // x ret[3][2] = -thickness; // y ret[4][0] = 1; // lineTo instruction ret[4][1] = halfMS; // x ret[4][2] = thickness; // y ret[5][0] = 1; // lineTo instruction ret[5][1] = thickness; // x ret[5][2] = thickness; // y ret[6][0] = 1; // lineTo instruction ret[6][1] = thickness; // x ret[6][2] = halfMS; // y ret[7][0] = 1; // lineTo instruction ret[7][1] = -thickness; // x ret[7][2] = halfMS; // y ret[8][0] = 1; // lineTo instruction ret[8][1] = -thickness; // x ret[8][2] = thickness; // y ret[9][0] = 1; // lineTo instruction ret[9][1] = -halfMS; // x ret[9][2] = thickness; // y ret[10][0] = 1; // lineTo instruction ret[10][1] = -halfMS; // x ret[10][2] = -thickness; // y ret[11][0] = 1; // lineTo instruction ret[11][1] = -thickness; // x ret[11][2] = -thickness; // y ret[12][0] = 1; // lineTo instruction ret[12][1] = -thickness; // x ret[12][2] = -halfMS; // y return ret; } // private double[][] getCircle(float markerSize) { // double[][] ret = new double[4][3]; // double kappa = 0.5522847498; // float R = markerSize / 2.0f; // ret[0][0] = 0; // moveTo instruction // ret[0][1] = 0; // x // ret[0][2] = -R; // y // // ret[1][0] = 2; // curveTo instruction // ret[1][1] = R * kappa; // x // ret[1][2] = -R; // y // // //circle.curveTo(x + R * kappa, y - R, x + R, y - R * kappa, x + R, y); // curve to //// A //// ', B' //// , B // Second //// circle //// .curveTo(x + R, y + R * kappa, x + R * kappa, y + R, x, y + R); //// ////// Third //// circle.curveTo(x - R * kappa, y + R, x - R, y + R * kappa, x - R, y); //// ////// Last //// circle.curveTo(x - R, y - R * kappa, x - R * kappa, y - R, x, y - R); // // Ellipse2D circle = new Ellipse2D.Double((middleX - halfMarkerSize), (middleY - halfMarkerSize), markerSize, markerSize); // return ret; // } }