Перейти к содержанию
    

плавное изменение коэффициента уравнения от времени

Здравствуйте.

Есть линейное уравнение A = percent * t.

Надо за заданное время изменить параметр percent на заданную величину.

Но изменять с течением времени так, чтобы A менялось при этом плавно, а не скачком.

Пробовал это реализовать следующим образом

double t = 0.0;
double a;
double percent = 0.75;
double n = 0.0005;
	
while (t < 750.0) 
{		
   a = percent * t;

   if (t > 200.0)
   {			
      if (percent > 0.3)
      {
         percent -= n;
         n += 0.00001;
      }
   }	

   txPixel(20.0 + t, 480.0 - a, 255, 0, 0);
   txPixel(20.0 + t, 480.0 - t, 0, 0, 255);
      
   ++t;
}

Никак не получается вычислить начальное значение n и величину его изменения.

Получается какой-то горб

image.thumb.png.813368e6b6d23cf4895a2c0d49a1560f.png

 

Синяя линия - t

Красная линия - A

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы производную меняете линейно. Функция меняется квадратично. Экспонента наше все.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 hours ago, thermit said:

Вы производную меняете линейно. Функция меняется квадратично. Экспонента наше все.

Равноускоренное изменение параметра percent

percent = n*t + axel*t*t;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я наверное не слишком понятно сформулировал вопрос.

Есть следующая зависимость

A = percent * t, где t время

Система какое время работает с постоянным параметром percent.

В какой-то момент времени возникла необходимость поменять параметр percent.

При этом переход к новому значению percent должен быть таким, чтобы А изменилось не скачком, а менялось

плавно и непрерывно пока не закончится переход к новому значению percent.

Т.е. percent должно осуществлять переход к своему новому значению таким образом, чтобы А продолжало меняться плавно, монотонно и без скачков.

И при этом параметр percent должен измениться за некоторое заранее заданное время.

Так вот, по какому закону должен меняться параметр percent ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 minutes ago, adnega said:

A = A + percent * dt

А где тут изменение самого percent ?

Если вы имеете ввиду тут уже новый percent , то тогда новая линия пойдет сразу под новым углом, а нужен плавный переход.

Или я ошибаюсь ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только что, dimka76 сказал:

А где тут изменение самого percent ?

Вы будете менять percent, а у вас будет меняться наклон ломаной без разрывов. Но вместо реального времени t нужно использовать маленькие шажки dt (ну, или пересчитывать их в dt для отрезка с постояным percent)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 minutes ago, adnega said:

Вы будете менять percent, а у вас будет меняться наклон ломаной без разрывов. Но вместо реального времени t нужно использовать маленькие шажки dt (ну, или пересчитывать их в dt для отрезка с постояным percent)

Все равно не понимаю (((

Допустим изначально percent = 0.75, в какой-то момент нужно чтобы percent стал равным 0.3.

В предложенной вами формуле я не вижу процесса изменения percent.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

double t = 0.0;
double a = 0.0;
double percent = 0.75;
double n = 0.0005;
	
while (t < 750.0) 
{		
   a += percent;

   if (t > 200.0)
   {			
      if (percent > 0.3)
      {
         percent -= n;
         n += 0.00001;
      }
   }	

   txPixel(20.0 + t, 480.0 - a, 255, 0, 0);
   txPixel(20.0 + t, 480.0 - t, 0, 0, 255);
      
   ++t;
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, dimka76 сказал:

При этом переход к новому значению percent должен быть таким, чтобы А изменилось не скачком, а менялось

плавно и непрерывно пока не закончится переход к новому значению percent.

В момент изменения percent, запомнить значение t и percent: tBase = t, percentOld = percent.

Далее - в переходном периоде на каждой итерации вычислять: A = (percent + (percentOld - percent) * (1 - (t - tBase) / tMax)) * t

где: tMax - длительность переходного периода (выбрать подходящую).

Когда (t - tBase) станет больше tMax - переходной период закончился; далее - вычисляем по исходной формуле.

 

PS: Это линейный закон изменения. Можно сделать и более сложный - нелинейный, будет ещё плавнее. Если надо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 hours ago, jcxz said:

A = (percent + (percentOld - percent) * (1 - (t - tBase) / tMax)) * t

Спасибо.

Интересная идея. Попробую.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 hours ago, jcxz said:

A = (percent + (percentOld - percent) * (1 - (t - tBase) / tMax)) * t

Не работает

Как-будто еще одного слагаемого не хватает, чтобы поднять красный график

Spoiler

	double t = 0.0;
	double a;
	double percent = 0.75;
	double tBase, percentOld, tMax = 200.0;
	uint32_t start = 0;

	while (t < 750.0)
	{
		if ((t > 200.0) && ( t < 400.0 ))
		{
			if (start == 0)
			{
				start = 1;
				tBase = t;
				percentOld = percent;
				percent = 0.3;
			}
			a = (percent + (percentOld - percent) * (1 - (t - tBase) / tMax)) * t;
		}
		else {
			a = percent * t;
		}

		txPixel(20.0 + t, 480.0 - a, 255, 0, 0);
		txPixel(20.0 + t, 480.0 - t, 0, 0, 255);

		++t;
	}

 

image.thumb.png.0958bb99d9beabdba969ad7f3e486ef7.png

Синяя - t

Красная - a

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ерунду написал:)

 

Изменено пользователем Самурай

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  double t = 0.0;
  double a = 0.0;
  double percent = 0.75;
  double n = 0.0005;

  Image1->Canvas->FillRect(Image1->ClientRect);
  while (t < 750.0)
  {
     a += percent;

     if (t > 200.0)
     {
        if (percent > 0.3)
        {
           percent -= n;
           n += 0.00001;
        }
     }
     //txPixel(20.0 + t, 480.0 - a, 255, 0, 0);
     Image1->Canvas->Pixels[0.0 + t][480.0 - a] = clRed;
     //txPixel(20.0 + t, 480.0 - t, 0, 0, 255);
     Image1->Canvas->Pixels[0.0 + t][480.0 - t] = clNavy;

     ++t;
  }
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...