根据您提供的示例图片,您的圆圈似乎具有近乎恒定的半径。如果它们的半径不能小于大量像素,则可以利用圆的简单几何来尝试图像空间方法。
假设您将渲染表面划分为正方形网格,以便最小的渲染圆可以像这样适合网格:
圆的半径是 sqrt(10) 网格单位,并覆盖至少 21 个方格,因此如果您将与任何圆完全重叠的方格标记为已绘制,您将消除大约 21/10pi 的圆表面部分,即大约是 2/3。
您可以通过正方形here获得一些最佳圆形覆盖的想法
剔除过程看起来有点像反向画家算法:
For each circle from closest to farthest
if all squares overlapped (even partially) by the circle are painted
eliminate the circle
else
paint the squares totally overlapped by the circle
您还可以通过绘制未完全被给定圆圈覆盖的网格正方形(或消除从已绘制表面略微溢出的圆圈)来“作弊”,以增加消除的圆圈数量为代价,但会产生一些误报。
然后您可以使用 Z 缓冲区算法渲染剩余的圆圈(即让 GPU 完成其余工作)。
基于 CPU 的方法
这假设您将网格实现为内存位图,而无需 GPU 的帮助。
要确定要绘制的正方形,您可以使用基于圆心相对于网格的距离(示例图像中的红叉)和实际圆半径的预计算模式。
如果直径的相对变化足够小,您可以定义一个二维的图案表,以圆半径和中心距最近网格点的距离为索引。
检索到正确的模式后,您可以使用简单的对称性将其应用到适当的位置。
同样的原理可用于检查一个圆是否适合已绘制的表面。
基于 GPU 的方法
自从我从事计算机图形工作以来已经有很长时间了,但如果当前的技术允许,您可以让 GPU 为您绘制。
绘制网格将通过渲染每个缩放以适应网格的圆圈来实现
检查消除将需要读取包含圆的所有像素的值(缩放到网格尺寸)。
效率
网格维度应该有一些最佳点。更密集的网格将覆盖更高百分比的圆形表面,从而消除更多的圆形(更少的误报),但计算成本会增加 o(1/grid_step²)。
当然,如果渲染的圆可以缩小到大约 1 像素直径,您也可以转储整个算法并让 GPU 完成工作。但与基于 GPU 像素的方法相比,效率随着网格步长的平方而增长。
在我的示例中使用网格,对于完全随机的一组圆圈,您可能会预期大约 1/3 的假阴性。
对于您的图片,它似乎定义了体积,应消除 2/3 的前景圆圈和(几乎)所有后向圆圈。剔除 80% 以上的圈子可能是值得的。
话虽如此,在蛮力计算竞赛中击败 GPU 并不容易,所以我对你可以预期的实际性能提升只有最模糊的概念。不过,尝试一下可能会很有趣。