Opentk/Source/Examples/Shapes/KochTetrahedron.cs

72 lines
2.5 KiB
C#
Raw Normal View History

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.BeginMode.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
}
}
}
}