Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
1 / 1 / 1
Регистрация: 06.11.2014
Сообщений: 58

Масштабирование анимации

09.11.2014, 00:32. Показов 1457. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Передо мной стоит следующая задача: имеется image, trackbar и кнопка. При нажатии на кнопку в image загружается картинка и запускается анимация (просто шарики, движущиеся по линии). Проблема состоит в том, что я не знаю, как масштабировать все вместе (картинка+анимация) через trackbar. Я могу масштабировать отдельно картинку. Отдельно анимацию масштабировать тоже пока не получается (думаю, что через перерасчет координат). Возможно ли реализовать задачу, используя только ресурсы bds? Помогите, пожалуйста!
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.11.2014, 00:32
Ответы с готовыми решениями:

Масштабирование в Qt C++
Здравствуйте. Как найти масштабный коэффициент так, чтобы максимальное и минимальное значение по оси у отставало от границ окна на 20...

Алгоритмы.Анимации. Написать прогу для изображения анимации
нужно чтобы она двигалась во все стороны. вот эта фигура

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

10
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
09.11.2014, 01:12
Да это возможно реализовать только ресурсами bds.
0
1 / 1 / 1
Регистрация: 06.11.2014
Сообщений: 58
09.11.2014, 12:44  [ТС]
А подсказать с реализацией можете?
0
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
09.11.2014, 12:55
Цитата Сообщение от Ildar_csu Посмотреть сообщение
Отдельно анимацию масштабировать тоже пока не получается (думаю, что через перерасчет координат).
Что вам мешает сделать через перерасчет координат?
0
1 / 1 / 1
Регистрация: 06.11.2014
Сообщений: 58
09.11.2014, 12:57  [ТС]
через перерасчет масштабировать анимацию ничего не мешает. просто я не знаю как это совместить с масштабированием картинки
0
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
09.11.2014, 13:22
Дело лучше пойдет если вы свой код здесь приведете.
0
1 / 1 / 1
Регистрация: 06.11.2014
Сообщений: 58
09.11.2014, 13:42  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
int i=0,j=0;
int x1[10]={0,10,20,30,40,50,60,70,80,90};
int y1[10]={0,10,20,30,40,50,60,70,80,90};
int x2[10]={10,20,30,40,50,60,70,80,90,100};
int y2[10]={10,20,30,40,50,60,70,80,90,100};
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Draw()            //функция рисования кругов
{
 Image1->Canvas->Brush->Color=clRed;
 Image1->Canvas->Pen->Color=clGreen;
 for (i=0;i<10;i++)
 Image1->Canvas->Ellipse(x1[i],y1[i],x2[i],y2[i]);
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::FormCreate(TObject *Sender) //начальная загрузка картинки
{
 Image1->Width=Form1->Width;
 Image1->Height=Form1->Height;
 bitmap->LoadFromFile("C:\\Users\\Mvideo\\Desktop\\программы по программированию\\c builder 2006\\Projects\\опыт штерна и герлаха\\картинки для билдера\\комната1.bmp"); //Загрузили в него изображение
 Image1->Canvas->Draw(0,0,bitmap); //Вывели на канву формы в точке (0,0)
 Gbitmap->Assign(bitmap);
 
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
 Image1->Visible=true;
 
 Draw();                      //рисуется картинка со старыми координатами
 
 for (i=0;i<10;i++)
  {
   x1[i]=x1[i]+2;y1[i]=y1[i]+2;         //увеличение координат
   x2[i]=x2[i]+2;y2[i]=y2[i]+2;
   if ((x1[i]>=200) || (y1[i]>=200))  //если координаты вышли за пределы
    {
     x1[i]=x1[i]-200; y1[i]=y1[i]-200;
     x2[i]=x2[i]-200; y2[i]=y2[i]-200;
    }
  }
 
 Image1->Picture->Bitmap=NULL;        //обнуляется Image1
 
 //загружает фон в Image1
 bitmap->LoadFromFile("C:\\Users\\Mvideo\\Desktop\\программы по программированию\\c builder 2006\\Projects\\опыт штерна и герлаха\\картинки для билдера\\комната1.bmp"); //Загрузили в него изображение
 Image1->Canvas->Draw(0,0,bitmap); //Вывели на канву формы в точке (0,0)
 Gbitmap->Assign(bitmap);
 
 Draw(); //рисуется картинка с новыми координатами
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 Timer1->Enabled = ! Timer1->Enabled;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::TrackBar1Change(TObject *Sender)
{
 for (i = 1; i <= 9; i++)
  {
   if (TrackBar1->Position==i)
    {
     bitmap->Width=Image1->Width+10*i;
     bitmap->Height=Image1->Height+10*i;
     bitmap->Canvas->StretchDraw(bitmap->Canvas->ClipRect,Gbitmap);
     Image1->Canvas->Draw(0,0,bitmap);
    }
  }
}
//---------------------------------------------------------------------------
Добавлено через 30 секунд
здесь нет про перерасчет координат, потому что пока я над этим не думал

Добавлено через 2 минуты
если использовать трекбар до нажатия кнопки, то картинка масштабируется. если после, то тоже масштабируется, но т.к. в имедже все перерисовывается, то получается дерганье картинки
0
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
09.11.2014, 15:22
Лучший ответ Сообщение было отмечено Ildar_csu как решение

Решение

Грузить бмп из файла по таймеру точно не стоит. Я бы так сделал:
Ставим у имеджа св-во Stretch в true. А с помощью TrackBar-а меням размер имджа. Делаем 2 бмп: Bmp0, Bmp1. В Bmp0 грузим ваш файл. По таймеру копируем Bmp0 в Bmp1 и рисуем круги на Bmp1 далее прорисовываем Bmp1 в Image.
1
1 / 1 / 1
Регистрация: 06.11.2014
Сообщений: 58
10.11.2014, 01:47  [ТС]
Спасибо за совет, вечером попробую это сделать. Как сделаю, отпишусь.
Я понимаю, что код у меня еще деревянный, просто недавно сел за bds

Добавлено через 10 часов 20 минут
Ваш совет оказался ОЧЕНЬ дельным! У меня все заработал, кроме одного: круги не стираются.
После преобразования мой код выглядит следующим образом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
int i=0;
int x1[10]={0,10,20,30,40,50,60,70,80,90};
int y1[10]={0,10,20,30,40,50,60,70,80,90};
 
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Draw()            //функция рисования кругов
{
 bmp1->Canvas->Brush->Color=clRed;
 bmp1->Canvas->Pen->Color=clGreen;
 for (i=0;i<10;i++)
 bmp1->Canvas->Ellipse(x1[i],y1[i],x1[i]+10,y1[i]+10);
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::FormCreate(TObject *Sender) //начальная загрузка картинки
{
 Image1->Width=Form1->Width;
 Image1->Height=Form1->Height;
 bmp0->LoadFromFile("C:\\Users\\Mvideo\\Desktop\\программы по программированию\\c builder 2006\\Projects\\опыт штерна и герлаха\\картинки для билдера\\комната1.bmp"); //Загрузили в него изображение
 Image1->Canvas->Draw(0,0,bmp0); //Вывели на канву формы в точке (0,0)
 bmp1->Assign(bmp0);
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
 Draw();                      //рисуется картинка со старыми координатами
 
 for (i=0;i<10;i++)
  {
   x1[i]=x1[i]+2;y1[i]=y1[i]+2;         //увеличение координат
    if ((x1[i]>=200) || (y1[i]>=200))  //если координаты вышли за пределы
     {
      x1[i]=x1[i]-200; y1[i]=y1[i]-200;
     }
  }
 
 
 
 //загружает фон в Image1
 Image1->Canvas->Draw(0,0,bmp1);
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 Timer1->Enabled = ! Timer1->Enabled;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::TrackBar1Change(TObject *Sender)
{
 for (i = 1; i <= 9; i++)
  {
   if (TrackBar1->Position==i)
    {
     Image1->Width=Form1->Width+10*i;
     Image1->Height=Form1->Height+10*i;
    }
  }
}
//---------------------------------------------------------------------------
После перерасчета в таймере в предыдущем коде обнулялся имэдж, а затем все перерисовывалось. А как теперь с этим справится? Подскажите, пожалуйста!
0
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
10.11.2014, 01:55
В Draw() вставить bmp1->Assign(bmp0);
1
1 / 1 / 1
Регистрация: 06.11.2014
Сообщений: 58
10.11.2014, 21:15  [ТС]
Спасибо огромное за помощь! Жалко, что сам до всего этого не додумался
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.11.2014, 21:15
Помогаю со студенческими работами здесь

Масштабирование
Имеется набор данных: import numpy as np from sklearn import preprocessing input_data=np.array(, , ...

масштабирование
Здоровья Вам!!! прошу помощи! вот делаю такую карту http://namore.biz.ua/karta в Мазиле открывается как надо (с изменением курсора на...

масштабирование
Скажите, что можно придумать, чтобы увеличив фигуру в 2 раза, потом можно было вернуть ее первоначальный вид, поставив в масштабе 1? :(...

Масштабирование
Здравствуйте. Не могли бы вы подсказать реализацию/теорию(где почитать) про алгоритмы масштабирования? У меня есть монохромные матрицы из...

масштабирование!
привет! скажите, почему при масштабировании страницы (ctrl+scroll) на одних страницах происходит просто увеличение контента, а на других...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru