创建一个“不透明”的正方形

时间:2013-11-11 18:13:16

标签: algorithm

我正在编写一个程序,根据用户为每个方格给出的边的坐标和长度,将正方形的圆周打印到屏幕上。

如果方块重叠,则方块应该在彼此的顶部,以便底部方块被顶部方块隐藏。

方块的顺序是根据它们输入程序的顺序设置的(​​首先是底部)。

例如:

&安培;&安培;&安培;&安培;
&安培; &安培;
&安培; &安培; $$$
&安培;&安培;&安培;&安培; $
$ $
$ $
$$$$$

我提出的最佳算法是每个方格的时间复杂度为O(n ^ 2)。

有关如何使方块“不透明”的任何建议吗?

1 个答案:

答案 0 :(得分:1)

你提到的O(n^2)算法可能是经典的“画家算法”,你可以简单地从底部渲染(“栅格化”)正方形(“栅格化”)。这是一种非常好的算法,广泛用于计算机图形学。但是,任何“栅格”算法都具有相同的时间复杂度O(n^2)每平方。

但是如果你想要一个渐近更快的算法,你必须寻找一个“矢量”算法,即与正方形的边缘一起工作的算法,但不浪费时间处理它们的内部。构建这种算法的一种方法是以矢量形式预先计算最终可见边缘布局,然后仅在屏幕上绘制可见边缘。

要实现类似的东西,每个方格必须首先由一组四条边表示。然后单次通过扫描线算法将消除不可见边缘。然后,您可以在屏幕上渲染剩余的可见边缘。这个算法将比“画家的算法”复杂得多,因为你必须实现扫描和边缘消除逻辑。但对于这个特殊的问题(特别是考虑到它涉及正交几何),它并不是那么困难。

P.S。这里的一个关键点是后一种方法只有在预先知道所有方块的情况下才能工作,即它只适用于离线问题。如果你正在处理一个在线问题,即你必须在收到输入时立即绘制方格,而不是事先知道所有方格,那么在一般情况下,没有理由在这里尝试改进任何东西。只需使用画家的算法。