По сути, вы вращаете вектор (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>