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)如果我真的,那麼我知道我的光標懸停在當前線段。
這適用於約300行左右。當我達到1000時,我的程序放慢速度(分析表明它是由IsOutlineVisible引起的)。那麼,有什麼辦法可以提高我的命中測試算法的性能嗎?我不知道IsOutlineVisible的效率如何,因此我不想實現該方法已經使用的任何優化。有任何想法嗎?
編輯:
在挖掘我的數據後,我注意到一些線條非常大。例如:
端點1 =(16000 -16000)
端點2 =(5041448,-32868734)
(是的,座標之一是否定的數以千萬計的......)
我證明只針對一個這樣的線段進行命中測試就足以讓我的程序停下來(IsOutlineVisible需要2-3秒才能完成測試,並且只要光標移動就運行測試...)。
我應該在發佈之前對此進行更徹底的測試。感謝所有的迴應(如果我最終處理了數千行代碼,那麼2D空間索引是一個很好的建議)。
p.s.如果有人知道爲什麼一個大的線段是IsOutlineVisible的一個大問題,那就太好了。
您可能想看看[我的示例](http://stackoverflow.com/a/15469477/643085)使用當前相關的類似事物。淨Windows UI技術。它包含一些有趣的功能,如線條選擇和突出顯示。 –
謝謝,但我目前使用winforms。 –
只是一個評論。我認爲它然後成矩形敵人命中測試。數學運算會提高性能,例如邊界框和距離矢量應該很快。儘管1000行太多了 – GorillaApe