Название: Qwt: попадание точки на курву Отправлено: vfilatov от Декабрь 27, 2010, 18:52 Привет всем!
Есть QwtPlot, на нём QwtPlotCurve. Как для заданной точки определить, попадает ли она на курву или нет? С учётом того, что курва может быть интерполирована разными способами, в зависимости от установленных свойств. Название: Re: Qwt: попадание точки на курву Отправлено: AlekseyK от Декабрь 27, 2010, 20:01 А что за задача? Посмотри примеры Qwt, кажется там было что-то подобное. Точно есть event (или сигнал) при нажатии на линию или точку.
Название: Re: Qwt: попадание точки на курву Отправлено: vfilatov от Декабрь 27, 2010, 21:20 Да задача простая, юзер водит мышкой над графиком и когда мышка над курвой, нужно показать всплывающую подсказку. Подсказку показываю через QwtPlotPicker, там в
virtual QwtText trackerText (const QwtDoublePoint &) const передаются координаты точки. Но как понять, принадлежит ли эта точка курве, я пока не знаю. В примерах что-то ничего похожего не нашёл. Максимум в примере event_filter можно таскать курву, но только за точки, на основе которых она постороена, это не интересно. Название: Re: Qwt: попадание точки на курву Отправлено: AlekseyK от Декабрь 27, 2010, 21:38 Перехватывай mouseMove над QwtPlot() там где-то есть функция что-то типа расстояния от точки до линии (curve). Когда значение скажем в пределах 3 пикселя от линии - можешь смело показывать подсказку.
Название: Re: Qwt: попадание точки на курву Отправлено: vfilatov от Декабрь 27, 2010, 23:19 Если имеется ввиду функция
Код: QwtPlotCurve::closestPoint Цитировать Returns: а это значит, что она ищет только по точкам, на основе которых построена курва, т.е. переданных через setData. Тогда получается совершенно не то, что нужно, т.к. не учитываются точки, полученные в результате интерполяции.Index of the closest curve point, or -1 if none can be found ( f.e when the curve has no points ) Название: Re: Qwt: попадание точки на курву Отправлено: AlekseyK от Декабрь 28, 2010, 01:57 а это значит, что она ищет только по точкам, на основе которых построена курва, т.е. переданных через setData. Тогда получается совершенно не то, что нужно, т.к. не учитываются точки, полученные в результате интерполяции. Нет, это как то, что нужно, вернее единственное, за что ты можешь зацепиться. ;) У меня была похожая задача. Перебираешь все кривые, получаешь номер точки, вычисляешь интерполяционные точки по X позиции, смотришь какое расстояние в пикселях, если < 3, то показываешь подсказку ;) Только так.Название: Re: Qwt: попадание точки на курву Отправлено: vfilatov от Декабрь 28, 2010, 11:22 Перебираешь все кривые, получаешь номер точки, вычисляешь интерполяционные точки по X позиции, смотришь какое расстояние в пикселях, если < 3, то показываешь подсказку А как именно вычислять интерполяционные точки и почему только по X позиции?Вот пример На картике, курва построена по точкам 1, 2, 3, 4, курсор находится в позиции, где красный крест. Он точно на курве, но от контрольных точек далеко. closestPoint вернёт большое расстояние. Что ты предлагаешь делать в этой ситуации? Название: Re: Qwt: попадание точки на курву Отправлено: vfilatov от Декабрь 28, 2010, 17:10 В общем так. Готового решения нет и быть не может, потому что курва интерполируется непосредственно перед рисованием, а значит в другие моменты времени она и не знает, какие точки ей принадлежат. Поэтому всё придётся делать ручками самому.
Для решения задачи нужно получить все отрезки, из которых она состоит, для каждого отрезка вычислить расстояние от него до заданной точки (в которой мышка), взяв мимимум по этим расстояниям, получим расстояние до курвы. Дальше уже можем делать что угодно, например, если расстояние меньше некоторого числа, то считать, что мышка над курвой. Сначала пишем функцию вычисления расстояния между точкой p и отрезком с начальной точкой a и конечной точкой b: Код: double distance(const QPointF& p, const QPointF& a, const QPointF& b) Далее пишем код, вычисляющий расстояние до курвы. Для примера я его поместил в MyPlotPicker::trackerText, рассматриваю случай одной курвы, для нескольких аналогично, просто пробежать в цикле по всем и найти минимальное расстояние: Код: virtual QwtText trackerText(const QwtDoublePoint& point) const Название: Re: Qwt: попадание точки на курву Отправлено: AlekseyK от Декабрь 29, 2010, 14:51 Перебираешь все кривые, получаешь номер точки, вычисляешь интерполяционные точки по X позиции, смотришь какое расстояние в пикселях, если < 3, то показываешь подсказку А как именно вычислять интерполяционные точки и почему только по X позиции?Вот пример На картике, курва построена по точкам 1, 2, 3, 4, курсор находится в позиции, где красный крест. Он точно на курве, но от контрольных точек далеко. closestPoint вернёт большое расстояние. Что ты предлагаешь делать в этой ситуации? Название: Re: Qwt: попадание точки на курву Отправлено: vfilatov от Декабрь 29, 2010, 16:04 Все отрезки перебирать глупо и долго. Берёшь Х ближайшей точки Ну замечательно. А как взять X ближайшей точки? Не closestPoint ли вызвать?closestPoint точно также перебирает все точки курвы, считает расстояние до заданной и возвращает минимум. Разница только в том, что closestPoint считает расстояние между двумя точками, а я между точкой и отрезком, но это совершенно не принципиально с точки зрения производительности. Зато ты после closestPoint ещё предлагаешь делать дополнительные вычисления, каким-то образом интерполировать Y и т.д., в то время как у меня уже готов результат. В общем если бы ты привёл работающий код своего алгоритма, можно было бы сравнить, а так... Название: Re: Qwt: попадание точки на курву Отправлено: AlekseyK от Декабрь 29, 2010, 17:49 Ну извините, давно делал, сейчас не найду. Кстати, предложи этот код разработчику: может добавит в основную ветку - полезный же?
Название: Re: Qwt: попадание точки на курву Отправлено: vfilatov от Декабрь 29, 2010, 17:55 Кстати, предложи этот код разработчику: может добавит в основную ветку - полезный же? Да что-то неохота :)Понятно, что этот код можно оптимизировать, сортировать отрезки, искать ближайшую точку не линейно, а двоичным поиском и т.д. Но у меня и так хорошо работает, так что для себя я эту тему закрываю, тут с этим Qwt и других вопросов полно :) Название: Re: Qwt: попадание точки на курву Отправлено: Igors от Декабрь 29, 2010, 18:06 Код
|