Posted by Fourth on Mon 17 Nov 15:12
report abuse | download | new post
- Sphere::Sphere(int n) : Shape() {
- //your code for tessellating a sphere goes here
- if( n > 5 )
- n = 5;
- float five = 5.0;
- float a = 2.0 / ( 1.0 + sqrt(five) );
- Vector3 origin(0,0,0);
- //icosahedron vertices
- Vector3 tv0(0 , a, -1);
- Vector3 tv1(-a, 1, 0);
- Vector3 tv2(a, 1, 0);
- Vector3 tv3(0, a, 1);
- Vector3 tv4(-1, 0, a);
- Vector3 tv5(0, -a, 1);
- Vector3 tv6(1, 0, a);
- Vector3 tv7(1, 0, -a);
- Vector3 tv8(0, -a, -1);
- Vector3 tv9(-1, 0, -a);
- Vector3 tv10(-a, -1, 0);
- Vector3 tv11(a, -1, 0);
- //create the triangles in the original mesh
- vector< vector<Vector3> > triangles;
- //make triangle 0 and add it
- vector<Vector3> triangle0;
- triangle0.push_back(tv0);
- triangle0.push_back(tv1);
- triangle0.push_back(tv2);
- triangles.push_back(triangle0);
- //make triangle 1 and add it
- triangle0.clear();
- triangle0.push_back(tv3);
- triangle0.push_back(tv2);
- triangle0.push_back(tv1);
- triangles.push_back(triangle0);
- //make triangle 2 and add it
- triangle0.clear();
- triangle0.push_back(tv3);
- triangle0.push_back(tv4);
- triangle0.push_back(tv5);
- triangles.push_back(triangle0);
- //make triangle 3 and add it
- triangle0.clear();
- triangle0.push_back(tv3);
- triangle0.push_back(tv5);
- triangle0.push_back(tv6);
- triangles.push_back(triangle0);
- //make triangle 3 and add it
- triangle0.clear();
- triangle0.push_back(tv0);
- triangle0.push_back(tv7);
- triangle0.push_back(tv8);
- triangles.push_back(triangle0);
- //make triangle 4 and add it
- triangle0.clear();
- triangle0.push_back(tv0);
- triangle0.push_back(tv8);
- triangle0.push_back(tv9);
- triangles.push_back(triangle0);
- //make triangle 5 and add it
- triangle0.clear();
- triangle0.push_back(tv5);
- triangle0.push_back(tv10);
- triangle0.push_back(tv11);
- triangles.push_back(triangle0);
- //make triangle 6 and add it
- triangle0.clear();
- triangle0.push_back(tv8);
- triangle0.push_back(tv11);
- triangle0.push_back(tv10);
- triangles.push_back(triangle0);
- //make triangle 7 and add it
- triangle0.clear();
- triangle0.push_back(tv1);
- triangle0.push_back(tv9);
- triangle0.push_back(tv4);
- triangles.push_back(triangle0);
- //make triangle 8 and add it
- triangle0.clear();
- triangle0.push_back(tv10);
- triangle0.push_back(tv4);
- triangle0.push_back(tv9);
- triangles.push_back(triangle0);
- //make triangle 9 and add it
- triangle0.clear();
- triangle0.push_back(tv2);
- triangle0.push_back(tv6);
- triangle0.push_back(tv7);
- triangles.push_back(triangle0);
- //make triangle 10 and add it
- triangle0.clear();
- triangle0.push_back(tv11);
- triangle0.push_back(tv7);
- triangle0.push_back(tv6);
- triangles.push_back(triangle0);
- //make triangle 11 and add it
- triangle0.clear();
- triangle0.push_back(tv3);
- triangle0.push_back(tv1);
- triangle0.push_back(tv4);
- triangles.push_back(triangle0);
- //make triangle 12 and add it
- triangle0.clear();
- triangle0.push_back(tv3);
- triangle0.push_back(tv6);
- triangle0.push_back(tv2);
- triangles.push_back(triangle0);
- //make triangle 13 and add it
- triangle0.clear();
- triangle0.push_back(tv0);
- triangle0.push_back(tv9);
- triangle0.push_back(tv1);
- triangles.push_back(triangle0);
- //make triangle 14 and add it
- triangle0.clear();
- triangle0.push_back(tv0);
- triangle0.push_back(tv2);
- triangle0.push_back(tv7);
- triangles.push_back(triangle0);
- //make triangle 15 and add it
- triangle0.clear();
- triangle0.push_back(tv8);
- triangle0.push_back(tv10);
- triangle0.push_back(tv9);
- triangles.push_back(triangle0);
- //make triangle 16 and add it
- triangle0.clear();
- triangle0.push_back(tv8);
- triangle0.push_back(tv7);
- triangle0.push_back(tv11);
- triangles.push_back(triangle0);
- //make triangle 17 and add it
- triangle0.clear();
- triangle0.push_back(tv5);
- triangle0.push_back(tv4);
- triangle0.push_back(tv10);
- triangles.push_back(triangle0);
- //make triangle 18 and add it
- triangle0.clear();
- triangle0.push_back(tv5);
- triangle0.push_back(tv11);
- triangle0.push_back(tv6);
- triangles.push_back(triangle0);
- //so we have all of the vertices in there original coordinates
- //with that, we subdivide each polygon into 4 new ones and
- //do this n number of times
- for( int i = 1; i < n; i++ ) {
- vector< vector<Vector3> > tempTriangles;
- for( int j = 0; j < triangles.size(); j++ ) {
- //now we subdivide
- vector<Vector3> triangle = triangles.at(j);
- Vector3 two = triangle.at(2); //point 2 of the triangle
- Vector3 one = triangle.at(1); //point 1 of the triangle
- Vector3 zero = triangle.at(0); //point 0 of the triangle
- Vector3 a( ((two+zero)*.5) ); //intermediate point a
- Vector3 b( ((one+zero)*.5) ); //intermediate point b
- Vector3 c( ((two+one)*.5) ); //intermediate point c
- //add first new triangle
- triangle.clear();
- triangle.push_back( two );
- triangle.push_back( c );
- triangle.push_back( a );
- tempTriangles.push_back( triangle );
- //add second new triangle
- triangle.clear();
- triangle.push_back( c );
- triangle.push_back( one );
- triangle.push_back( b );
- tempTriangles.push_back( triangle );
- //add third new triangle
- triangle.clear();
- triangle.push_back( c );
- triangle.push_back( b );
- triangle.push_back( a );
- tempTriangles.push_back( triangle );
- //add fourth new triangle
- triangle.clear();
- triangle.push_back( a );
- triangle.push_back( b );
- triangle.push_back( zero );
- tempTriangles.push_back( triangle );
- }
- triangles = tempTriangles;
- }
- //loop to normalize each triangle vertex
- vector< vector<Vector3> > tempTriangles;
- for( int i = 0; i < triangles.size(); i++ ) {
- vector<Vector3> triangle = triangles.at(i);
- Vector3 two = triangle.at(0);
- Vector3 one = triangle.at(1);
- Vector3 zero = triangle.at(2);
- //now normalize
- two.normalize();
- one.normalize();
- zero.normalize();
- two*=.5;
- one*=.5;
- zero*=.5;
- Vector3 twoN = two;
- Vector3 oneN = one;
- Vector3 zeroN = zero;
- triangle.clear();
- triangle.push_back(twoN);
- triangle.push_back(oneN);
- triangle.push_back(zeroN);
- tempTriangles.push_back(triangle);
- }
- triangles = tempTriangles;
- /*//so we have now created all the proper triangles
- //now we must normalize, which requires all of the vertices
- int totalV = verts.size();
- for( int i = 0; i < totalV; i++ ) {
- //compute the vector that goes from the origin to the vertex and normalize it
- Vector3 temp = verts.at(i);
- temp.normalize();
- //multiply that normalized vector by .5 and add it to the origin to get the replacement vertex
- temp*=.5;
- Point3 np = origin+temp;
- normVerts.push_back(np);
- }*/
- //now iterate through, creating triangles in order
- for( int i = 0; i < triangles.size(); i++ ) {
- Point3 origin(0,0,0);
- vector<Vector3> triangle = triangles.at(i);
- Point3 a,b,c;
- a = origin+triangle.at(0);
- b = origin+triangle.at(1);
- c = origin+triangle.at(2);
- addTriangle(a,b,c);
- }
- }
Submit a correction or amendment below (click here to make a fresh posting)
After submitting an amendment, you'll be able to view the differences between the old and new posts easily.