У меня есть панель, которая заполнена большим количеством кругов (Ellipse2D). Круги хранятся в двумерном массиве (строки и столбцы).
Моя цель - уметь рисовать круги, когда я перетаскиваю на них мышь. В конечном итоге я захочу использовать формы выделения, которые изменят цвет всех окружностей, содержащихся в форме выделения.
Я использую слушатель перетаскивания мышью, который непрерывно сканирует весь 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+ кружков), так как он проверяет каждый отдельный объект.
Должен быть лучший способ. Я немного читал о Quadtree, но я не уверен, что у quadtree больше лошадиных сил, чем мне нужно.
Спасибо
Я внес следующие изменения, основываясь на некоторых комментариях ниже. Circles теперь является линейным ArrayList. Метод рисования просто заполнить круг. Внесение этого изменения улучшило скорость на два порядка. Теперь это работает намного лучше. Хотя я все еще могу скользить по панели с умеренной скоростью и пропустить несколько кругов. Так что мне может понадобиться оптимизировать дальше.
Graphics2D g2d = (Graphics2D) getGraphics();
for (Circle2D c : circles) {
if (c.contains(p)) {
c.setColor(currentColor);
//Graphics2D g2d = (Graphics2D) getGraphics(); (moved)
c.draw(g2d);
}
}