![]() |
Модераторы: Snowy, Alexeis, MetalFan |
![]() ![]() ![]() |
|
Vitaly333 |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 6.11.2006 Где: Volgograd Репутация: нет Всего: 2 |
На Image есть некоторые динамически создаваемые объекты(квадраты), координаты каждого квадрата также есть.
Нужно произвести правильное масштабирование. Ввел некий маштабирующий множитель. ® Сначала: r:=1; При уменьшении масштаба делал так: r:=r-0.1; При увеличении масштаба : r:=r+0.1; Потом перерисовывались все объекты заново с новыми координатами x*r и y*r; Но это мне кажется не правильным. Может есть какой -нибудь другой способ? Хотелось бы сделать так: Выделяешь прямоугольной областью фрагмент Image - и этот фрагмент растягиваешь на весь Image и потом уже либо увеличиваешь либо уменьшаешь его. Но пока не знаю как это сделать. |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
Нужно соблюдать соотношение сторон? Вообще не вижу ничего сложного. Из соотношения сторон (скажем текущая высота и высота выделения), всегда можно вычислить коэффициент масштабирования. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Bitter |
|
|||
![]() Опытный лентяй ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1209 Регистрация: 15.8.2004 Где: Харьков, Ukraine Репутация: 6 Всего: 27 |
Для этого придется работать с тремя Image'ами.
1. Первый Image будет отображать рабочее поле (смаштабированное изображение), кроме того на него производится вывод твоего лабиринта. 2. После отображения участка лабиринта, копируешь его в Image2: BitBlt(Image2.Picture.Bitmap.Canvas, 0,0,W,H, Image1.Picture.Bitmap.Canvas, 0,0,SRCCOPY); В этом Image будем выделять область для масштабирования (Пользователь выделяет область на Image1, а изображение берётся из Image2) 3. При выделении прямоугольником, запоминаешь Начальную точку и конечную. Тут есть тонкость: если координата Х конечной точки меньше начальной - меняешь их местами. Тоже самое с координатой Y. 4. Копируешь полученный косок из Image2 в Image3: BitBlt(Image3.Picture.Bitmap.Canvas, 0,0,Rec.W,Rec.H, Image2.Picture.Bitmap.Canvas, Rec.StartX,Rec.StartY,SRCCOPY); Здесь Rec - прямоугольник выделения. 5. Копируешь Image3 в Image1 с увеличением: Image1.Picture.Bitmap.Canvas.StretchDraw(aRect,Image3.Picture.Bitmap); Здесь var aRect:TRect; .... SetRect(aRect,0,0,W,H); W и H - ширина и высота Image1 6. При нажатии кнопок "+" или "-", ты можешь увеличивать или уменьшать размеры прямоугольника Rec. только следи, чтобы его размеры не привышали W и H. |
|||
|
||||
Vitaly333 |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 6.11.2006 Где: Volgograd Репутация: нет Всего: 2 |
Эта функция не хочет работать - пишет что не совместимы типы HDC и TCanvas. Я попробовал немножко по другому. Вот мой код:
Не очень то правильно получается... |
||||
|
|||||
Vitaly333 |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 6.11.2006 Где: Volgograd Репутация: нет Всего: 2 |
C BitBlt уже разобрался , просто ты забыл указать ссылку на холст:
|
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
Vitaly333, а я то думал, что идет векторное сжатие... тогда бы уже заменил
на SreatchBlt(), все равно именно ее и вызывает Canvas.StretchDraw -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Bitter |
|
|||
![]() Опытный лентяй ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1209 Регистрация: 15.8.2004 Где: Харьков, Ukraine Репутация: 6 Всего: 27 |
:-), пардон... Ну и? Заработало? |
|||
|
||||
Vitaly333 |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 6.11.2006 Где: Volgograd Репутация: нет Всего: 2 |
Вместо Form1.Image1.Picture.Bitmap.Canvas.StretchDraw(ARect,Form1.Image3.Picture.Bitmap) я поставил просто копирование выделенного куска с Image3 на Image1: Form1.Image1.Picture.Bitmap.Canvas.CopyRect(ARect, Form1.Image3.Picture.Bitmap.Canvas, Rect2); Где Arect - это (0,0,W,H); Rect2 - это (0,0,RectX2,RectY2). Всё отлично промаштабировалось, но если ещё раз произвести маштабирование на уже маштабированном Image1 то получается маштабируются и старые координаты двух квадратов которые были нарисованы на Image до 1-ого маштабирования и уже маштабированные квадраты - и получается какая-то "бяка". Т.е Нужно при каждом маштабировании перерисовывать прямоугольники с новыми координатами. Но как узнать маштабный множитель по X и по Y. Пробовал вот так,как говорил Alexeis1: rx:=W/abs(RectX2-RectX1) - Маштабный множитель по X (Отношение ширины Image1 к ширине выделенного прямоугольника); ry:=H/abs(Recty2-Recty1) - Маштабный множитель по Y (Отношение высоты Image1 К высоте выделенного прямоугольника); И потом перерисовывал эти два квадрата ,умножая их координаты на эти масш. множители:
Но уже перерисованные не соответсвовали отмаштабированным. Если бы они соответствовали то, то можно было маштабировать уже маштабированный участок ещё много раз. Да вот ещё - при ещё 1-ом маштабировании почему-то фигуры, которые раньше были квадратами стали прямоугольниками на маштабируемом Image1. |
||||
|
|||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
Это нормальный эффект при не соблюдении пропорций. Для того, чтобы этого не было необходимо использовать один и тот же масштабный коэффициент как для ширины так для высоты. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Vitaly333 |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 6.11.2006 Где: Volgograd Репутация: нет Всего: 2 |
Т.е оставить только rx или только ry. Но при перерисовке перерисованные квадраты всё равно не совпадают с отмаштабированными. |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
Что опять квадрат --> прямоугольник? Как не совпадают? Пожалуйста, не заставляйте нас проводить спиритические сеансы, описывайте проблему четко. А некоторые доходят до того, что пишут типа, я писал программу с массивами, но она почему-то не работает, не скажете почему? ![]() -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Vitaly333 |
|
||||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 6.11.2006 Где: Volgograd Репутация: нет Всего: 2 |
А я разве выше проблему не четко писал?
Нет. После введения только одного масш. множителя квадрат при перерисовке рисуется квадратом.
Когда я выделяю прямоугольную область , то она растягивается по размерам Image1(Маштабируется). Но для того чтобы произвести 2- ое маштабирование нужно чтобы квадраты со старыми координатами были перерисованы с новыми,для этого я умножаю старые на масш. коэффициент. Но при перерисовке новые координаты квадратов не совпадают с маштабированными. |
||||||
|
|||||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
Неа так нельзя! Нужно сохраниять исходные размеры и пересчитывать всегда через них. Пусть лучше погрешность будет в увеличении. Это же не страшно, чем размеры 100% не будет соответствовать истинным 100%. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Vitaly333 |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 6.11.2006 Где: Volgograd Репутация: нет Всего: 2 |
||||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Звук, графика и видео" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делится вскрытыми компонентами
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |