Есть ли метод для пересчета и уравнения с точки зрения другой переменной? - PullRequest
2 голосов
/ 08 апреля 2020

Я в настоящее время являюсь старшим в AP Calculus B C и взял на себя задачу репликации topi c в C ++ Qt. Эта топика c охватывает интегралы как площадь под кривой и повороты указанных областей для формирования модели solid с определенным объемом.

enter image description here

Я успешно повернул пользовательское уравнение, определенное как:

double y = abs(qSin(qPow(graphXValue,graphXValue))/qPow(2, (qPow(graphXValue,graphXValue)-M_PI/2)/M_PI))

ИЛИ

equation

Мой вопрос заключается в том, как повернуть такое уравнение вокруг оси Y вместо оси X. Существуют ли способы аппроксимации решения этого уравнения в терминах y вместо x? Существуют ли в настоящее время реализации такой задачи?

Имейте в виду, я рассчитываю каждую точку для преобразования в трехмерной системе координат:

for (float x = 0.0f; x < t_functionMaxX - t_projectionStep; x+=t_projectionStep)
{
    currentSet = new QSurfaceDataRow;
    nextSet = new QSurfaceDataRow;

    float x_pos_mapped = x;
    float y_pos_mapped = static_cast<float>(ui->customPlot->graph(0)->data()->findBegin(static_cast<double>(x), true)->value);

    float x_pos_mapped_ahead = x + t_projectionStep;
    float y_pos_mapped_ahead = static_cast<float>(graph1->data()->findBegin(static_cast<double>(x + t_projectionStep), true)->value);

    QList<QVector3D> temp_points;
    for (float currentRotation = static_cast<float>(-2*M_PI); currentRotation < static_cast<float>(2*M_PI); currentRotation += static_cast<float>((1) * M_PI / 180))
    {
        float y_pos_calculated = static_cast<float>(qCos(static_cast<qreal>(currentRotation))) * y_pos_mapped;
        float z_pos_calculated = static_cast<float>(qSin(static_cast<qreal>(currentRotation))) * y_pos_mapped;

        float y_pos_calculated_ahead = static_cast<float>(qCos(static_cast<qreal>(currentRotation))) * y_pos_mapped_ahead;
        float z_pos_calculated_ahead = static_cast<float>(qSin(static_cast<qreal>(currentRotation))) * y_pos_mapped_ahead;

        QVector3D point(x_pos_mapped, y_pos_calculated, z_pos_calculated);
        QVector3D point_ahead(x_pos_mapped_ahead, y_pos_calculated_ahead, z_pos_calculated_ahead);

        *currentSet << point;
        *nextSet << point_ahead;

        temp_points << point;
    }
    *data << currentSet << nextSet;


    points << temp_points;
}

1 Ответ

1 голос
/ 09 апреля 2020

По сути, вы вращаете вектор (x,f(x),0) вокруг оси Y, поэтому значение Y остается тем же, но части X и Y меняются в зависимости от поворота.

Я также заменил все части static_cast<float> явными вызовами конструктора float, который (как мне кажется) читается немного лучше.

// Render the upper part, grow from the inside
for (float x = 0.0f; x < t_functionMaxX - t_projectionStep; x+=t_projectionStep)
{
    currentSet = new QSurfaceDataRow;
    nextSet = new QSurfaceDataRow;

    float x_pos_mapped = x;
    float y_pos_mapped = float(ui->customPlot->graph(0)->data()->findBegin(double(x), true)->value);

    float x_pos_mapped_ahead = x + t_projectionStep;
    float y_pos_mapped_ahead = float(graph1->data()->findBegin(double(x + t_projectionStep), true)->value);

    QList<QVector3D> temp_points;
    for (float currentRotation = float(-2*M_PI); currentRotation < float(2*M_PI); currentRotation += float((1) * M_PI / 180))
    {
        float x_pos_calculated = float(qCos(qreal(currentRotation))) * x_pos_mapped;
        float z_pos_calculated = float(qSin(qreal(currentRotation))) * x_pos_mapped;

        float x_pos_calculated_ahead = float(qCos(qreal(currentRotation))) * x_pos_mapped_ahead;
        float z_pos_calculated_ahead = float(qSin(qreal(currentRotation))) * x_pos_mapped_ahead;

        QVector3D point(x_pos_calculated, y_pos_mapped, z_pos_calculated);
        QVector3D point_ahead(x_pos_calculated_ahead, y_pos_mapped_ahead, z_pos_calculated_ahead);

        *currentSet << point;
        *nextSet << point_ahead;

        temp_points << point;
    }
    *data << currentSet << nextSet;


    points << temp_points;
}

Далее необходимо добавить нижнюю "табличку". Это просто группа треугольников, которые соединяют (0,0,0) с двумя смежными точками вращения (1,0,0) вокруг оси Y, как мы это делали выше.

Наконец, если f(t_functionmaxX) не равно нулю, вам нужно добавить сторону, которая соединяет (t_functionmaxX, f(t_functionmaxX), 0) с (t_functionmaxX, 0, 0), снова вращаясь по шагам вокруг оси Y.

Обратите внимание, что это будет делать странные вещи, если y <0. Как вы хотите решить это до вас. </p>

...