dimka76 59 1 декабря, 2021 Опубликовано 1 декабря, 2021 · Жалоба Здравствуйте. Есть линейное уравнение 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 и величину его изменения. Получается какой-то горб Синяя линия - t Красная линия - A Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
thermit 1 1 декабря, 2021 Опубликовано 1 декабря, 2021 · Жалоба Вы производную меняете линейно. Функция меняется квадратично. Экспонента наше все. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 59 2 декабря, 2021 Опубликовано 2 декабря, 2021 · Жалоба 9 hours ago, thermit said: Вы производную меняете линейно. Функция меняется квадратично. Экспонента наше все. Равноускоренное изменение параметра percent percent = n*t + axel*t*t; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 59 2 декабря, 2021 Опубликовано 2 декабря, 2021 · Жалоба Я наверное не слишком понятно сформулировал вопрос. Есть следующая зависимость A = percent * t, где t время Система какое время работает с постоянным параметром percent. В какой-то момент времени возникла необходимость поменять параметр percent. При этом переход к новому значению percent должен быть таким, чтобы А изменилось не скачком, а менялось плавно и непрерывно пока не закончится переход к новому значению percent. Т.е. percent должно осуществлять переход к своему новому значению таким образом, чтобы А продолжало меняться плавно, монотонно и без скачков. И при этом параметр percent должен измениться за некоторое заранее заданное время. Так вот, по какому закону должен меняться параметр percent ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 2 декабря, 2021 Опубликовано 2 декабря, 2021 · Жалоба A = A + percent * dt Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 59 2 декабря, 2021 Опубликовано 2 декабря, 2021 · Жалоба 7 minutes ago, adnega said: A = A + percent * dt А где тут изменение самого percent ? Если вы имеете ввиду тут уже новый percent , то тогда новая линия пойдет сразу под новым углом, а нужен плавный переход. Или я ошибаюсь ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 2 декабря, 2021 Опубликовано 2 декабря, 2021 · Жалоба Только что, dimka76 сказал: А где тут изменение самого percent ? Вы будете менять percent, а у вас будет меняться наклон ломаной без разрывов. Но вместо реального времени t нужно использовать маленькие шажки dt (ну, или пересчитывать их в dt для отрезка с постояным percent) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 59 2 декабря, 2021 Опубликовано 2 декабря, 2021 · Жалоба 3 minutes ago, adnega said: Вы будете менять percent, а у вас будет меняться наклон ломаной без разрывов. Но вместо реального времени t нужно использовать маленькие шажки dt (ну, или пересчитывать их в dt для отрезка с постояным percent) Все равно не понимаю ((( Допустим изначально percent = 0.75, в какой-то момент нужно чтобы percent стал равным 0.3. В предложенной вами формуле я не вижу процесса изменения percent. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 2 декабря, 2021 Опубликовано 2 декабря, 2021 · Жалоба 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; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 2 декабря, 2021 Опубликовано 2 декабря, 2021 · Жалоба 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: Это линейный закон изменения. Можно сделать и более сложный - нелинейный, будет ещё плавнее. Если надо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 59 3 декабря, 2021 Опубликовано 3 декабря, 2021 · Жалоба 9 hours ago, jcxz said: A = (percent + (percentOld - percent) * (1 - (t - tBase) / tMax)) * t Спасибо. Интересная идея. Попробую. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 59 3 декабря, 2021 Опубликовано 3 декабря, 2021 · Жалоба 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; } Синяя - t Красная - a Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 3 декабря, 2021 Опубликовано 3 декабря, 2021 · Жалоба Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Самурай 12 3 декабря, 2021 Опубликовано 3 декабря, 2021 (изменено) · Жалоба ерунду написал:) Изменено 3 декабря, 2021 пользователем Самурай Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 3 декабря, 2021 Опубликовано 3 декабря, 2021 · Жалоба 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; } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться