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, това би било чудесно.