Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在固定网格中定位和/或选择图形对象的有效方法_Java_Select_Object_Locate_Quadtree - Fatal编程技术网

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

Java 在固定网格中定位和/或选择图形对象的有效方法,java,select,object,locate,quadtree,Java,Select,Object,Locate,Quadtree,我有一个面板,里面有大量的圆圈和椭圆。圆存储在二维数组行和列中 我的目标是能够在我将鼠标拖动到圆圈上时绘制圆圈。我最终会希望使用选择形状来更改选择形状中包含的所有圆的颜色 我使用了一个鼠标拖动的监听器,它不断扫描整个2d数组,并检查当前点是否在圆的内部。像这样: addMouseMotionListener(new MouseAdapter() { public void mouseDragged(MouseEvent e) { cur

我有一个面板,里面有大量的圆圈和椭圆。圆存储在二维数组行和列中

我的目标是能够在我将鼠标拖动到圆圈上时绘制圆圈。我最终会希望使用选择形状来更改选择形状中包含的所有圆的颜色

我使用了一个鼠标拖动的监听器,它不断扫描整个2d数组,并检查当前点是否在圆的内部。像这样:

        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();
                    }
                }
            }

        }
    });

在现代计算机上,几千次方法调用需要10微秒的时间,这绝对不是人类可以注意到的延迟,更不用说真正的慢了

因此,性能问题的原因必须在别处——可能是在重新绘制中,这会导致调用容器的绘制。如果这画了1000个圈,这可能需要将近一秒钟的时间


这就是为什么在进行优化之前,您应该始终测量性能瓶颈的实际位置。

在当代计算机上,数千个方法调用占用了大约10微秒的时间,这绝对不是人类可以注意到的延迟,更不用说真正的慢了

因此,性能问题的原因必须在别处——可能是在重新绘制中,这会导致调用容器的绘制。如果这画了1000个圈,这可能需要将近一秒钟的时间


这就是为什么在优化之前,您应该始终测量性能瓶颈的实际位置。

每次调用mouseDragged时,都要在整个圆圈上迭代,这是一种难以置信的时间浪费。您可以选择的一个方法是从JTable开始,开发一些方法,使您能够在MouseEvent中包含的点上识别行和列。如果您知道列的宽度和行的高度,那么识别圆的单元格应该不会那么困难

每次调用mouseDragged都要在整个圆圈上迭代,这是一种难以置信的时间浪费。您可以选择的一个方法是从JTable开始,开发一些方法,使您能够在MouseEvent中包含的点上识别行和列。如果您知道列的宽度和行的高度,那么识别圆的单元格应该不会那么困难

我个人的做法是:

制作圆形线性阵列或链表,由您选择。 在事件侦听器中,您在数组上线性迭代,点击鼠标位置测试每个圆,如果测试通过,则更改颜色 这是最大的优化:因为我们讨论的是每次鼠标移动都以相当高的频率绘制,所以您需要确定哪些圆必须重新绘制。当您在上面的数组上进行迭代时,请保持必须更改的最大边界框的运行计数—一个围绕必须重新绘制的每个圆的矩形 现在,删除上面计算的矩形并再次迭代圆,只绘制矩形内部的圆,可能会切断某些圆位,但绘制适合矩形内部且不接触外部的所有圆。 注意:在1k+圈上迭代两次几乎是瞬间的,你真正的问题在于画这些圈和奇怪的x/y存储机制。图形I/O是而且永远是缓慢的,尤其是Java的方式


进一步的优化是创建一个内存位图并在其中绘制矩形,然后在主曲面上一次将其全部显示出来,以进一步减少每次更新时缓慢的重画过程所导致的闪烁,我个人这样做的方式是:

制作圆形线性阵列或链表,由您选择。 在事件侦听器中,您在数组上线性迭代,点击鼠标位置测试每个圆,如果测试通过,则更改颜色 这是最大的优化:因为我们讨论的是每次鼠标移动都以相当高的频率绘制,所以您需要确定哪些圆必须重新绘制。当您在上面的数组上进行迭代时,请保持必须更改的最大边界框的运行计数—一个围绕必须重新绘制的每个圆的矩形 现在,删除上面计算的矩形并再次迭代圆,只绘制矩形内部的圆,可能会切断某些圆位,但绘制适合矩形内部且不接触外部的所有圆。 注意:在1k+圈上迭代两次几乎是瞬间的,你真正的问题在于画这些圈和奇怪的x/y存储机制。图形I/O是而且永远是缓慢的,尤其是Java的方式

