0

この質問はGPS 座標からピクセルへの続きです。いくつかのポリゴンを描画する必要があります。各ポリゴンを単独で描画できますが、すべてのポリゴンを正しい位置に配置できません。

このファイルからポリゴンに関する情報を読み込みます: 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();
            }
        }
    }

このコードを使用すると、ウィンドウに収まるポリゴンを描画できます。しかし、ウィンドウに収まるようにすべてのポリゴンを描画する必要があります (座標を計算してこのマップを作成します)。

最終イメージ

何を編集または追加する必要がありますか? すべての回答に感謝します。

4

2 に答える 2

1

いくつかのポリゴンを描画する必要があります。各ポリゴンを単独で描画することはできますが、すべてのポリゴンを正しい位置に描画することはできません。

各ポリゴンを単独で描画できる場合、そのポリゴンは正しいです。

クラスに起点を追加する必要がありますKraj。次に、drawメソッドは、ポリゴン ポイントをポリゴンの原点からマップの原点に変換します。ポリゴンの原点が (10,10) で、特定のポリゴンを (20,30) に描画する必要があると仮定すると、描画する前に、ポリゴンの各ポイントの x に 10 を追加し、y に 20 を追加します。

各ポイントの 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();
}
于 2013-04-16T15:15:04.007 に答える