Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Масштабирование векторной графики 
:(
    Опции темы
RedCliphAloe
Дата 29.9.2009, 07:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 13.5.2009

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



Здравствуйте. 
Подскажите, как реализовать масштабирование векторной графики?
Есть какая-то формула для расчета значений новых координат точек?
PM MAIL   Вверх
Bitter
Дата 29.9.2009, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

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



Есть. надо их умножить на матрицу масштабирования:


      xs  0  0  0
      0   ys 0  0
S = 0   0  zs 0
      0   0  0   1

xs, ys, zs - коэфициенты масштаба по осям
PM MAIL ICQ Skype   Вверх
Earnest
Дата 29.9.2009, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Автор вряд ли имел ввиду масштабирование в чистом виде, скорее это "масштабирование отображения" или "масштабирование на экране". Тогда нужно составить преобразование, отображающее векторные точки в точки экрана. Можно и в матричной форме, это даст возможность делать каскадные преобразования... Но можно и "по-простому" особенно, если графика 2D, для начала, по крайней мере. Т.е. связать 2 точки области вывода с соответствующими векторными точками.


--------------------
...
PM   Вверх
Bitter
Дата 29.9.2009, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

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



Earnest, а масштабирование где же? Чёт ничё не понял
PM MAIL ICQ Skype   Вверх
Earnest
Дата 29.9.2009, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Масштабирование при отображении есть всегда, поскольку координаты области вывода никогда не совпадают с "мировыми". Просто под "масштабирование" часто понимают следующее: "как увеличить изображение в стоко-то раз". А на самом деле это всегда задача вывода заданной области в логических (мировых) координатах в заданное окно (экран, бумага, etc).


--------------------
...
PM   Вверх
Bitter
Дата 29.9.2009, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

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



А, я понял smile Ну да, как вариант. Но если алгоритм преобразования - чёрный ящик для автора, то тогда матрица
PM MAIL ICQ Skype   Вверх
Earnest
Дата 29.9.2009, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Не представляю, как можно что-то в этом роде реализовать, не разобравшись с простейшими преобразованиями... И, кстати, не все можно в матрицу упихать. Скажем, преобразование градусов на плоскость, проекции то бишь, совсем нелинейные... Врочем, автор молчит, чего ему на самом деле надо только гадать можно...


--------------------
...
PM   Вверх
RedCliphAloe
Дата 29.9.2009, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 13.5.2009

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



Товарищи, мне нужно следующее:
на плоскости есть графические примитивы, хотелось бы увеличивать/уменьшать изображение (векторная графика) причем середина так называемого зума находится в любом месте плоскости...
Почитав немного узнал, что для каждого примитива нужно описать необходимые параметры (в простом случае с отрезком - координаты крайних точек)...
Дойдя же до зума дело встало... Пытался умножать/делить/прибавлять/вычитать значения начальных координат, в общем использовать метод тыка...
Он ни к чему не привел...
Решил вывести формулу расчета новых координат (для отрезка), опираясь на разницу новой длины и старой и то, что середины отрезков совпадают...
В итоге получилось 4 неизвестных, а в моей системе уравнений только 2 уравнения...
Самому похоже не придумать, остается искать инфу или надеятся на подсказки...
Одновременно жду ваших предложений и замечаний...
PM MAIL   Вверх
Bitter
Дата 29.9.2009, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

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



Цитата(Earnest @  29.9.2009,  16:29 Найти цитируемый пост)
Скажем, преобразование градусов на плоскость, проекции то бишь


Всё можно упихать. Есть матрицы и для поворотов и для перемещения и для отображения перспективы на плоскости. Думаю это лучший способ, по скольку универсальный. И я сомниваюсь, что человек рисующий две точки на битмапе беспокоится о преобразовании мировых координат в экранные. У него есть Х, Y. Ему надо X1, Y1. Всё просто - умножить координаты на матрицу S.

Это сообщение отредактировал(а) Bitter - 29.9.2009, 20:38
PM MAIL ICQ Skype   Вверх
RedCliphAloe
Дата 30.9.2009, 07:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 13.5.2009

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



Bitter, расскажи, пожалуйста, подробнее...
Цитата(Bitter @  29.9.2009,  21:37 Найти цитируемый пост)
Всё просто - умножить координаты на матрицу S.

Ведь в таком случае результатом будет тоже матрица, а не координаты...
На плоскости для 2-хкратного увеличения матрица будет такая?
2 0 0
0 2 0
0 0 1
А начальные координаты (150;100)...
Как новые координаты посчитать?! Матрицы же получатся после умножения...

PM MAIL   Вверх
Earnest
Дата 30.9.2009, 07:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Вектор умножить на матрицу -> получишь вектор.
Вот смотри, на пальцах: линейные преобразования координат на плоскости (X, Y) -> (U, V) описываются афинным преобразование, определяемым 6 коэффициентами:
    U = D0 * X + D1 * Y + D2,
    V = D3 * X + D4 * Y + D5
Афинное преобразование в общем случае включает сдвиг, поворот и масштабирование (разное по осям). Даже если тебе не нужны поворот и разное масштабирование (2 лишних коэффициента), лучше все же пользоваться именно афинной формой, т.к. она позволяет упихать себя в матрицу 3*3 и комбинироваться с другими афинными преобразованиями, путем формального перемножения матриц. Теперь, как получить коэффициенты. Для этого нужно сопоставить 2 точки (это будет без поворота), либо точку совмещения и масштаб (тоже без поворота), либо все сразу. Например
Код

// Определяем линейное преобразование по точке совмещения и масштабу 
// (масштаб = Dst / Src со знаком)
bool CAffineParams::Define (const CRefPoint& Rp, CSizeD Scale)
{
   if (IsZero(Scale.cx) || IsZero(Scale.cy))
   {
      ASSERT(0);
      return false;
   }
   
   // прямое преобразование (SrcToDst):
   m_D[0] = Scale.cx;
   m_D[1] = 0;
   m_D[2] = Rp.m_ptDst.x - Scale.cx*Rp.m_ptSrc.x;
   m_D[3] = 0;
   m_D[4] = Scale.cy;
   m_D[5] = Rp.m_ptDst.y - Scale.cy*Rp.m_ptSrc.y;

   return true;
}
 
Здесь CRefPoint - простая структура { CPointD m_ptSrc, m_ptDst; },  а CSizeD = { double cx; double cy; }
Еще полезно (лоя вывода и прочих расчетов) сразу определить обратное преобразование.

Дальше все просто. По центральной точке зума определяешь новую векторную область, которая влазит
в твое окно вывода. Точка совмещения - это обычно left-top corner, ну или как тебе удобнее.


--------------------
...
PM   Вверх
Bitter
Дата 30.9.2009, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

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



RedCliphAloe, чтобы умножить координаты на матрицу, ты должен умножить вектор (X, Y, 1) на матрицу которую ты написал. То есть добавь третий элемент в вектор, равный единице. Результатом будет вектор. Первые два элемента - новые координаты точки.

P.S. смешное слово "упихать"  smile   smile

Добавлено через 2 минуты
Но учти, что масштабирование будет относительно нуля. Для того чтобы относительно курсора было, тебе надо сначала из координат точки вычесть координаты курсора, потом умножить на матрицу, а потом снова прибавить координаты курсора. Тогда будет так, как ты хочешь
PM MAIL ICQ Skype   Вверх
RedCliphAloe
Дата 19.10.2009, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 13.5.2009

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



Ничего у меня не получается... Похоже, вообще не понимаю что такое векторная графика...
Дайте, пожалуйста, ссылку на страничку, где можно побольше узнать про векторную графику (я что-то одно и то же нахожу)...
PM MAIL   Вверх
Bitter
Дата 22.10.2009, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

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



А что не получается-то?
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




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


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

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