Algorithm O(nlogn)分治算法寻找可见线

Algorithm O(nlogn)分治算法寻找可见线,algorithm,divide-and-conquer,Algorithm,Divide And Conquer,我正在尝试解决所附图片中显示的问题。我得到了分割部分,你可以递归地将线集分割成两半,斜率最小和最大的线都是可见的 我不知道如何做合并部分,虽然我不理解它 直觉上,一开始,我认为如果没有三条线在一个点相交,所有的线最终都是可见的 还有,征服部分是当我拿出看不见的线。。。据我所知,在征服阶段之前不应该有任何线条 如果有人能为我们这些大脑有点迟钝的人做出解释,我将非常感激!) 考虑一个三行示例。你有两个选择。a) 只有2条线可见b)所有3条线都可见 因此,您需要确定中间的一个是否可见。为此,您可以计算

我正在尝试解决所附图片中显示的问题。我得到了分割部分,你可以递归地将线集分割成两半,斜率最小和最大的线都是可见的

我不知道如何做合并部分,虽然我不理解它

直觉上,一开始,我认为如果没有三条线在一个点相交,所有的线最终都是可见的

还有,征服部分是当我拿出看不见的线。。。据我所知,在征服阶段之前不应该有任何线条


如果有人能为我们这些大脑有点迟钝的人做出解释,我将非常感激!)

考虑一个三行示例。你有两个选择。a) 只有2条线可见b)所有3条线都可见

因此,您需要确定中间的一个是否可见。为此,您可以计算外部两条线的交点(称为A)。如果A在中线上方,则中间的一个隐藏;如果A在中线下方,则其可见(绘制两个图形,它将是明显的)

要确定该点是在取代基之上还是之下,请在直线方程中确定其坐标(
y=ax+b
)。如果
y>ax+b
则该点位于直线上方,如果
y
则该点位于直线下方,如果
y=ax+b
则该点位于直线上(根据问题不应发生)


为了解决你的问题,我只需要按坡度的顺序画线,并尝试将它们添加到解决方案中。每次添加新行时,请检查前一行是否仍然可见,如果不可见,请将其删除(根据需要重复多次,因为新行可能会隐藏多个前一行)


如果您坚持要进行合并,则需要在合并行上应用此逻辑,以确定从中间删除了多少行。

没有说明性图像,我们只能猜测。。。在计算机gfx中,看不见的线的去除通常是通过计算曲面法线来完成的(如果网格是凸的)。在此之前,将凹面网格细分为凸面网格。可能还有其他算法利用已知的关于使用它的情况的信息,但是如果没有更多的信息,很难说你的例子指的是什么。如果您的网格是实心的(不仅仅是线框),那么您可以使用Z排序或Z缓冲,但我想这不是您想要的。如果我没有错的话,这将需要O(n^2)运行时。我们可以用nlgn吗?因为排序的缘故,它是nlgn。添加和删除是O(N),因为您只添加一行,以后可能会删除它(但只删除一次)。每次添加新行并尝试检查它是否可见时,您都在与所有其他行一起检查它,这将花费O(N)时间。因此,整个算法将采用O(n^2),因为您对所有n行都这样做。@MoGanji您仅部分正确。一行可以检查所有其他行,结果是O(N),但这不可能对每一行都发生。考虑它的一种方法是,每添加一行O(1)。对于每一行,您都有一组失败的检查,并删除一行(可能是O(N))和一个通过的检查,然后停止迭代O(1)。现在总结一下,我们添加O(N)行,我们有O(N)个检查通过并停止迭代,我们将有O(N^2)行删除。但最后一个不可能发生,因为您只能删除O(N)行,因为我们总共只有N@Sorin这是一个很好的解释,但是,如何确保在每次迭代中删除一行呢?如果迭代最终没有删除任何行呢?在这种情况下,有可能有O(n^2),对吗?