Всем привет!Перейду сразу к делу.
Использую последний Qt.В приложении есть область для рисования/операций над вершинами и ребрами. Рисование осуществляется при помощи OpenGL в виджете, который наследует QOpenGLWidget и QOpenGLFunctions. То есть имеется динамический массив вершин, которые потом будут отрисоваваться как GL_POINTS. Ну и динамический массив индексов массива вершин (для отрисовки ребер как GL_LINES в функции glDrawElements)
Размер области рисования может меняться. Матрица проекций генерируется функцией glOrtho(0.0,1.0,0.0,1.0,-1.0,1.0). То есть левый нижний угол всегда имеет координату (0.0,0.0), а правый верхний (1.0,1.0)
Помимо добавления вершин, их нужно еще выделять для разных преобразований над ними (двигать, соединить пару ребром и т.д.)
Вот у меня вопрос как раз относительно алгоритма выделения - хочется чтобы он был наиболее оптимальным по быстродействию.
Что приходит на ум: вершины,как мне кажется, стоить хранить в хэш-таблице (В Qt для этого QHash есть). Но есть 2 для меня проблемы:
1)Что именно сделать ключом вершины? Простое произведение x-координаты на y-координату не даст инъективного отображения.
Думаю проинвертировать биты x-координаты и полученное число умножить на y-координату и результат сделать ключом (можно инвертировать и y, без разницы, главное что-то одно). Однако беда в том, что точки на прямой x=y все еще будут иметь один и тот же ключ. Есть у кого предложения, по какому алгоритму считать ключ?
2)Когда я буду тыкать в область виджета, я 99,9% не попаду точно в точку, которая была ранее нарисована, а где-то рядом. То есть преобразовать координаты тыкнутого места в ключ и по нему смотреть вершину в хэш-таблице не получится..... то есть при тыкании нужно получать что-то вроде диапазона ключей, размер которого зависит радиуса выделения (тыкнутая точка - центр окружности) и потом ,oh my god!, проверять, если что-то из диапазона ключей в хэш-таблице, и не просто есть ли, а самое ближайшее к ключу тыкнутой точки. Сомневаюсь я, что это будет быстро. Однако всякие Blender-, 3dMax-ы, Maya : тыкнешь в окне проекций - и вершина тут же выделена, и она будет выделена также быстро в том числе и в окне перспективы - а там и вовсе работа с трехмерным.
Вот какой алгоритм? Может я что упускаю/туплю/не знаю? Наверняка у всего этого должно быть какое-то изящное решение.