0

ユーザーがクリックする必要があるランダムなサイズの 2 つの円を特徴とする Java アプリケーションを構築しています。最初の円をクリックしてから 2 番目の円をクリックするまでの時間を測定します。残念ながら、私は Java を初めて使用するので、処理が遅くなりました。現在、アプリケーションで円を描画し、System.nanoTime() を使用してクリック間の時間を測定していますが、問題が発生しています。

円は互いに一定の距離にある必要があるため、円の中心を原点として使用したいと考えています。基本的に、円の中心がそれらの座標にあるように、円の座標を提供できるようにしたいと考えています。円間の距離は、中心間の距離を表します。現在、円は JPanel に埋め込まれていますが、JPanel の位置を設定すると、左上がその位置に移動します。

もちろん、paintComponent() で試した AffineTransform または Graphics2D.translate() のいずれかをいじる必要があるかもしれないという検索を読みましたが、これは少し混乱したので、setlocation をオーバーライドしてから半径を減算しようとしました位置。それはある程度機能しますが、最もクリーンなソリューションではありません。誰でもこれを行う方法についていくつかの指針を教えてもらえますか?

前もって感謝します。

4

2 に答える 2

2

問題の説明を理解すれば、このような円のペアはすべて、ここに示すように、囲んでいるパネルの中心にある円の反対側に配置されます。ランダムな 0 ≤ θ < π を選択し、π - θ でその反対を見つけるだけです。パネルのサイズが変更されると、例のレンダリングがどのようにスケーリングされるかに注目してください。

画像

余談ですが、この例setPreferredSize()では描画パネルの寸法を設定するために使用していますが、代わりにオーバーライドすることもできますgetPreferredSize()

補遺: このfillOval()では、円をレンダリングするために使用していますがdraw()、任意の で使用できますShape。後者は、ここで説明したように、ヒット テストに適したいくつかの方法を提供contains()ます。

于 2013-08-12T14:39:48.777 に答える
0

円(x1、y1)と(x2、y2)の2つの中心の座標があります。半径の大きさはランダムです。2 つの r1 と r2 の半径を取得したら、それらを (x1-r1, y1-r1) と (x2-r2, y2-r2) に配置します。

java.awt.Point を使用して中心を表すことができ、

center.translate(-radius, -radius)

変換された新しい値を描画の位置として使用します。

クリーンな解決策ではないと思うかもしれませんが、そうでないのはなぜですか? Javaのすべては、位置に左上隅を指定することで描画されるため、中央の使用はきれいではありません:)。-radius を実行して左上の位置を計算するには、きれいです :)

于 2013-08-12T18:44:36.780 に答える