Симуляция скорости в автомобиля в с++
Можно как то в сделать плавную симуляцию скорости авто, где чем меньше скорость тем она быстрее увеличивается, и чем больше скорость тем медленнее она увеличивается. И что бы это было реально плавно, а не так, что после определенной величины она резко начала медленнее увеличивается. Я спросил gpt по этому поводу и он мне выдал следующее:
#include <iostream>
#include <cmath>
double simulateSpeed(double speed) {
if (speed < 50) {
return speed + sqrt(speed); // увеличиваем скорость с учетом квадратного корня
} else {
return speed + (50 / speed); // уменьшаем скорость с учетом деления на скорость
}
}
int main() {
double currentSpeed = 10; // начальная скорость
for (int i = 0; i < 10; ++i) {
currentSpeed = simulateSpeed(currentSpeed);
std::cout << "Скорость на итерации " << i+1 << " : " << currentSpeed << std::endl;
}
return 0;
}
Но это не плавно, так как после 50, скорость увеличения резко идёт на спад. Я хочу решить эту проблему используя массив "промежуточных скоростей", это когда в массиве есть несколько скоростей, и при достижении каждой из них скорость увеличения будет изменяться пропорционально индексу в массиве. Но заполнять массив самостоятельно такими скоростями - такая себе идея, и я хочу сделать так, что бы он заполнялся скоростями самостоятельно, и конечным значением было максимальное значение скорости. Ну и естественно что бы скорость увеличения изменялась в зависимости от промежуточной скорости. Помогите пожалуйста с этим
Ответы (2 шт):
Можно попробовать так:
#include <iostream>
#include <vector>
#include <cmath>
std::vector<double> generateIntermediateSpeeds(double startSpeed, double endSpeed, int numSteps) {
std::vector<double> intermediateSpeeds(numSteps);
// Рассчитываем приращение скорости между начальной и конечной скоростью
double speedIncrement = (endSpeed - startSpeed) / (numSteps - 1);
// Заполняем массив промежуточных скоростей
for (int i = 0; i < numSteps; ++i) {
intermediateSpeeds[i] = startSpeed + i * speedIncrement;
}
return intermediateSpeeds;
}
double simulateSpeed(double speed, const std::vector<double>& intermediateSpeeds) {
double maxSpeed = intermediateSpeeds.back();
if (speed < maxSpeed) {
// Находим индекс промежуточной скорости, которую следует использовать
int intermediateIndex = static_cast<int>(speed / maxSpeed * (intermediateSpeeds.size() - 1));
// Увеличиваем скорость с использованием промежуточной скорости и ее индекса
double increment = intermediateSpeeds[intermediateIndex] / (intermediateIndex + 1);
return speed + increment;
} else {
return speed; // Максимальная скорость достигнута
}
}
int main() {
double startSpeed = 10; // Начальная скорость
double endSpeed = 100; // Конечная скорость
int numSteps = 10; // Количество промежуточных скоростей
std::vector<double> intermediateSpeeds = generateIntermediateSpeeds(startSpeed, endSpeed, numSteps);
double currentSpeed = startSpeed;
for (int i = 0; i < numSteps; ++i) {
currentSpeed = simulateSpeed(currentSpeed, intermediateSpeeds);
std::cout << "Скорость на итерации " << i + 1 << ": " << currentSpeed << std::endl;
}
return 0;
}
Если грубо, то так
Изменение скорости зависит от ускорения. Ускорение зависит от сил и массы.
а=(F-C*v0²)/m
v=v0+a*t
C - лобовое сопротивление, F грубо говоря крутящий момент умноженный на радиус колеса. v скорость, m масса, a ускорение, v0 - скорость на предыдущем шаге.
Максимальная скорость (ускорение равно 0)
vmax = (1/C)*√(Fmax)
Fmax можно взять от реальной тачки и C подбирать по нё максимальной скорости.
Ручку газа прикрутить к F