1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
|
using System;
using System.Collections.Generic;
namespace Examples.Shapes
{
public sealed class KochTetrahedron: DrawableShape
{
public enum eSubdivisions
{
Zero = 0,
One = 1,
Two = 2,
Three = 3,
Four = 4,
Five=5,
Six=6,
Seven=7,
Eight=8,
}
public KochTetrahedron( double scale, double extrusionHeight, double extrusionMultiplier, eSubdivisions subdivs, bool useDL )
: base( useDL )
{
TetrahedronFace[] Triangles;
switch ( subdivs )
{
case eSubdivisions.Zero:
SierpinskiTetrahedron.CreateDefaultTetrahedron( scale, out Triangles );
break;
case eSubdivisions.One:
case eSubdivisions.Two:
case eSubdivisions.Three:
case eSubdivisions.Four:
case eSubdivisions.Five:
case eSubdivisions.Six:
case eSubdivisions.Seven:
case eSubdivisions.Eight:
SierpinskiTetrahedron.CreateDefaultTetrahedron( scale, out Triangles );
for ( int i = 0; i < (int)subdivs; i++ )
{
TetrahedronFace[] temp;
this.SubdivideKoch( extrusionHeight, ref Triangles, out temp );
Triangles = temp;
extrusionHeight *= extrusionMultiplier;
}
break;
default: throw new ArgumentOutOfRangeException( "Subdivisions other than contained in the enum cause overflows and are not allowed." );
}
PrimitiveMode = OpenTK.Graphics.OpenGL.PrimitiveType.Triangles;
SierpinskiTetrahedron.GetVertexArray( ref Triangles, out VertexArray );
IndexArray = null;
}
private void SubdivideKoch( double height, ref TetrahedronFace[] input, out TetrahedronFace[] output )
{
output = new TetrahedronFace[input.Length * 6];
int counter = 0;
for ( int i = 0; i < input.Length; i++ )
{
input[i].SubdivideKoch(height, out output[counter + 0], out output[counter + 1], out output[counter + 2], out output[counter + 3], out output[counter + 4], out output[counter + 5] );
counter += 6; // every source triangle emits 6 new triangles
}
}
}
}
|