2

ユーザーが (640x480) ウィンドウに何かを描画する GUI を作成しました。その描画を Vector 配列に格納された一連の点にします。では、これらの点のセットを原点 (ウィンドウの左上隅 0,0) に変換したり、指定した位置に配置するにはどうすればよいでしょうか? 入れたいウィンドウの幅と高さも640x480です。

それが解決された後、その新しいポイントのセットを必要なサイズにどのようにスケーリングしますか?

更新 1

スケールの問題は解決しましたが、配置の問題は解決しませんでした。絵が思うように進まない。私がこれまでに持っているものの以下のコード。

float scaleX = (float)width/boundingPoints.width;
float scaleY = (float)height/boundingPoints.height;
for(int i = 0; i < cg_points.size()-1; i++){
    Point p1 = cg_points.get(i);
    Point p2 = cg_points.get(i+1);
    g.drawLine((int)(p1.x*scaleX) + pos.x, (int)(p1.y*scaleY) + pos.y, (int)(p2.x*scaleX) + pos.x, (int)(p2.y*scaleY) + pos.y);
}

pos [x, y] の位置から描画を開始したい。現在問題になっているのはこれです。それは pos.x と pos.y が行うことに従いますが、それはかなり外れており、pos[x,y] から始まっていません。

これが問題のスクリーンショットです 変革問題のイメージ

写真からわかるように、ボックスは星があるはずの場所です。ご覧のとおり、スケーリングは正しく、位置だけではありません。これは、図面のポイントが(0,0) から始まらない可能性があるためです。

助言がありますか?

ありがとう!

4

2 に答える 2

2

図面を翻訳するには、単純に

foreach point in array
    point.x += translate.x
    point.y += translate.y

図面を中央に配置する場合は、中央を選択し (すべてのポイントを平均化するなど)、その値を無効にしてから、すべてのポイントをその値で変換します。

図面をスケーリングするには:

foreach point in array
    point.x *= scale
    point.y *= scale
于 2012-10-25T21:32:44.863 に答える
0

だから私はそれを解決しました...イェーイ!!! 私が持っていたのと同じ問題に遭遇した場合に備えて、以下のコードがあります。

    float scaleX = (float)width/boundingPoints.width;
    float scaleY = (float)height/boundingPoints.height;
    int bx = boundingPoints.x;
    int by = boundingPoints.y;
    for(int i = 0; i < cg_points.size()-1; i++){
            Point p1 = cg_points.get(i);
            Point p2 = cg_points.get(i+1);
            int x1 = (int) ((p1.x-bx)*scaleX);
            x1 += pos.x;
            int y1 = (int) ((p1.y-by)*scaleY);
            y1 += pos.y;
            int x2 = (int) ((p2.x-bx)*scaleX);
            x2 += pos.x;
            int y2 = (int) ((p2.y-by)*scaleY);
            y2 += pos.y;

            g.drawLine(x1, y1, x2, y2);
        }
于 2012-10-26T00:29:23.910 に答える