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, поэтому я не хочу реализовывать какие-либо оптимизации, которые уже использует этот метод. Любые идеи?
EDIT:
Покопавшись в своих данных, я заметил, что некоторые строки были очень большими. Например:
конечная точка1 = (16000, -16000)
конечная точка2 = (5041448, -32868734)
(да, одна из координат находится в отрицательных десятках миллионов...)
Я убедился, что проверки попадания только на один такой сегмент строки достаточно, чтобы остановить мою программу (IsOutlineVisible выполняет тест за 2-3 секунды, и тест запускается всякий раз, когда перемещается курсор...).
Я должен был проверить это более тщательно, прежде чем публиковать. Спасибо всем, кто ответил (двухмерный пространственный индекс — отличное предложение, если мне придется обрабатывать тысячи строк).
p.s. Если кто-нибудь знает, почему большой сегмент строки является такой большой проблемой для IsOutlineVisible, это было бы здорово.