gpt4 book ai didi

java - 在固定网格中定位和/或选择图形对象的有效方法

转载 作者:行者123 更新时间:2023-11-29 07:22:30 25 4
gpt4 key购买 nike

我有一个面板,其中填充了大量圆圈 (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);
}
}

最佳答案

我个人的做法是这样的:

  • 制作一个线性圆圈阵列(或链表,由您选择)。
  • 在您的事件监听器中,您对数组进行线性迭代,针对鼠标位置点击测试每个圆圈,如果测试通过,则更改颜色
  • 这里是最大的优化:因为我们讨论的是相当高的绘制频率(每次鼠标移动),您想要确定哪些圆必须要重绘。当您遍历上面的数组时,记录必须更改的最大边界框的运行计数(包围每个必须重绘的圆的矩形)
  • 现在删除上面计算出的矩形并再次遍历圆圈,只绘制矩形内部的圆圈(可能会切断某些圆圈,但绘制适合矩形内部且不接触外部的所有圆圈)。

注意:迭代 1k+ 圆 两次 几乎是瞬时的,您真正的问题在于圆的绘制(以及奇怪的 x/y 存储机制)。图形 I/O 一直很慢,尤其是 Java 的处理方式。

进一步的优化是创建一个内存位图并在其中绘制矩形,然后在主表面上一次将其全部 blit,以进一步减少闪烁(由缓慢重绘过程引起每次更新)

关于java - 在固定网格中定位和/或选择图形对象的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2259585/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com