Симуляция скорости в автомобиля в с++

Можно как то в сделать плавную симуляцию скорости авто, где чем меньше скорость тем она быстрее увеличивается, и чем больше скорость тем медленнее она увеличивается. И что бы это было реально плавно, а не так, что после определенной величины она резко начала медленнее увеличивается. Я спросил 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 шт):

Автор решения: kurakinvit

Можно попробовать так:

#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;
}

→ Ссылка
Автор решения: eri

Если грубо, то так

Изменение скорости зависит от ускорения. Ускорение зависит от сил и массы.

а=(F-C*v0²)/m
v=v0+a*t

C - лобовое сопротивление, F грубо говоря крутящий момент умноженный на радиус колеса. v скорость, m масса, a ускорение, v0 - скорость на предыдущем шаге.

Максимальная скорость (ускорение равно 0)

vmax = (1/C)*√(Fmax)

Fmax можно взять от реальной тачки и C подбирать по нё максимальной скорости.

Ручку газа прикрутить к F

→ Ссылка