【发布时间】:2013-10-16 09:14:07
【问题描述】:
1) 我有一个线段列表(由它们的两个端点和一个宽度定义。)
2) 这些线段是在面板中绘制的。
3) 当我的鼠标移动时(Panel.MouseMove 事件),我循环遍历线段列表。
4)Foreach:
gPath.Reset();
Pen Pen = new Pen(Color.White, 20);
gPath.AddLine(P1, P2);
return gPath.IsOutlineVisible(cursorPos, Pen);
5) 如果我得到 true,那么我知道我的光标悬停在当前线段上。
这适用于大约... 300 行左右。当我达到 1,000 时,我的程序减速停止(分析显示它是由 IsOutlineVisible 引起的)。那么,有什么方法可以提高我的命中测试算法的性能吗?我不知道 IsOutlineVisible 的效率如何,所以我不想实现该方法已经使用的任何优化。有什么想法吗?
编辑:
在深入研究我的数据后,我注意到有些行非常大。例如:
端点 1 = (16000, -16000)
端点2 = (5041448, -32868734)
(是的,其中一个坐标在负数千万……)
我验证了仅针对一个这样的线段进行命中测试就足以使我的程序停止运行,(IsOutlineVisible 需要 2-3 秒来进行测试,并且只要光标移动就会运行测试......) .
我应该在发布之前对此进行更彻底的测试。感谢所有回复(如果我最终处理数千行,二维空间索引是一个很好的建议)。
附言如果有人知道为什么大线段对 IsOutlineVisible 来说是个大问题,那就太好了。
【问题讨论】:
-
您可能想看看My Example 使用当前相关的.Net Windows UI 技术的非常相似的东西。它包括一些有趣的功能,例如行选择和突出显示。
-
谢谢,但我目前正在使用 winforms。
-
只是一个评论。我认为它会变成矩形敌人命中测试。以数学方式执行此操作将提高性能,例如边界框和向量距离应该很快。 1000 行虽然太多了
标签: c# winforms system.drawing hittest