【问题标题】:Drawing polygons on right position在正确的位置绘制多边形
【发布时间】:2013-04-16 23:33:06
【问题描述】:

这个问题是GPS coordinates to pixel 的继续。 我需要画几个多边形。我可以单独绘制每个多边形,但不能将所有多边形都放在正确的位置。

我从这个文件中加载有关多边形的信息: GPS

我有代表每个多边形的 Kraj 类。

public class Kraj {

    String name;
    Point2D.Double points[];
    Point2D.Double transPoints[];

    Point2D.Double max;
    Point2D.Double min;

    // polygon
    Path2D.Double polygon;

    ArrayList<Kraj> kraje;

    public Kraj(String name, Point2D.Double body[])
    {
        this.name = name;
        this.body = Arrays.copyOf(body, body.length);
        // calculate a bounding box
        zjistiLimity();
        this.transPoints = new Point2D.Double[points.length];
    }

    private void transformToWindow(int width, int height) 
    {
        // convert to window
        double convertX = width / (max.x - min.x);
        double convertY = height / (max.y - min.y);

        // calculate polygon to fit in window with right aspect ratio
        double convert =  convertX > convertY ? convertY : convertX;
        // min = 0, convert to interval <0: infinity> and multiply by convert,
        for (int j = 0; j < points.length; j++) {
            double transX = (points[j].x - min.x) * convert;
            double transY = height - (points[j].y - min.y)  * convert;
            transPoints[j] = new Point2D.Double(transX, transY);
        }

        this.polygon = new Path2D.Double();
        this.polygon.moveTo(transBody[0].x, transBody[0].y);
        for (int i = 1; i < body.length; i++) 
            this.polygon.lineTo(transPoints[i].x, transPoints[i].y);
        this.polygon.closePath();
    }

    private void drawKraj(Graphics2D g2, int width, int height) {       

        g2.setStroke(new BasicStroke(2));
        g2.fill(polygon);
        // vykreslime obrys
        g2.setColor(Color.black);
        g2.draw(polygon);
    }

    public void draw(Graphics2D g2,
            int contextWidth, int contextHeight) 
    {
        // fit to window size
        int sirkaSOdsazenim = contextWidth;
        int vyskaSOdsazenim = contextHeight;

        this.transformujToWindow(sirkaSOdsazenim, vyskaSOdsazenim);

        this.drawKraj(g2, sirkaSOdsazenim, vyskaSOdsazenim);

    }


    /**
     * Set min and max
     */
    private void zjistiLimity() {
        max = new Point2D.Double(-Double.MAX_VALUE, -Double.MAX_VALUE);
        min = new Point2D.Double(Double.MAX_VALUE, Double.MAX_VALUE);
        for(int j = 0; j < 10; j++)
        {
            for (int i = 0; i < body.length; i++) 
            {
                if (points[i].getX() < min.getX()) min.x = points[i].getX();
                if (points[i].getY() < min.getY()) min.y = points[i].getY();
                if (points[i].getX() > max.getX())max.x = points[i].getX();
                if (points[i].getY() > max.getY()) max.y = points[i].getY();
            }
        }
    }

使用此代码,我可以绘制适合窗口的多边形。但我需要绘制所有多边形以适合窗口(计算坐标以创建此地图):

我需要编辑或添加什么?谢谢大家的回答。

【问题讨论】:

    标签: java graphics


    【解决方案1】:

    您可以使用以下方法平移整个多边形:

    g2.translate(x, y); 
    g2.draw(polygon);
    g2.translate(-x, -y)
    

    您需要为每个多边形确定适当的 x/y 平移。

    【讨论】:

    • 在这种情况下,我必须将每个多边形平移不同的像素数。我是这样想的,但我认为这不必要地困难。特别是当我有正确的坐标并且我只需要以正确的方式转换它时。
    • 这与其他答案的方法相同。是的,您需要确定每个多边形的原点。不同之处在于,一旦计算出原点,您就不需要创建新的多边形。您只需使用平移绘制原始多边形。涉及的工作更少。
    【解决方案2】:

    我需要画几个多边形。我可以单独绘制每个多边形,但不能在正确的位置绘制所有多边形。

    如果您可以单独绘制每个多边形,那么您的多边形是正确的。

    您需要为您的Kraj 类添加一个起点。然后您的draw 方法会将多边形点从多边形原点转换为地图原点。假设您的多边形原点是 (10,10) 并且需要在 (20,30) 处绘制特定的多边形,那么您将在绘制之前将 10 添加到多边形中每个点的 x 并添加 20 到 y。

    在调整每个点的 X 和 Y 值之前,您可以在绘制例程中复制多边形。

    编辑添加:这是您自己修改的代码以转换原点。我没有测试过这些更改。

    private void transformToWindow(Point2D windowOrigin, int width, int height) 
    {
        // convert to window
        double convertX = width / (max.x - min.x);
        double convertY = height / (max.y - min.y);
    
        // calculate polygon to fit in window with right aspect ratio
        double convert =  convertX > convertY ? convertY : convertX;
        // min = 0, convert to interval <0: infinity> and multiply by convert,
        for (int j = 0; j < points.length; j++) {
            double transX = (points[j].x - min.x) * convert;
            double transY = height - (points[j].y - min.y)  * convert;
            transPoints[j] = new Point2D.Double(transX, transY);
        }
    
        this.polygon = new Path2D.Double();
        double xShift = windowOrigin.x - transBody[0].x;
        double yShift = windowOrigin.y - transBody[0].y;
        this.polygon.moveTo(windowOrigin.x, windowOrigin.y);
        for (int i = 1; i < body.length; i++) 
            this.polygon.lineTo(transPoints[i].x + xShift, 
                transPoints[i].y + yShift);
        this.polygon.closePath();
    }
    

    【讨论】:

    • 我大概明白你的意思,但我不知道该怎么写。请给我更多的线索吗?
    • @Sk1X1:查看我修改后的答案。
    • 谢谢。 windowsOrigin 到底是什么?
    • @Sk1X1:窗口中多边形的原点,必须传递给你的 Kraj 类。
    • 我明白了。但是我必须计算每个多边形的原点,对吗?我希望,存在比单独计算每个多边形的偏移更好的解决方案。不过谢谢。
    猜你喜欢
    • 2020-02-09
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多