crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

4 страниц V  < 1 2 3 4 >  
Ответить в данную темуНачать новую тему
> Определение точных координат на графике в контекстном меню, как реализовать корректно?
AD
  опции профиля:
сообщение 17.7.2009, 14:13
Сообщение #21


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(Litkevich Yuriy @ 16.7.2009, 18:46) *
AD, сделай курсор графика там всё и увидишь.

А как сделать курсор графика? Подскажи, пожалуйста. Раньше не делал никогда...

Хочу чтобы курсор представлял собой точку и бегал за кончиком указатель мыша. Это возможно?

Сообщение отредактировал AD - 17.7.2009, 14:14
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 20.7.2009, 12:51
Сообщение #22


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


А есть какие-нибудь примеры с курсором графика? Я не знаю с чего начать его делать.... Что именно надо сделать, чтобы он был?

Сообщение отредактировал AD - 20.7.2009, 12:51
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 21.7.2009, 13:37
Сообщение #23


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


У нас есть виджет на котором рисуется график.
Его размер в точках - sizeWidget, пусть будет sizeWidget.x = 200, sizeWidget.y = 100.
Есть позиция мыши внутри этого виджета, пусть будет posMouse.x = 180, posMouse.y = 23.
Есть размер системы координат графика sizeGraph, пусть будет sizeGraph.x = 1000, sizeGraph.y = 200.
Что бы получить значение координаты мыши делаем:
point.x = posMouse.x * sizeGraph.x / sizeWidget.y -> point.x = 180 * 1000 / 200 = 900.

График рисуется по формуле y = f(x), подставляем полученное значение по горизонтали и получаем point.y.

Сообщение отредактировал BRE - 21.7.2009, 13:38
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 21.7.2009, 14:18
Сообщение #24


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(BRE @ 21.7.2009, 14:37) *
У нас есть виджет на котором рисуется график.
Его размер в точках - sizeWidget, пусть будет sizeWidget.x = 200, sizeWidget.y = 100.
Есть позиция мыши внутри этого виджета, пусть будет posMouse.x = 180, posMouse.y = 23.
Есть размер системы координат графика sizeGraph, пусть будет sizeGraph.x = 1000, sizeGraph.y = 200.
Что бы получить значение координаты мыши делаем:
point.x = posMouse.x * sizeGraph.x / sizeWidget.y -> point.x = 180 * 1000 / 200 = 900.

График рисуется по формуле y = f(x), подставляем полученное значение по горизонтали и получаем point.y.

Дело в том, что приблизительно такой алгоритм и используется.
/// Отображение контекстного меню
void GraphicDisplay::contextMenuEvent(QContextMenuEvent* events)
{
    QPointF coordinate(initXY(&events -> pos()));
}

initXY(&events -> pos()) - как раз и переводит в координаты графика. Что указанная функция initXY работает правильно - я уверен - проверено и давно. Все дело в координатах events -> pos(), которые выдаются с погрешностью, которая недопустима.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 21.7.2009, 14:59
Сообщение #25


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(AD @ 21.7.2009, 15:18) *
Все дело в координатах events -> pos(), которые выдаются с погрешностью, которая недопустима.

Ты уверен, что эти координаты возвращаются с погрешностью? :blink:
Попробуй добавить вывод в консоль этих координат и посмотреть что выводиться.

P.S. Покажи функцию initXY.

Сообщение отредактировал BRE - 21.7.2009, 15:06
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 21.7.2009, 15:11
Сообщение #26


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(BRE @ 21.7.2009, 15:59) *
P.S. Покажи функцию initXY.

Без проблем. Реализация этой функции в большей степени переписана из Бланшета и Саммерфилда:
/// Инициализация координат - преобразование из экранных координат (x, y) в координаты графика (sx, sy)
QPointF GraphicDisplay::initXY(const QPoint* scr_coor)
{
    QRect rect(paramsDisplay -> rect());

    double x = scr_coor -> x();                ///< экранная координата оси x
    double y = scr_coor -> y();                ///< экранная координата оси y

    /// Вычисление номера линии сетки, около которой находится значение
    double j = (x - rect.left()) / (rect.width() - 1) * settings.numXTicks;
    double k = (rect.bottom() - y) / (rect.height() - 1) * settings.numYTicks;

    /// Вычисление координат графика
    double sx = settings.minX + (j * settings.spanX() / settings.numXTicks);
    double sy = settings.minY + (k * settings.spanY() / settings.numYTicks);

    return QPointF(sx, sy);
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 21.7.2009, 15:33
Сообщение #27


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(AD @ 21.7.2009, 16:11) *
Без проблем. Реализация этой функции в большей степени переписана из Бланшета и Саммерфилда:

А как определены spanX() и spanY()?

---

Попробуй так:
struct Settings
{
    double    minX;
    double    minY;
    double    maxX;
    double    maxY;
    double    numXTicks;
    double    numYTicks;

    double    spanX() const { return maxX - minX; }
    double    spanY() const { return maxY - minY; }
};

QPointF initXY( const QPoint &scr_coor )
{
    QRect rect( ... );

    // Если область графика занимает не всю площадь виджета, то проверяем находиться ли мышь над графиком
    if( !rect.contains( scr_coor ) )
        return QPointF( 0, 0 );

    double sx = settings.minX + double( scr_coor.x() - rect.left() ) * settings.spanX() / rect.width();
    double sy = settings.minY + double( rect.bottom() - scr_coor.y() ) * settings.spanY() / rect.height();

    return QPointF(sx, sy);
}


Сообщение отредактировал BRE - 21.7.2009, 17:17
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 21.7.2009, 17:31
Сообщение #28


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


        double spanX() const { return maxX - minX; }
    double spanY() const { return maxY - minY; }

Так и определены :)
А функцию initXY(), попробую сейчас.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 21.7.2009, 18:09
Сообщение #29


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Ну... алгоритм ведь тот же. Единицу ток не вычитаем. Ничего не изменилось. Нет плавного перемещения визира.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 21.7.2009, 18:19
Сообщение #30


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(AD @ 21.7.2009, 19:09) *
Ну... алгоритм ведь тот же. Единицу ток не вычитаем. Ничего не изменилось. Нет плавного перемещения визира.

Координаты те же выводятся в меню?
Что за визир? Почему нет плавности? :)

Сообщение отредактировал BRE - 21.7.2009, 18:21
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

4 страниц V  < 1 2 3 4 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 25.4.2024, 22:49