diff options
Diffstat (limited to 'src/glsphere.cpp')
| -rw-r--r-- | src/glsphere.cpp | 60 |
1 files changed, 50 insertions, 10 deletions
diff --git a/src/glsphere.cpp b/src/glsphere.cpp index 1a40540..77cb7f7 100644 --- a/src/glsphere.cpp +++ b/src/glsphere.cpp @@ -3,8 +3,9 @@ GLSphere::GLSphere(double radius, int stacks, int slices) : GLBody(radius) { - m_stacks = stacks; - m_slices = slices; + // Force an even number + m_stacks = stacks / 2 * 2; + m_slices = slices / 2 * 2; } void GLSphere::makeSurface(QVector<GLPoint> *pointContainer, @@ -17,31 +18,70 @@ void GLSphere::makeSurface(QVector<GLPoint> *pointContainer, QVector3D northpol = v_Y; QVector3D southpol = -v_Y; - QVector3D point1; - QVector3D point2; + QVector<QVector3D> firstPointRow = calculateRow(0); + + QVector<QVector3D> sliceA = firstPointRow; + QVector<QVector3D> sliceB; m_firstPoint = m_points->size(); for (int slice = 1; slice < m_slices; slice += 2) { + sliceB = calculateRow(slice); + m_points->append(GLPoint(m_radius * northpol, northpol, t0, m_color)); - for (int stack = 1; stack < m_stacks; stack++) + for (int i = 0; i < m_stacks - 1; i++) { - point1 = calculatePoint(2 * M_PI * slice / m_slices, stack * M_PI / m_stacks); - m_points->append(GLPoint(m_radius * point1, point1, t0, m_color)); - - point2 = calculatePoint(2 * M_PI * (slice - 1) / m_slices, stack * M_PI / m_stacks); - m_points->append(GLPoint(m_radius * point2, point2, t0, m_color)); + m_points->append(GLPoint(m_radius * sliceA[i], sliceA[i], + t0, m_color)); + m_points->append(GLPoint(m_radius * sliceB[i], sliceB[i], + t0, m_color)); } m_points->append(GLPoint(m_radius * southpol, southpol, t0, m_color)); + + sliceA = calculateRow(slice + 1); + + for (int i = m_stacks - 2; i >= 0; i--) + { + m_points->append(GLPoint(m_radius * sliceA[i], sliceA[i], + t0, m_color)); + + m_points->append(GLPoint(m_radius * sliceB[i], sliceB[i], + t0, m_color)); + } + + m_points->append(GLPoint(m_radius * northpol, northpol, t0, m_color)); } m_nextPoint = m_points->size(); } +QVector<QVector3D> GLSphere::calculateRow(int slice) +{ + if(slice == m_stacks) + { + return firstRow; + } + + QVector<QVector3D> longitude; + + for (int stack = 1; stack < m_stacks; stack++) + { + longitude.append(calculatePoint(2 * M_PI * slice / m_slices, + stack * M_PI / m_stacks)); + } + + if (slice == 0) + { + firstRow = longitude; + } + + return longitude; +} + QVector3D GLSphere::calculatePoint(double sliceRotation, double stackRotation) { double x = sin(stackRotation) * sin(sliceRotation); |
