多数の円 (Ellipse2D) で満たされたパネルがあります。円は 2 次元配列 (行と列) に格納されます。
私の目標は、マウスを円の上にドラッグするときに円を「ペイント」できるようにすることです。最終的には、選択図形に含まれるすべての円の色を変更する選択図形を使用したいと考えています。
2次元配列全体を継続的にスキャンし、現在の点が円の内側にあるかどうかを確認するマウスドラッグリスナーを使用しています。そのようです:
addMouseMotionListener(new MouseAdapter() {
public void mouseDragged(MouseEvent e) {
currentColor = ColorSliderPanel.getRGB();
for (int x = 0; x < numColumns; x++) {
for (int y = 0; y < numRows; y++) {
if (circle[x][y].contains(e.getX(), e.getY())) {
circle[x][y].setColor(currentColor);
repaint();
}
}
}
}
});
上記のコードは機能しますが、すべてのオブジェクトをチェックしているため、非常に低速です (1000 円以上)。
もっと良い方法があるはずです。四分木について少し読んだことがありますが、四分木が必要以上の馬力を持っているかどうかはわかりません。
ありがとう
以下のコメントのいくつかに基づいて、次の変更を加えました。Circles は線形の ArrayList になりました。draw メソッドは単純に円を塗りつぶします。この変更により、速度が 2 桁向上しました。今でははるかにうまく機能します。ただし、パネルを適度な速度でスイープして、いくつかの円を逃すことはできます。したがって、さらに最適化する必要があるかもしれません。
Graphics2D g2d = (Graphics2D) getGraphics();
for (Circle2D c : circles) {
if (c.contains(p)) {
c.setColor(currentColor);
//Graphics2D g2d = (Graphics2D) getGraphics(); (moved)
c.draw(g2d);
}
}