进一步的优化是创建一个内存位图并绘制re 在主曲面上一次点击一个角,以进一步减少每次更新时缓慢重画过程引起的闪烁。该功能具有可移动、可调整大小的彩色节点,可通过拖动边界矩形进行选择。实现通过显示矩形边框高亮显示选定节点。在下图中,选择了绿色和黑色节点。改为改变颜色将是对节点的绘制方法的简单更改

此功能具有可移动、可调整大小的彩色节点,可以通过拖动边界矩形来选择这些节点。实现通过显示矩形边框高亮显示选定节点。在下图中,选择了绿色和黑色节点。改为改变颜色将是对节点的绘制方法的简单更改


你说这些圆存储在二维数组中。数组索引和圆的位置之间有关系吗?如果是这样的话,那么只在选定范围内的索引上进行迭代怎么样?请定义非常慢的索引。我们这里说的是毫秒、秒还是分钟?非常慢,我的意思是当我在面板上拖动鼠标时,除非我缓慢拖动,否则会跳过几个。你说圆圈存储在2d数组中。数组索引和圆的位置之间有关系吗?如果是这样的话,那么只在选定范围内的索引上进行迭代怎么样?请定义非常慢的索引。我们这里说的是毫秒、秒还是分钟?说的真的很慢,我的意思是当我在面板上拖动鼠标时,除非我慢慢拖动,否则会跳过几个。如何传递边界矩形进行绘制?你不会,绘制将始终绘制所有内容;只是在鼠标移动事件处理程序中,您只在矩形内绘制。你不调用repaint,你在内部处理绘画。啊,我不知道我可以通过调用getGraphics获得图形,因为我们已经在事件调度线程中。。。谢谢你的启发!谢谢调用getGraphics,然后在内部绘制圆,将速度提高了两个数量级。现在画得更流畅了。尽管如此,我仍然可以扫除鼠标并错过一些圆圈。我没有使用您最大的优化,因为我不确定其意图。我还没有实现一个选择矩形,只是在拖动和绘制。这种优化只适用于选择矩形,对吗?再次感谢。对于您的高速扫描问题,请按住变量中的最后一个鼠标位置,并对旧位置和当前位置之间的每个点应用您的算法。再看看代码,只在函数中调用一次getGraphics,然后使用结果,不要在循环中调用它。我不知道Java的内部结构,但在win32 gdi/gdi+中,每次获得内部图形对象时,都会受到相当大的性能损失。如何通过边界矩形进行绘制?不知道,绘制总是绘制所有内容;只是在鼠标移动事件处理程序中,您只在矩形内绘制。你不调用repaint,你在内部处理绘画。啊,我不知道我可以通过调用getGraphics获得图形,因为我们已经在事件调度线程中。。。谢谢你的启发!谢谢调用getGraphics,然后在内部绘制圆,将速度提高了两个数量级。现在画得更流畅了。尽管如此,我仍然可以扫除鼠标并错过一些圆圈。我没有使用您最大的优化,因为我不确定其意图。我还没有实现一个选择矩形,只是在拖动和绘制。这种优化只适用于选择矩形,对吗?再次感谢。对于您的高速扫描问题,请按住变量中的最后一个鼠标位置,并对旧位置和当前位置之间的每个点应用您的算法。再看看代码,只在函数中调用一次getGraphics,然后使用结果,不要在循环中调用它。我不知道Java的内部结构,但在win32 gdi/gdi+中,每次获得内部图形对象时,都会受到相当大的性能损失。
  Graphics2D g2d = (Graphics2D) getGraphics();

            for (Circle2D c : circles) {
                if (c.contains(p)) {
                    c.setColor(currentColor);
                   //Graphics2D g2d = (Graphics2D) getGraphics(); (moved)
                    c.draw(g2d);
                }
            }