0

ポイントをワールド座標からスクリーン座標に変換する際に問題が発生しています。トラックを描画するために、5px ごとにポイントで構成されるトラックを持つマップがあります。地図は 2500x2000 で、キャンバス (電話画面) は 800x600px です。

車が動くまでスマホの画面に見える軌跡だけを描きたい。そこで、(point.x > mapx) と (point.x < mapx + screenWidth) のポイント配列からポイントを取得し、Y についても同様に取得しました。これにより、画面上にあったトラックの現在のポイントがすべて取得されました。

ここで、これらを画面座標に変換して表示する必要がありますが、ここで行き詰まっています。たとえば、マップの右側のポイントは 2200x1000 かもしれませんが、画面が 800x600 しかないため、ここには描画できません。

これらを変換する助けはありますか?

ありがとう

onDraw() メソッドから呼び出されるコード:

// loop track array
    Point point;
    for (int i = 0; i < this.trackPoints.size(); i++) {
        point = this.trackPoints.get(i);
        // if that piece of track is on the screen currently then add to
        // array
        if ((point.x > mapx) && (point.x < mapx + this.getWidth())
                && (point.y > mapy) && (point.y < mapy + this.getHeight())) {

            //translate point back to screen-coords
            Log.v("visibletrack", "adding point x = " + point.x + " point y = " + point.y);
            Log.v("visibledebugging", "mapmaxx = " + this.mapMaxX + " mapmaxy = " + this.mapMaxY);
            Log.v("visibledebugging", "scale x = " + scaleX + " scaley = " + scaleY);
            this.visibleTrackPoints.add(new Point((int)(point.x/scaleX), (int)(point.y/scaleY)));
        }
    }

上記の作業は、画面に表示されるはずのトラックのポイントを取得できますが、画面に「大きく」描画されるように変換する必要があります。たとえば、マップが 2000,100 でクリップされ、ここにポイントがあった場合、そのポイントは画面上の 0,100 に描画される必要があります。したがって、これらの最初の座標を画面上の正しい位置に変換する必要があります。

4

1 に答える 1

0

あなたの問題が何であるかは完全には明らかではありません。両方の座標系の原点が一致する場合、一方の座標系の座標に適切な倍率を適用して、他方の座標系のスケーリングされた座標に到達するだけの問題だと思います。各座標系の原点が一致しない場合は、スケーリングだけでなく変換も適用する必要があります。

これはプログラミングの問題ではなく、数学的な問題だと思います。

于 2013-10-23T11:26:53.320 に答える