0

Rectangle2D.Float と Point2D.Float との衝突をテストしようとしています。カメラを含む 2D ワールドがあります (カメラの AffineTransform に基づいて graphics2D キャンバスを変換します)。次に、サブオブジェクト Y を含むオブジェクト X のリストを作成します。キャンバスは X の AffineTransformation へのカメラの変換の上に変換されるため、オブジェクトは正しい位置にレンダリングされます。オブジェクト X 内のマウスとの衝突を正常にテストできますが、サブオブジェクト Y のテストで問題が発生しています。これは、Y オブジェクトが、他の場所に配置されているにもかかわらず、位置 (0,0) にあると「考える」ためです。 (200,200) と言うように再配置された親オブジェクト X。つまり、オブジェクト X と Y は (200,200) の位置に表示されますが、衝突は (200, 200) ではなく (0,0) で発生します。

AffineTransform.transform と AffineTransform.inverseTransform の呼び出しの正しい組み合わせに関係していると思いますが、正しい組み合わせに頭を悩ませることはできません。

4

2 に答える 2

2

これは、インタラクティブグラフィックスに連結変換を使用するときに発生する標準的な問題です。

Tオブジェクトを配置するアフィン変換行列であるとしましょうX。また、に対してUいくつかのサブオブジェクトを配置するマトリックスとします。次に、の各点が行列式で変換されますYXpY

p' = T U p

ここp'で、は変換されたポイントです。生きている座標空間はp'マウスの座標と同じです。ポイントでマウスクリックを受け取ったとき(ここでは同じ座標で一致させるためc'にプライムを使用しています)、選択肢があります。を使用して「逆方向」に変換し、サブオブジェクトの座標空間に入ることができます。または、すべてのポイントを手動で計算して、と比較することもできます。 'p'c'(T U)^(-1)cp'pc'

一般的に、後者を実行する必要があります。Javaは次のようになります。

AffineTransform TU = new AffineTransform(T);
TU.concatenate(U);
Point2D pPrime = new Point2D();
TU.transform(p, pPrime);

これらのポイントを手動で計算しているため、変換されたポイントのデータ構造を保持して、常にマウスの座標と比較できることにすぐに気付くでしょう。同じデータ構造を使用して、変換をまったく行わずに画面をペイントできます。これらはすでに適用されています。これは、インタラクティブグラフィックスのかなり標準的な手法です。図面全体が急速に更新されると、その魅力が失われます。ただし、図面が大きく、一度に更新される部分が多くても小さい場合は、パフォーマンスに大きなメリットがあります。あなたはいくらかの記憶を与えて、いくらかの速度を取り戻します。

于 2012-07-26T01:49:10.327 に答える
1

このに示されているように、いくつかのことが役立つ場合があります。

  • グラフィックスコンテキストの変換と。の変換を区別しShapeます。

  • 変換は可換ではありません。それらは、明らかに最後に指定された最初に適用された順序で適用されたかのように連結されます。

  • AffineTransformアンカーポイントを可能にする静的ファクトリが含まれます。

于 2012-07-26T01:28:14.007 に答える