Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.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
C++ 直线删除场景:二维空间中的圆与曲线相交问题_C++_Algorithm_Data Structures_Quadtree - Fatal编程技术网

C++ 直线删除场景:二维空间中的圆与曲线相交问题

C++ 直线删除场景:二维空间中的圆与曲线相交问题,c++,algorithm,data-structures,quadtree,C++,Algorithm,Data Structures,Quadtree,目前,我在项目中遇到了一个行擦除场景。我希望从那里寻求一些建议。以下是对具体问题的抽象: m*n的二维区域有许多不规则曲线,每个曲线记录在许多点:[(x1,y1),(x2,y2),(x3,y3)…],存储为数组:array1,array2…,现在有一个半径为r的圆(x,y),我需要确认圆和这些线是否有交点,并选择有交点的线。 此外,圆的坐标和半径都在不断变化,不规则曲线也在变化,但是变化不是很快,所以需要考虑使用Cache来提高性能。 显示案例的图片: 我的一些想法: 事实上,即使它一次遍历所

目前,我在项目中遇到了一个行擦除场景。我希望从那里寻求一些建议。以下是对具体问题的抽象:

m*n的二维区域有许多不规则曲线,每个曲线记录在许多点:[(x1,y1),(x2,y2),(x3,y3)…],存储为数组:array1,array2…,现在有一个半径为r的圆(x,y),我需要确认圆和这些线是否有交点,并选择有交点的线。 此外,圆的坐标和半径都在不断变化,不规则曲线也在变化,但是变化不是很快,所以需要考虑使用Cache来提高性能。 显示案例的图片:

我的一些想法: 事实上,即使它一次遍历所有点,复杂度也是O(N),但这里的N有点大,而且因为圆是实时变化的,所以性能还是比较差。 我可以选择使用四叉树,但它不是典型的二维碰撞场景,并且我也应该考虑当前存储方法不满意,所以我需要对两个数据结构进行实时同步更新,但总体外观应该比第一种方法更好,但我不知道这是不是正确的方式。 此外,我认为应该有一个更好的解决办法

有什么好的想法或相关的经验可以分享吗?
非常感谢您

从制作非传统2D环境的个人经验来看,我所能说的就是尝试不同的东西,看看什么是有效的。我无法从你的描述中分辨出你是否能够强行执行碰撞检测,或者你是否需要一个四叉树;如果有非常多的曲线,可能需要对其进行多线程处理

我认为适当的做法是为每个多段线创建一个
类(因为它们本质上是段的集合,而不是曲线),并使用四叉树来区分哪些段距离圆最近,哪些段也将放置在四叉树中。这样,无论何时触发碰撞,都可以将每个重叠段标记为“选定”,并执行需要执行的任何操作。我认为只有把它们作为一系列的点才能让生活变得更艰难,而且这是图形管道唯一会发现有用的东西


如果你发现直线上的点太密集,我建议你使用折线抽取算法来降低复杂性;当然,如果这仍然符合您的目的。

根据制作非传统2D环境的个人经验,我所能说的就是尝试不同的方法,看看哪些方法有效。我无法从你的描述中分辨出你是否能够强行执行碰撞检测,或者你是否需要一个四叉树;如果有非常多的曲线,可能需要对其进行多线程处理

我认为适当的做法是为每个多段线创建一个
类(因为它们本质上是段的集合,而不是曲线),并使用四叉树来区分哪些段距离圆最近,哪些段也将放置在四叉树中。这样,无论何时触发碰撞,都可以将每个重叠段标记为“选定”,并执行需要执行的任何操作。我认为只有把它们作为一系列的点才能让生活变得更艰难,而且这是图形管道唯一会发现有用的东西


如果你发现直线上的点太密集,我建议你使用折线抽取算法来降低复杂性;当然,如果这仍然符合您的目的。

我假设您是为某个图形应用程序执行此操作的-如果您希望应用程序具有动画效果或响应性,您可能需要在一个单独的线程中计算碰撞以保持响应。这可能会导致各种复杂的同步问题-我非常怀疑对一些2d形状的命中测试对于现代硬件来说会很费力,但首先OP需要先让它工作,然后担心性能,如果它确实工作的话一个问题。此外,我认为在一个单独的线程中进行2d碰撞检测的计算会有点过分,因为它们的计算量不会太大,所以你可能会让事情变得更慢。你可能是对的;在我的用例中,它有10000多个多边形,因此如果没有多线程,我的应用程序就无法使用,但我不记得它的实现会有多么困难。我将更改原始帖子。我假设您是为某个图形应用程序执行此操作-如果您希望应用程序具有动画或响应性,您可能需要在一个单独的线程中计算碰撞以保持响应。这可能会导致各种复杂的同步问题-我非常怀疑对一些2d形状的命中测试对于现代硬件来说会很费力,但首先OP需要先让它工作,然后担心性能,如果它确实工作的话一个问题。此外,我认为在一个单独的线程中进行2d碰撞检测的计算会有点过分,因为它们的计算量不会太大,所以你可能会让事情变得更慢。你可能是对的;在我的用例中,它有10000多个多边形,因此如果没有多线程,我的应用程序就无法使用,但我不记得它的实现会有多么困难。我将更改原来的帖子。有多少行?每条线有多少个点?用一条包含较少点的曲线来近似每条曲线是否适用?有多少条线?每条线有多少个点?用一条包含较少点的曲线近似每条曲线是否适用?