Blame |
Last modification |
View Log
| RSS feed
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
}
}
}
}