ポリゴン(魚のように見える)を作成するために使用している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 };
x
配列の最大値を見つける必要があります。この場合は です60
。60 - x
次に、次のようにループを使用して各 x 座標を設定します。
for (i = 0; i < NUMBER_OF_POINTS; i++) {
x[i] = MAX_X - x[i];
}
この式を使用して x 座標を変更します x = 60 - x
「フリップ」とは、左から右に向いている魚を右から左に変えることだと思います。これは、魚を 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;
}
配列の内容を操作するよりも、グラフィックス クラスの translate メソッドと scale メソッドを使用する方が簡単な場合があります。
2 つの int 配列の代わりに Point2D 抽象化を使用していた場合、これがずっと簡単になることがあります。これらは別個のエンティティではなく、関連しています。では、なぜまったく関係がないかのようにコードを書いているのでしょうか? Point クラスと Polygon クラスはどこにありますか? 抽象化はどこにありますか?
水平方向に「反転」するという意味が理解できれば、y軸についての反射が必要だと思います。そうであれば、すべての x 座標の符号を変更するだけで完了です。
したがって、端点 A (xa, ya) と B (xb, yb) を持つベクトルは、(-xa, ya) と (-xb, yb) になります。