![]() |
|
|
![]()
|
|
| RedCliphAloe |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 13.5.2009 Репутация: нет Всего: 3 |
Здравствуйте.
Подскажите, как реализовать масштабирование векторной графики? Есть какая-то формула для расчета значений новых координат точек? |
|||
|
||||
| Bitter |
|
|||
![]() Опытный лентяй ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 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 - коэфициенты масштаба по осям |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 7 Всего: 183 |
Автор вряд ли имел ввиду масштабирование в чистом виде, скорее это "масштабирование отображения" или "масштабирование на экране". Тогда нужно составить преобразование, отображающее векторные точки в точки экрана. Можно и в матричной форме, это даст возможность делать каскадные преобразования... Но можно и "по-простому" особенно, если графика 2D, для начала, по крайней мере. Т.е. связать 2 точки области вывода с соответствующими векторными точками.
-------------------- ... |
|||
|
||||
| Bitter |
|
|||
![]() Опытный лентяй ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1209 Регистрация: 15.8.2004 Где: Харьков, Ukraine Репутация: 4 Всего: 27 |
Earnest, а масштабирование где же? Чёт ничё не понял
|
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 7 Всего: 183 |
Масштабирование при отображении есть всегда, поскольку координаты области вывода никогда не совпадают с "мировыми". Просто под "масштабирование" часто понимают следующее: "как увеличить изображение в стоко-то раз". А на самом деле это всегда задача вывода заданной области в логических (мировых) координатах в заданное окно (экран, бумага, etc).
-------------------- ... |
|||
|
||||
| Bitter |
|
|||
![]() Опытный лентяй ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1209 Регистрация: 15.8.2004 Где: Харьков, Ukraine Репутация: 4 Всего: 27 |
А, я понял
|
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 7 Всего: 183 |
Не представляю, как можно что-то в этом роде реализовать, не разобравшись с простейшими преобразованиями... И, кстати, не все можно в матрицу упихать. Скажем, преобразование градусов на плоскость, проекции то бишь, совсем нелинейные... Врочем, автор молчит, чего ему на самом деле надо только гадать можно...
-------------------- ... |
|||
|
||||
| RedCliphAloe |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 13.5.2009 Репутация: нет Всего: 3 |
Товарищи, мне нужно следующее:
на плоскости есть графические примитивы, хотелось бы увеличивать/уменьшать изображение (векторная графика) причем середина так называемого зума находится в любом месте плоскости... Почитав немного узнал, что для каждого примитива нужно описать необходимые параметры (в простом случае с отрезком - координаты крайних точек)... Дойдя же до зума дело встало... Пытался умножать/делить/прибавлять/вычитать значения начальных координат, в общем использовать метод тыка... Он ни к чему не привел... Решил вывести формулу расчета новых координат (для отрезка), опираясь на разницу новой длины и старой и то, что середины отрезков совпадают... В итоге получилось 4 неизвестных, а в моей системе уравнений только 2 уравнения... Самому похоже не придумать, остается искать инфу или надеятся на подсказки... Одновременно жду ваших предложений и замечаний... |
|||
|
||||
| Bitter |
|
|||
![]() Опытный лентяй ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1209 Регистрация: 15.8.2004 Где: Харьков, Ukraine Репутация: 4 Всего: 27 |
Всё можно упихать. Есть матрицы и для поворотов и для перемещения и для отображения перспективы на плоскости. Думаю это лучший способ, по скольку универсальный. И я сомниваюсь, что человек рисующий две точки на битмапе беспокоится о преобразовании мировых координат в экранные. У него есть Х, Y. Ему надо X1, Y1. Всё просто - умножить координаты на матрицу S. Это сообщение отредактировал(а) Bitter - 29.9.2009, 20:38 |
|||
|
||||
| RedCliphAloe |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 13.5.2009 Репутация: нет Всего: 3 |
Bitter, расскажи, пожалуйста, подробнее...
Ведь в таком случае результатом будет тоже матрица, а не координаты... На плоскости для 2-хкратного увеличения матрица будет такая? 2 0 0 0 2 0 0 0 1 А начальные координаты (150;100)... Как новые координаты посчитать?! Матрицы же получатся после умножения... |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 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 точки (это будет без поворота), либо точку совмещения и масштаб (тоже без поворота), либо все сразу. Например
Здесь CRefPoint - простая структура { CPointD m_ptSrc, m_ptDst; }, а CSizeD = { double cx; double cy; } Еще полезно (лоя вывода и прочих расчетов) сразу определить обратное преобразование. Дальше все просто. По центральной точке зума определяешь новую векторную область, которая влазит в твое окно вывода. Точка совмещения - это обычно left-top corner, ну или как тебе удобнее. -------------------- ... |
|||
|
||||
| Bitter |
|
|||
![]() Опытный лентяй ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1209 Регистрация: 15.8.2004 Где: Харьков, Ukraine Репутация: 4 Всего: 27 |
RedCliphAloe, чтобы умножить координаты на матрицу, ты должен умножить вектор (X, Y, 1) на матрицу которую ты написал. То есть добавь третий элемент в вектор, равный единице. Результатом будет вектор. Первые два элемента - новые координаты точки.
P.S. смешное слово "упихать" Добавлено через 2 минуты Но учти, что масштабирование будет относительно нуля. Для того чтобы относительно курсора было, тебе надо сначала из координат точки вычесть координаты курсора, потом умножить на матрицу, а потом снова прибавить координаты курсора. Тогда будет так, как ты хочешь |
|||
|
||||
| RedCliphAloe |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 13.5.2009 Репутация: нет Всего: 3 |
Ничего у меня не получается... Похоже, вообще не понимаю что такое векторная графика...
Дайте, пожалуйста, ссылку на страничку, где можно побольше узнать про векторную графику (я что-то одно и то же нахожу)... |
|||
|
||||
| Bitter |
|
|||
![]() Опытный лентяй ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1209 Регистрация: 15.8.2004 Где: Харьков, Ukraine Репутация: 4 Всего: 27 |
А что не получается-то?
|
|||
|
||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |