1

ポリゴン(魚のように見える)を作成するために使用しているintの2つの配列があります。ポリゴンを水平方向に反転するには、配列に対して何をする必要がありますか?

x = new int[]
   { 0, 18, 24, 30, 48, 60, 60, 54, 60, 48, 30, 24, 0 };
y = new int[]
   { 0, 18, 6, 0, 0, 12, 18, 24, 24, 36, 36, 30, 36 };
4

6 に答える 6

11

x配列の最大値を見つける必要があります。この場合は です6060 - x次に、次のようにループを使用して各 x 座標を設定します。

for (i = 0; i < NUMBER_OF_POINTS; i++) {
    x[i] = MAX_X - x[i];
}
于 2009-10-04T05:12:59.240 に答える
4

この式を使用して x 座標を変更します x = 60 - x

于 2009-10-04T05:05:20.813 に答える
1

http://en.wikipedia.org/wiki/Rotation_matrix

于 2009-10-04T05:06:04.747 に答える
0

「フリップ」とは、左から右に向いている魚を右から左に変えることだと思います。これは、魚を x=a の線の周りに効果的に反射していることを意味します。ここで、a は魚の中点の水平座標です。この場合、a=(max(x[])-min(x[]))/2.

各ポイントについて、x=a の左または右にあるかどうかを確認します。左にある場合は、右に同じ距離になるように単純に変更します。そうでない場合は、左に同じ距離になるように変更します。

次の(テストされていない)コードが機能すると思います。すべての値を int として保持しているため、わずかな歪みが発生する可能性があります。ただし、歪みがなくなるまでコードを微調整するのは簡単なはずです。

int max_x=-1;
int min_x=Integer.MAX_VALUE;
for (int v:x){
   max_x=Math.max(max_x,v);
   min_x=Math.miN(min_x,v);
}

int mid=(max_x-min_x)/2;
int[] reflected_x=new int[x.length];

for(int i=0;i<x.length;i++){
   int diff=Math.abs(x[i]-mid);
   if (x[i]<mid) reflected_x[i]=mid+diff;
   else reflected_x[i]=mid-diff;
}
于 2009-10-04T09:24:17.457 に答える
0

配列の内容を操作するよりも、グラフィックス クラスの translate メソッドと scale メソッドを使用する方が簡単な場合があります。

于 2009-10-04T09:32:02.853 に答える
0

2 つの int 配列の代わりに Point2D 抽象化を使用していた場合、これがずっと簡単になることがあります。これらは別個のエンティティではなく、関連しています。では、なぜまったく関係がないかのようにコードを書いているのでしょうか? Point クラスと Polygon クラスはどこにありますか? 抽象化はどこにありますか?

水平方向に「反転」するという意味が理解できれば、y軸についての反射が必要だと思います。そうであれば、すべての x 座標の符号を変更するだけで完了です。

したがって、端点 A (xa, ya) と B (xb, yb) を持つベクトルは、(-xa, ya) と (-xb, yb) になります。

于 2009-10-04T13:02:22.947 に答える