1

一般的な質問があります (問題のある特定のコードを提示する必要があることはわかっていますが、私の場合、問題はより一般的な性質のものです)。

Processing で、楕円を作成するとします。

ellipse(30, 30, 10, 10);

この楕円がキャンバス上にあるピクセルを取得する方法はありますか? その理由は、(たとえば) マウスを使用したユーザー操作を作成する方法を用意するためです。そのため、誰かが楕円の上でマウスをクリックすると、何かが起こります。

すべてをオブジェクトに変換し、コンストラクターを使用して何らかの方法で形状の位置を格納することを考えましたが、特に複雑な形状の場合、これは言うは易く行うは難しです。それが私が興味を持っていることです。楕円の位置を計算することは 1 つのことですが、より複雑な形状はどうでしょうか? ライブラリはありますか?

4

3 に答える 3

3

マウスの位置をピクセルごとにチェックするよりも、数式を使用する方が適切です (はるかに高速で、コードが少なくて済みます)。

真円の場合、ピタゴラスの定理を使用してユークリッド距離を計算できます。円の中心が位置 ( circleXcircleY) で、半径(直径ではない) があるとしcircleRます。次のように、マウスが円の上にあるかどうかを確認できます。

if(sq(mouseX-circleX)+sq(mouseY-circleY) <= sq(circleR)) {
    // mouse is over circle
} else {
    // mouse is not over circle
}

このアプローチは、基本的に、斜辺 (最も長い辺) が円の中心からマウスの位置まで続く直角三角形を想定しています。ピタゴラスの定理を使用してその斜辺の長さを計算し、それが円の半径よりも小さい場合、マウスは円の内側にあります。(ただし、わずかな最適化が含まれています。比較的遅くなる可能性があるため、平方根を実行しないように平方を比較しています。)

于 2013-10-30T16:50:18.467 に答える
0

私の元の数学的な答えに代わるものも思い浮かびました。すべての UI 要素を 2 回描画するためのメモリと処理能力に余裕がある場合は、セカンダリ バッファーを使用して良い結果を得ることができます。

原則として、オフスクリーン グラフィックス バッファを使用する必要があります (たとえば、PGraphics を使用)。メイン ディスプレイとまったく同じサイズで、アンチエイリアスが無効になっている必要があります。すべてのインタラクティブな UI 要素 (ボタンなど) をこのバッファーに描画します。ただし、通常の方法で描画する代わりに、塗りと線に使用する独自の色をそれぞれに与えます (テキストや画像を追加しないでください。単色のみを使用します)。たとえば、あるボタンは完全に赤く、別のボタンは完全に緑にすることができます。各アイテムが固有の色を持っている限り、他の RGB 値は機能します。背景にも独自の色があることを確認してください。

ユーザーにはそのバッファが表示されないため、画面に描画しないでください (デバッグなどを行っている場合を除きます)。マウスが上にあるアイテムを検出したい場合は、そのオフスクリーン バッファーでマウスの位置を検索するだけです。その位置のピクセルの色を取得し、UI 要素と一致させます。

すべての作業が終わったら、通常どおりすべてをメイン ディスプレイに描画します。

UI 要素がまったく (またはめったに) 動かない場合、このアプローチの処理時間を大幅に短縮できることに注意してください。何かが現れたり消えたり、アニメーション化したり、サイズや位置が変更されたりした場合にのみ、セカンダリ バッファーを再描画する必要があります。

于 2013-10-31T11:14:02.997 に答える