crossplatform.ru

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

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


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

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

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




Репутация:   17  


На данный момент масштабирование графика реализовано также, как и в книжке Саммерфилда и Бланшета. Смысл метода заключается в том, что сохраняется предыдущий масштаб и идет при прокрутке колесика мышки на него. Меня не устраивает такая интерпретация изменения масштаба, хочется сделать обычную!. То есть, чтобы масштаб изменялся гладко и правильно.
Помогите, пожалуйста! Подскажите, пожалуйста, методы решения данной проблемы.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 28.5.2008, 15:04
Сообщение #2


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

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

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




Репутация:   40  


Цитата(AD @ 28.5.2008, 11:43) *
Меня не устраивает такая интерпретация изменения масштаба, хочется сделать обычную!. То есть, чтобы масштаб изменялся гладко и правильно.
Не совсем понял, что есть (как работает) и что нужно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 28.5.2008, 15:32
Сообщение #3


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

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

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




Репутация:   17  


Цитата(ViGOur @ 28.5.2008, 16:04) *
Не совсем понял, что есть (как работает) и что нужно.

Необходимо, чтобы при прокручивании колесика мыши или нажатии на "+", "-", изображение увеличивалось или уменьшалось плавно. Ну например как в некоторых программах, как пример Google Earth (земля). В примере книги на "+", "-" сделано так, что запоминается какие масштабы уже были и осуществляется переход на один из предыдущих масштабов. Напомню, что можно еще масштабировать, выделяя область (эти масштабы и запоминаются). Смысл такой, хочу чтобы увеличить или уменьшить график можно было, просто покрутив колесико мыши.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 28.5.2008, 15:48
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


А в чем трудность, алгоритм вроде не сложный получается, ловить событие мыша, смотреть изменение перемещения колесика, добавлять это изменение к текущему масштабу. Скажи конкретнее что вызывает трудность.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 29.5.2008, 14:25
Сообщение #5


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

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

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




Репутация:   17  


Цитата(Litkevich Yuriy @ 28.5.2008, 16:48) *
А в чем трудность, алгоритм вроде не сложный получается, ловить событие мыша, смотреть изменение перемещения колесика, добавлять это изменение к текущему масштабу. Скажи конкретнее что вызывает трудность.

Трудность в реализации. Не очень понимаю как сделать. Вот так оно сделано сейчас:
/// Изменение масштаба при кручении колесиком мыши
void GraphicDisplay::wheelEvent(QWheelEvent* events)
{
    int numDegrees = events -> delta() / 8;
    int numTicks = numDegrees / 15;
    
    if(numTicks < 0) zoomIn();
    else zoomOut();
    
    refreshPixmap();
}

/// Увеличение масштаба
void GraphicDisplay::zoomIn()
{
    if(curZoom < (zoomStack.count() - 1))
    {
        ++curZoom;
        refreshPixmap();
    }
}

/// Уменьшение масштаба
void GraphicDisplay::zoomOut()
{
    if(curZoom > 0)
    {
        --curZoom;
        refreshPixmap();
    }
}

/// Обновление графика
void GraphicDisplay::refreshPixmap()
{
    pixmap = QPixmap(size());
    pixmap.fill(this, 0, 0);

    QPainter painter(&pixmap);
    painter.initFrom(this);
    painter.setFont(QFont("Tahoma", 8, Qt::SolidLine));
    drawGrid(&painter);
    drawCurves(&painter);

    update();
}

Что и где поменять? Сможете помочь?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 29.5.2008, 15:39
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


я бы так доработал:
void GraphicDisplay::zoomIn(int delta)
{
    if(curZoom < (zoomStack.count() - 1))
    {
        curZoom+=delta;
        refreshPixmap();
    }
}

подобное изменение для уменьшения масштаба, правда надо проверять, чтобы curZoom не перевернулся через себя.
Ну и в обработчике событий вызывать эти функции так:
zoomIn(numTicks);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 4.6.2008, 10:31
Сообщение #7


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

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

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




Репутация:   17  


Цитата(Litkevich Yuriy @ 29.5.2008, 16:39) *
я бы так доработал:
void GraphicDisplay::zoomIn(int delta)
{
    if(curZoom < (zoomStack.count() - 1))
    {
        curZoom+=delta;
        refreshPixmap();
    }
}

подобное изменение для уменьшения масштаба, правда надо проверять, чтобы curZoom не перевернулся через себя.
Ну и в обработчике событий вызывать эти функции так:
zoomIn(numTicks);

Не понял отличия от моего алгоритма. :) Я не знаю, как сделать такой алгоритм изменения масштаба, в котором при прокручивании мыши изменения масштаба идет плавное! Такого рода изменения масштаба можно увидеть в Google Earth. Кто может помочь?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 4.6.2008, 10:37
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(AD @ 4.6.2008, 14:31) *
Не понял отличия от моего алгоритма

В этом
Цитата(AD @ 4.6.2008, 14:31) *
curZoom+=delta

изменение масштаба происходит на величину смещения колесика мышки, а у тебя на еденицу, ведь человек может крутануть резко тогда и дельта будет большая, а не еденица.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 4.6.2008, 10:50
Сообщение #9


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

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

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




Репутация:   17  


Цитата(Litkevich Yuriy @ 4.6.2008, 11:37) *
Цитата(AD @ 4.6.2008, 14:31) *
Не понял отличия от моего алгоритма

В этом
Цитата(AD @ 4.6.2008, 14:31) *
curZoom+=delta

изменение масштаба происходит на величину смещения колесика мышки, а у тебя на еденицу, ведь человек может крутануть резко тогда и дельта будет большая, а не еденица.

Тот алгоритм, который я привел не подходит для моей задачи. В данном случае, он всего-лишь возвращает к тому масштабу, который был ранее и все! Мне необходимо, чтобы он именно масштабировал, а не запоминал предыдущие масштабы и возвращал к ним.

P.S. Масштабировать с помощью прямоугольной области удается, как ни странно!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 4.6.2008, 10:58
Сообщение #10


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


а в приведенном тобой коде вообще нет нистрочки о применении переменной curZoom, и запоминании масштаба, давай больше кода, где ты сам масштаб-то изменяешь
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 30.11.2024, 3:05