【发布时间】:2011-12-05 13:58:43
【问题描述】:
我正在开发一个图形应用程序,用户可以在其中绘制任意数量的线(从 A 点到 B 点有一定的粗细)、矩形或椭圆在画布上。
完成后,我有一组形状数据,指示每个形状的位置和绘制的线条,我需要确定作为研究项目的一部分,它们着色了多少唯一像素。
我的简单算法是为每个形状实现 bool shape.Contains(x,y) 并为图像中每个像素的每个绘制形状调用它,以确定该像素是由直线、矩形还是椭圆绘制的。
换一种方式,我可以创建 void shape.SetPixels(bool[,] canvas) 并将每个形状设置为真,它包含的每个像素。这是我实际实现的,对于大型数据集,它非常缓慢。
我感觉有一种更直接的方法可以从原始形状数据到我需要的输出,而无需检查每个像素。所以我的问题是,给定一组形状数据,是否有一个 O(n) 函数 bool[,] IsColored(int x, int y) {} 可以更直接地为彩色像素生成真/假矩阵我给出的想法?
【问题讨论】:
-
如果你画了呢?生成的位图本质上就是这样一个矩阵
-
O(n) 是什么意思?实现 shape.Contains(x,y) 并为每个形状调用一次是 O(n),其中 n 是形状的数量。
-
为什么形状不能只返回它包含的像素集?
-
您的
SetPixels(bool[,])版本中的哪一部分“非常慢”?当然不是查找 - 它是在构建 bool 值数组吗?在这种情况下,您可能只需要为您的形状提供更好的渲染算法。 -
一个警告:
Bitmap类上的GetPixel和SetPixel方法非常慢。如果要处理多个像素,则需要使用直接的低级访问。