在自定义控件上,我有一系列应根据给定打开的 LED 对象GraphicsPath
(例如,见下图)。目前我正在使用graphicsPath.IsVisible(ledPoint)
,但是由于我有很多 LED,因此通过所有 LED 的迭代可能非常缓慢,尤其是在路径复杂的情况下(例如示例中路径的倒数)。
你们中的任何人有什么想法可以更聪明地加速迭代吗?如果举个例子太复杂,它可能会将我重定向到适当的资源。请考虑该控件位于 GDI+ 中,因此不能选择重新设计到另一个引擎中。
编辑
在我的 PC (i7 3.6GHz) 上,当GraphicsPath
我只有一个简单的 100x100 像素矩形,然后我在我的控件上计算逆,它的大小约为 500x500 像素(因此,结果GraphicsPath
将是一个 500x500 的矩形,带有一个“孔” 100x100),测试 6000 个 LED 大约需要 1.5 秒,这会太大影响用户体验。
在 Matthew Watson 回复之后,我将详细介绍我的示例:
//------ Base path test
GraphicsPath path = new GraphicsPath();
path.AddRectangle(new Rectangle(100, 100, 100, 100));
var sw = System.Diagnostics.Stopwatch.StartNew();
for (int x = 0; x < 500; ++x)
for (int y = 0; y < 500; ++y)
path.IsVisible(x, y);
Console.WriteLine(sw.ElapsedMilliseconds);
//------ Inverse path test
GraphicsPath clipRect = new GraphicsPath();
clipRect.AddRectangle(new Rectangle(0, 0, 500, 500));
GraphicsPath inversePath = Utility.CombinePath(path, clipRect, CombineMode.Complement);
sw.Restart();
for (int x = 0; x < 500; ++x)
for (int y = 0; y < 500; ++y)
inversePath.IsVisible(x, y);
Console.WriteLine(sw.ElapsedMilliseconds);
在我的 PC 上,第一次测试大约 725 毫秒,第二次测试大约 5000 毫秒。这只是一条相当简单的路径。GraphicsPath
是由用户的鼠标移动生成的,用户可以执行多种路径组合(反转、联合、交叉......我为此使用GPC )。因此,通过测试 的否定来测试反转GraphicsPath.IsVisible()
可能会很棘手。
inversePath
返回的 from非常Utility.CombinePath
简单,有以下几点(左PathPoints
、右PathTypes
):