#include "glsphere.h" GLSphere::GLSphere(double radius, int stacks, int slices) : GLBody(radius) { // Force an even number m_stacks = stacks / 2 * 2; m_slices = slices / 2 * 2; } void GLSphere::makeSurface(QVector *pointContainer, QVector *indexContainer) { GLBody::makeSurface(pointContainer, indexContainer); QVector3D t0 = QVector3D(0.0, 0.0, 0.0); //dummy texture QVector3D northpol = v_Y; QVector3D southpol = -v_Y; QVector firstPointRow = calculateRow(0); QVector sliceA = firstPointRow; QVector 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 i = 0; i < m_stacks - 1; 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 * 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 GLSphere::calculateRow(int slice) { if(slice == m_stacks) { return firstRow; } QVector 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); double y = cos(stackRotation); double z = sin(stackRotation) * cos(sliceRotation); return QVector3D(x, y, z); }