Я написал приложение с графическим интерфейсом на основе Win32 API, которое использует функции GDI+, такие как DrawCurve() и DrawLine().
Это приложение рисует линии и кривые, которые представляют мультиграф.
Структура данных для ребра представляет собой просто структуру из пяти целых чисел. (x1, y1, x2, y2 и идентификатор)
Если между двумя вершинами есть только одно ребро, отрезок прямой линии рисуется с помощью DrawLine(). Если имеется более одного ребра, кривые рисуются с помощью DrawCurve(). Здесь я расширяю прямолинейные ребра вокруг средней точки двух вершин, делая их кривыми. Точка, отстоящая от нее на несколько единичных пикселей, вычисляется с использованием уравнения нормальной линии. Если добавляется больше ребер, то выбирается пиксель, отстоящий от средней точки на два единичных пикселя, затем в следующий раз — на 3 единичных пикселя и так далее.
Теперь у меня есть два вопроса по обнаружению щелчка по краям.
Что мне делать при поиске прямых ребер, чтобы минимизировать время поиска?
Проверить, находится ли выбранный пиксель на сегменте прямой, довольно просто, но сравнение всех ребер будет неэффективным, если количество ребер велико. Кажется возможным сделать это за O(log n), где n — количество ребер.
РЕДАКТИРОВАТЬ: на данный момент ребра (класс Edge) хранятся в std::map, который отображает идентификатор ребра (int)' s в объекты Edge, и я подумываю объявить еще один контейнер, который сопоставляет пиксели с идентификаторами ребер.
Я рассматриваю возможность использования бинарных деревьев поиска, но что может быть ключом? Или я должен использовать только массив 2D-пикселей?Могу ли я получить массив точек, используемый DrawCurve()? Если это невозможно, то я должен пересчитать кардинальный сплайн, получить массив точек и проверить, соответствует ли точка, по которой щелкнул пользователь, какой-либо точке в этом массиве.