Russian Qt Forum

Программирование => Алгоритмы => Тема начата: kibsoft от Август 16, 2013, 14:40



Название: Принадлежность точки кривой
Отправлено: kibsoft от Август 16, 2013, 14:40
Существует массив контрольных точек кривой, нарисованной пользователем(рисование карандашом, как в paint и т.д.). Как можно определить, принадлежит ли конкретная точка этой кривой? Проблема в том, что кривая может иметь разную толщину. Это нужно для выделения кривой, когда пользователь кликнул по ней. Поэтому нужна довольно быстрая проверка.


Название: Re: Принадлежность точки кривой
Отправлено: voral от Август 16, 2013, 15:43
Самый быстрый, наверное, это иметь двумерный массив всей картинки. Значение каждого элемента 1 или 0. 1 линия тут есть, 0 нет. По клику просто берем значеие в соответствие с координатами.

Если объектов/линий может быть много и пересекаются. Надо такой массив на каждую "линию".

Если размер картинки может быть большой и жалко памяти - надо придумать как свести в памяти только к хранению 1.



А по цвету в вашей задаче не вариант?


Название: Re: Принадлежность точки кривой
Отправлено: kibsoft от Август 16, 2013, 16:13
Нет, цвет тоже разный может быть. Решил попробовать использовать QPainterPath в качестве backend'а. А вообще рисование происходит на QML Canvas.


Название: Re: Принадлежность точки кривой
Отправлено: Igors от Август 16, 2013, 17:36
Полагается что "аналитика кривой" неизвестна.

Разбить кривую на отрезки, искать минимальное расстояние от точки до отрезка и сравнивать его с какой-то дельтой.

Оптимизация - сортируем точки по Х и с помощью lower_bound находим точку A - ближайшую к мыше. Находим расстоянме до отрезка с точкой A. Дальше просматриваем сортированный массив вперед и назад от точки A пока расстояние по X не превысит найденное.


Название: Re: Принадлежность точки кривой
Отправлено: kibsoft от Август 16, 2013, 17:51
Igors, как я понял, тут не учитывается толщина линии?


Название: Re: Принадлежность точки кривой
Отправлено: Igors от Август 16, 2013, 18:49
как я понял, тут не учитывается толщина линии?
Можно учесть отняв половину ширины от найденного расстояния. Как правило юзверь не попадает точно даже в достаточно жирную линию, нужно вводить какой-то запас ("апертуру"). А мудоить с экраном/пикселями - дело тухлое