我有一个充满大量圆圈(Ellipse2D)的面板。圆圈存储在二维数组(行和列)中。
我的目标是当我将鼠标拖到圆圈上时能够“绘制”圆圈。我最终会想要使用选择形状来改变选择形状中包含的所有圆圈的颜色。
我正在使用鼠标拖动侦听器,它不断扫描整个二维数组并检查当前点是否在圆圈内。像这样:
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 方法只是简单地填充圆圈。进行此更改将速度提高了两个数量级。现在效果好多了。虽然,我仍然可以以适中的速度扫过面板并错过几圈。所以我可能需要进一步优化。
Graphics2D g2d = (Graphics2D) getGraphics();
for (Circle2D c : circles) {
if (c.contains(p)) {
c.setColor(currentColor);
//Graphics2D g2d = (Graphics2D) getGraphics(); (moved)
c.draw(g2d);
}
}