crossplatform.ru

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

3 страниц V  < 1 2 3 >  
Ответить в данную темуНачать новую тему
> Масштабирование с помощью колесика мышки, ?
AD
  опции профиля:
сообщение 4.6.2008, 15:51
Сообщение #11


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

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

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




Репутация:   17  


Цитата(Litkevich Yuriy @ 4.6.2008, 11:58) *
а в приведенном тобой коде вообще нет нистрочки о применении переменной curZoom, и запоминании масштаба, давай больше кода, где ты сам масштаб-то изменяешь

Вот код
/// Нажатие на кнопку - рисование "резиновой ленты"
void GraphicDisplay::mousePressEvent(QMouseEvent* events)
{
    QWidget::mousePressEvent(events);

    QRect r;
    switch(events -> button())
    {
    case Qt::LeftButton:                ///< если нажата левая кнопка мыши
        origin = events -> pos();
        rubberBandIsShown = true;
        setCursor(Qt::CrossCursor);
        r = QRect(origin, QSize());
        rubber -> setGeometry(r);
        rubber -> show();
    break;
    case Qt::RightButton:                ///< если нажата правая кнопка мыши
    break;
    default:
    break;
    }
}

/// Переопределение функции передвижения мыши
void GraphicDisplay::mouseMoveEvent(QMouseEvent* events)
{
    if(rubberBandIsShown)
    {
        rubber -> setWindowOpacity(0.0);
        rubber -> setGeometry(QRect(origin, events -> pos()).normalized());
    }

    update();
}

/// Возвращение прежнего вида курсору и изменение масштаба
void GraphicDisplay::mouseReleaseEvent(QMouseEvent* events)
{
    if(events -> button() == Qt::LeftButton && rubberBandIsShown)
    {
        rubberBandIsShown = false;
        unsetCursor();
        
        QRect rect = rubber -> geometry().normalized();
        if(rect.width() < 10 || rect.height() < 10) return;
        ParamPlotSettings prevSettings = zoomStack[curZoom];
        ParamPlotSettings settings;
        double dx = prevSettings.spanX() / (width() - 2 * MARGIN);
        double dy = prevSettings.spanY() / (height() - 2 * MARGIN);
        settings.minX = prevSettings.minX + dx * rect.left();
        settings.maxX = prevSettings.minX + dx * rect.right();
        settings.minY = prevSettings.maxY - dy * rect.bottom();
        settings.maxY = prevSettings.maxY - dy * rect.top();
        settings.win_type = prevSettings.win_type;
        settings.adjust();

        zoomStack.resize(curZoom + 1);
        zoomStack.append(settings);
        rubber -> hide();
        zoomIn();
    }
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 9.6.2008, 10:13
Сообщение #12


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

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

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




Репутация:   17  


Так что других алгоритмов нет? Кто-то может помочь, пожалуйста?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Red Devil
  опции профиля:
сообщение 9.6.2008, 11:07
Сообщение #13


Студент
*

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

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




Репутация:   3  


Ну почему же нет.
Берешь размеры изображения (ширину, высоту), делишь на 100 - получаешь размер 1%, вот на этот 1% и увеличивай размер. Можно вообще не 1% брать, а еще меньше для более плавного увеличения. Самый легкий способ.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 10.6.2008, 17:21
Сообщение #14


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

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

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




Репутация:   17  


Я дозрел до правильной формулировки задачи. :rolleyes: Мне необходим алгоритм приближения/отдаления (изменение масштаба так, чтобы плавно изменялись значения на осях и приближался или отдалялся график) при движении мыши! Подобную регулировку можно увидеть, например, в видеокамерах или фотоаппаратах. Кто-нибудь сможет помочь изменить уже приведенный алгоритм в соответствии с этими условиями?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 10.6.2008, 18:23
Сообщение #15


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

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

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




Репутация:   17  


О_о кое какое просветление :)

вот код, выполняющий удаление/приближение осей, осталось теперь правильно масштабировать!
/// Увеличение/уменьшение значения minX, maxX, minY, maxY на интервал между 2-мя отметками
void PlotSettings::scroll(int mn_dx, int mn_dy, int mx_dx, int mx_dy)
{
    double stepX = spanX() / numXTicks;
    minX += mn_dx * stepX;
    maxX += mx_dx * stepX;

    double stepY = spanY() / numYTicks;
    minY += mn_dy * stepY;
    maxY += mx_dy * stepY;
}


Вызов выглядит так!
/// Увеличение масштаба
void GraphicDisplay::zoomIn()
{
    zoomStack[curZoom].scroll(-1, -1, 1, 1);
    refreshPixmap();
}

/// Уменьшение масштаба
void GraphicDisplay::zoomOut()
{
    zoomStack[curZoom].scroll(1, 1, -1, -1);
    refreshPixmap();
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 17.6.2008, 11:09
Сообщение #16


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

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

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




Репутация:   17  


Блин совсем мозги плавятся от правильного определения координат этих точек. Помогите, пожалуйста. Я запутался с этим масштабированием! :(
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 17.6.2008, 11:10
Сообщение #17


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

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




Репутация:   40  


:)

Ты на бумаге попробуй все разрисуй, это помогает, когда не можешь нормально сконцентрироваться. ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 18.6.2008, 10:12
Сообщение #18


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

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

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




Репутация:   17  


Можно задавать маленькие конкретные вопросы? Возможно, походу пойму, где ошибка.
Вот функция, которую я использую для масштаба.

/// Увеличение/уменьшение значения minX, maxX, minY, maxY на интервал между 2-мя отметками
void PlotSettings::scroll(double mn_dx, double mn_dy, double mx_dx, double mx_dy)
{
    double stepX = spanX() / numXTicks;
    minX += mn_dx * stepX;
    maxX += mx_dx * stepX;

    double stepY = spanY() / numYTicks;
    minY += mn_dy * stepY;
    maxY += mx_dy * stepY;
}


Опять же ее использование.
/// Увеличение масштаба
void QModeGraphics::zoomIn()
{
    settings.scroll(-0.5, -0.5, 0.5, 0.5);
    refreshPixmap();
}
/// Уменьшение масштаба
void QModeGraphics::zoomOut()
{
    settings.scroll(0.5, 0.5, -0.5, -0.5);
    refreshPixmap();
}

При этом мне бы хотелось, чтобы при увеличении колесиком мыши масштаба:
координаты осей, которые были
0, 5, 10, 15, 20...
стали бы
-5, 0, 5, 10, 15, 20, 25....
Ну и т.д.

Зона и график при этом приближались пропорционально своим размерам. А у меня происходит следующее:
координаты приблизительно так и изменяются, а вот график и зоны растягиваются при приближении, а при отдалении уходят за экран видимости! Как мне это поправить? В чем ошибка приведенного выше кода?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 30.6.2008, 10:22
Сообщение #19


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

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

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




Репутация:   17  


Это опять я. Короче, проблема пока еще не решена. Сделаны кое-какие существенные изменения в приведенном выше коде. Если кто-то сможет помочь в решении, то могу их выложить. Заранее спасибо!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Red Devil
  опции профиля:
сообщение 30.6.2008, 11:16
Сообщение #20


Студент
*

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

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




Репутация:   3  


Нарисуй все на бумаге, напиши формулы, выложи их здесь. Я именно так и делал, когда решал аналогичную задачу, но с использованием другой библиотеки.
Исходный код тут не поможет.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 20.4.2024, 15:21