Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [QT] Масштабирование векторной графики 
:(
    Опции темы
avorber
Дата 20.11.2007, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 20.11.2007
Где: Харьков

Репутация: нет
Всего: нет



Приветик всем!!!
У меня есть одна проблемка. Создаю векторный редактор, необходимо реализовать масштабирование. Если использовать обычный scale, то объекты расползается либо наплывают :(
Слышала есть такая методика, что  подбирается плоскость логических координат с большими значениями по х и у так,  что при масштабировании при расчете новых координат получаются целые числа и картинка не искажается. Может кто-нибудь чтонить знает где можна найти инфу о этой методике
PM MAIL ICQ   Вверх
bsa
Дата 20.11.2007, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



Все очень просто. Чтобы масштабировать вектора их все надо умножить их на матрицу преобразования:
Код
           /k 0 0\ /x\   /kx\
v' = M*v = |0 k 0|*|y| = |ky|
           \0 0 k/ \z/   \kz/
Как нетрудно догадаться - нужно все координаты умножить на k - масштаб. Вообще, все манипуляции с векторами (даже вращение пространства) делаются через умножение на матрицу.
Кстати, а что значит "объекты расползаются или наплывают"? Может ты не все вектора умножаешь на коэффициент?
PM   Вверх
MAKCim
Дата 20.11.2007, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: нет
Всего: 207



avorber, 

M
MAKCim
Причем тут UNIX/Linux?



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
avorber
Дата 20.11.2007, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 20.11.2007
Где: Харьков

Репутация: нет
Всего: нет



Дело в том что пишу я под линухой с помощью библиотеки QT. Это по вопросу почему эта тема
Класс QPainter сожержит метод scale, который собственно и масштабирует как растровое изображение так и векторное, в зависимости от того на каком контексте мы рисуем. Этот самый scale и реализован на основе аффинных преобразований, т.е. я сама никакие вектора не умножаю. Результат работы этой функции меня не удовлетворяет. Расползается картинка - это значит, что при 100% два прямоугольника стояли рядом, а при увеличении между ними появился зазор и т.д. и т.п.
PM MAIL ICQ   Вверх
bsa
Дата 20.11.2007, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



тогда делай масштабирование вручную. для этого нужно просто домножить все координаты всех векторов на коэффициент.
PM   Вверх
JackYF
Дата 20.11.2007, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 7
Всего: 162



avorber, а ты антиалиасинг включила (QPainter::setRenderHint)? Может, с ним будет лучше?


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
avorber
Дата 21.11.2007, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 20.11.2007
Где: Харьков

Репутация: нет
Всего: нет



QPainter::setRenderHint  - это в какой версии Qt, я использую 3.02 и не нашла таковой...
И  что такое антиалиасинг??

По поводу масштабирования вручную: допустим мне надо получить 120% и нарисовать прямоугольник, соответственно я в функцию drawRect(int x, int y, int w, int h) передам x*1.2, y*1.2, .....
но ведь эта функция принимает инты а не доублы, координаты округляться и нарисуются неверно  smile  smile 
PM MAIL ICQ   Вверх
bsa
Дата 21.11.2007, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



avorber, а иначе никак. На самом деле нарисуется верно, только будут небольшие искажения на 1 пиксель. Иначе можно только увеличив виртуальный масштаб до 200%, нарисовать картинку в буфере, а затем вывести ее с уменьшением на экран. Тогда ты получишь "размазывание", которое сделает иллюзию размещения линии между пикселями. Но в этом случае еще надо масштабировать толщину линий.
PM   Вверх
JackYF
Дата 21.11.2007, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 7
Всего: 162



Цитата(avorber @  21.11.2007,  11:05 Найти цитируемый пост)
я использую 3.02 и не нашла таковой...

старенькая... никак перейти на Qt4?


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
avorber
Дата 22.11.2007, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 20.11.2007
Где: Харьков

Репутация: нет
Всего: нет



Я знаю что старенькая, но это не мой выбор. Шо маемо - те маемо 
PM MAIL ICQ   Вверх
Elfebet
Дата 22.11.2007, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 545
Регистрация: 15.5.2006
Где: Украина. Запорожь е.

Репутация: 5
Всего: 14



хех... была аналогичная ситуация, достаточно просто юзать drawRect ( const QRectF & rectangle ) , т.е. явно передай double, 
Код

painter.drawRect(QRectF((double)x*1.2, (double)y*1.2, (double)w*1.2, (double)h*1.2));

или аналогично
Код

QRectF rectF((double)x*1.2, (double)y*1.2, (double)w*1.2, (double)h*1.2));
painter.drawRects(&rectF, 1);

p.s. по крайней мере это в qt4 работает

Это сообщение отредактировал(а) Elfebet - 22.11.2007, 13:46


--------------------
Программист не должен всё знать... он должен знать где можно посмотреть
PM MAIL ICQ GTalk   Вверх
JackYF
Дата 22.11.2007, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 7
Всего: 162



Цитата(Elfebet @  22.11.2007,  13:41 Найти цитируемый пост)
p.s. по крайней мере это в qt4 работает

в qt4 легче сделать setRenderHint один раз smile


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0554 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.