1)我有一个线段列表(由它们的两个端点和一个宽度定义。)
2)这些线段是在面板中绘制的。
3) 当我的鼠标移动时(Panel.MouseMove 事件),我循环遍历线段列表。
4)前锋:
gPath.Reset();
Pen Pen = new Pen(Color.White, 20);
gPath.AddLine(P1, P2);
return gPath.IsOutlineVisible(cursorPos, Pen);
5)如果我是真的,那么我知道我的光标悬停在当前线段上。
这适用于大约... 300 行左右。当我达到 1,000 时,我的程序减速停止(分析显示它是由 IsOutlineVisible 引起的)。那么,有什么方法可以提高我的命中测试算法的性能吗?我不知道 IsOutlineVisible 的效率如何,所以我不想实现该方法已经使用的任何优化。有任何想法吗?
编辑:
挖掘我的数据后,我注意到有些行非常大。例如:
端点1 = (16000, -16000)
端点2 = (5041448, -32868734)
(是的,其中一个坐标是负数千万……)
我验证了仅针对一个这样的线段进行命中测试就足以使我的程序停止运行(IsOutlineVisible 需要 2-3 秒来进行测试,并且只要光标移动就会运行测试......)。
在发布之前,我应该对此进行更彻底的测试。感谢所有回复(如果我最终处理数千行,二维空间索引是一个很好的建议)。
ps 如果有人知道为什么大线段对 IsOutlineVisible 来说是个大问题,那就太好了。