omtextlabeler.java

来自「OpenMap是一个基于JavaBeansTM的开发工具包。利用OpenMap你」· Java 代码 · 共 229 行

JAVA
229
字号
// **********************************************************************////<copyright>////BBN Technologies, a Verizon Company//10 Moulton Street//Cambridge, MA 02138//(617) 873-8000////Copyright (C) BBNT Solutions LLC. All rights reserved.////</copyright>//**********************************************************************////$Source:///cvs/darwars/ambush/aar/src/com/bbn/ambush/mission/MissionHandler.java,v//$//$RCSfile: OMTextLabeler.java,v $//$Revision: 1.1.2.4 $//$Date: 2007/06/21 21:41:44 $//$Author: dietrick $////**********************************************************************package com.bbn.openmap.omGraphics;import java.awt.Font;import java.awt.Point;import java.awt.Rectangle;import java.awt.geom.GeneralPath;/** * A default implementation of OMLabeler that extends from OMText. *  * @author dietrick */public class OMTextLabeler extends OMText implements OMLabeler {    public final static int ANCHOR_TOPLEFT = 0;    public final static int ANCHOR_TOP = 1;    public final static int ANCHOR_TOPRIGHT = 2;    public final static int ANCHOR_LEFT = 3;    public final static int ANCHOR_CENTER = 4;    public final static int ANCHOR_RIGHT = 5;    public final static int ANCHOR_BOTTOMLEFT = 6;    public final static int ANCHOR_BOTTOM = 7;    public final static int ANCHOR_BOTTOMRIGHT = 8;    protected int anchor = ANCHOR_CENTER;    /**     *      */    public OMTextLabeler(String stuff) {        this(stuff, DEFAULT_FONT, JUSTIFY_LEFT);    }    /**     * @param stuff     * @param just     */    public OMTextLabeler(String stuff, int just) {        this(stuff, DEFAULT_FONT, just, ANCHOR_CENTER);    }    public OMTextLabeler(String stuff, int just, int loc) {        this(stuff, DEFAULT_FONT, just, loc);    }    /**     * @param stuff     * @param font     * @param just     */    public OMTextLabeler(String stuff, Font font, int just) {        this(stuff, font, just, ANCHOR_CENTER);    }    public OMTextLabeler(String stuff, Font font, int just, int loc) {        setRenderType(RENDERTYPE_XY);        setData(stuff);        setFont(font);        setJustify(just);        setAnchor(loc);    }    public void setLocation(GeneralPath gp) {        if (gp != null) {            Rectangle rect = gp.getBounds();            double x = rect.getX();            double y = rect.getY();            if (anchor == ANCHOR_TOP || anchor == ANCHOR_CENTER                    || anchor == ANCHOR_BOTTOM) {                x += rect.getWidth() / 2;            } else if (anchor == ANCHOR_TOPRIGHT || anchor == ANCHOR_RIGHT                    || anchor == ANCHOR_BOTTOMRIGHT) {                x += rect.getWidth();            }            if (anchor == ANCHOR_LEFT || anchor == ANCHOR_CENTER                    || anchor == ANCHOR_RIGHT) {                y += rect.getHeight() / 2;            } else if (anchor == ANCHOR_BOTTOMLEFT || anchor == ANCHOR_BOTTOM                    || anchor == ANCHOR_BOTTOMRIGHT) {                y += rect.getHeight();            }            setLocation(new Point((int) x, (int) y));        }    }    /*     * (non-Javadoc)     *      * @see com.bbn.openmap.omGraphics.OMLabeler#setLocation(java.awt.Point)     */    public void setLocation(Point p) {        polyBounds = null;        setX((int) p.getX());        setY((int) p.getY());        setMapLocation(p);        computeBounds();        setNeedToRegenerate(false);    }    /*     * (non-Javadoc)     *      * @see com.bbn.openmap.omGraphics.OMLabeler#setLocation(int[][], int[][])     */    public void setLocation(int[] xpoints, int[] ypoints) {        setLocation(getCenter(xpoints, ypoints));    }    /**     * Calculate the projected area of the poly. Algorithm used is from some     * australian astronomy website =)     * http://astronomy.swin.edu.au/~pbourke/geometry/polyarea     */    protected static double calculateProjectedArea(int[] xpts, int[] ypts) {        int j = 0;        double area = 0.0;        int npoints = xpts.length;        for (int i = 0; i < npoints; ++i) {            j = (i + 1) % npoints;            area += xpts[i] * ypts[j];            area -= ypts[i] * xpts[j];        }        return area / 2.0;    }    /**     * Get the calculated center where the label string is drawn. Algorithm used     * is from some australian astronomy website =)     * http://astronomy.swin.edu.au/~pbourke/geometry/polyarea     */    protected static Point getCenter(int[] xpts, int[] ypts) {        int npoints = xpts.length;        if (npoints == 1) {            Point center = new Point(xpts[0], ypts[0]);            return center;        }        if (npoints == 2) {            // rmcneil - two points, A=0, div zero below            int x;            if (xpts[1] > xpts[0])                x = xpts[0] + ((xpts[1] - xpts[0]) / 2);            else                x = xpts[1] + ((xpts[0] - xpts[1]) / 2);            int y;            if (ypts[1] > ypts[0])                y = ypts[0] + ((ypts[1] - ypts[0]) / 2);            else                y = ypts[1] + ((ypts[0] - ypts[1]) / 2);            Point center = new Point(x, y);            return center;        }        double factor = 0;        double cx = 0.0f;        double cy = 0.0f;                for (int i = 0; i < npoints; ++i) {            int j = (i + 1) % npoints;            factor = xpts[i] * ypts[j] - xpts[j] * ypts[i];            cx += (xpts[i] + xpts[j]) * factor;            cy += (ypts[i] + ypts[j]) * factor;        }        double A = calculateProjectedArea(xpts, ypts);        A = A * 6.0;        factor = 1.0 / A;        // bbenyo: take the absolute value cause I was getting        // negative values        // for polys with all positive vertices        // cx = Math.abs(cx * factor);        // cy = Math.abs(cy * factor);        // DFD and RS - let the area calculation return negative        // values, and don't do this absolute value calculation.        // Negative values get returned when the points are        // counterclockwise, indicating holes. We may want labels        // offscreen however, and the abs pushes them onscreen.        cx *= factor;        cy *= factor;        Point center = new Point((int)Math.round(cx), (int)Math.round(cy));        return center;    }    public int getAnchor() {        return anchor;    }    public void setAnchor(int anchor) {        this.anchor = anchor;    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?