//     Tooth
        //      4__5<-------- OuterDiameter
        //      /  \
        //    3/    \6<------ Pitch Diameter
        //  ->|------|<------- Tooth Thickness (at Pitch Diameter)
        //  ->|------|<------- Working Depth
        // 1__2      7__8 <--- Whole Depth; Root Radius
        private void DrawGearFace(float centerX, float centerY)
        {
            var outsideRadius = SpurGear.OutsideDiameter / 2 + centerX;
            var rootRadius = outsideRadius - SpurGear.WholeDepth;
            var pitchRadius = SpurGear.PitchDiameter / 2;
            var circularPitchAngle = (float)(RadInCyrcle / SpurGear.NumberOfTeeth);
            var toothThicknessAngle = ((float)(RadInCyrcle * SpurGear.ToothThickness) / (Math.PI * SpurGear.PitchDiameter));
            var halfBottomLandPitch = ((circularPitchAngle - toothThicknessAngle) / 2f);
            var initVerticesCount = SpurGear.Vertices.Count;
            /*1*/
            float startAngle = 0;
            var pos = new Pos2D(centerX, rootRadius + centerY);
            AddFace(pos.X, pos.Y, SpurGear.FaceWidth, SpurGear, 0, initVerticesCount);

            for (var i = 0; i < SpurGear.NumberOfTeeth; i++)
            {
                var pitchFacePos2D = new PitchFacePos2D(i);
                _pitchFacePos2Ds.Add(pitchFacePos2D);
                /*1-2 draw first half base*/
                for (var angle = _segmentAngleInRad; angle < halfBottomLandPitch; angle += _segmentAngleInRad)
                {
                    var pos2D = Pos(rootRadius, startAngle + angle, centerX, centerY);
                    AddFace(pos2D.X, pos2D.Y, SpurGear.FaceWidth, SpurGear, 0, initVerticesCount);
                }
                /*2*/
                pos = Pos(rootRadius, startAngle + halfBottomLandPitch, centerX, centerY);
                AddFace(pos.X, pos.Y, SpurGear.FaceWidth, SpurGear, 0, initVerticesCount);
                pitchFacePos2D.Add(AddFace(pos.X, pos.Y, SpurGear.FaceWidth, SpurGear, 0, initVerticesCount));
                /*3 - draw tooth*/
                pos = Pos(pitchRadius, startAngle + halfBottomLandPitch, centerX, centerY);
                pitchFacePos2D.Add(AddFace(pos.X, pos.Y, SpurGear.FaceWidth, SpurGear, 0, initVerticesCount));
                /*4*/
                var q = toothThicknessAngle / 4;
                pos = Pos(outsideRadius, startAngle + halfBottomLandPitch + q, centerX, centerY);
                pitchFacePos2D.Add(AddFace(pos.X, pos.Y, SpurGear.FaceWidth, SpurGear, 0, initVerticesCount));
                /*5*/
                pos = Pos(outsideRadius, startAngle + halfBottomLandPitch + toothThicknessAngle - q, centerX, centerY);
                pitchFacePos2D.Add(AddFace(pos.X, pos.Y, SpurGear.FaceWidth, SpurGear, 0, initVerticesCount));
                /*6*/
                pos = Pos(pitchRadius, startAngle + halfBottomLandPitch + toothThicknessAngle, centerX, centerY);
                pitchFacePos2D.Add(AddFace(pos.X, pos.Y, SpurGear.FaceWidth, SpurGear, 0, initVerticesCount));
                /*7*/
                pos = Pos(rootRadius, startAngle + halfBottomLandPitch + toothThicknessAngle, centerX, centerY);
                pitchFacePos2D.Add(AddFace(pos.X, pos.Y, SpurGear.FaceWidth, SpurGear, 0, initVerticesCount));
                /*8* draw second half base*/
                for (var angle = startAngle + halfBottomLandPitch + toothThicknessAngle; angle < circularPitchAngle; angle += _segmentAngleInRad)
                {
                    pos = Pos(rootRadius, angle, centerX, centerY);
                    pitchFacePos2D.Add(AddFace(pos.X, pos.Y, SpurGear.FaceWidth, SpurGear, 0, initVerticesCount));
                }

                startAngle += circularPitchAngle;
            }
            /*1 draw last half base*/
            for (var angle = _segmentAngleInRad; angle < halfBottomLandPitch; angle += _segmentAngleInRad)
            {
                pos = Pos(rootRadius, startAngle + angle, centerX, centerY);
                AddFace(pos.X, pos.Y, SpurGear.FaceWidth, SpurGear, 0, initVerticesCount);
            }

            foreach (var pitchFacePos2D in _pitchFacePos2Ds)
            {
                for (int i = 2; i < pitchFacePos2D.Vertices.Count; i++)
                {
                    AddTriangleFace(SpurGear, null, SpurGear.Vertices.IndexOf(pitchFacePos2D.Vertices[i].Top) + 1, 3,2,1);
                    AddTriangleFace(SpurGear, null, SpurGear.Vertices.IndexOf(pitchFacePos2D.Vertices[i - 1].Top) + 1, 3, 2, 1);
                    AddTriangleFace(SpurGear, null, SpurGear.Vertices.IndexOf(pitchFacePos2D.Vertices[i - 2].Top) + 1, 3, 2, 1);
                }
            }
        }
        //     Tooth
        //      4__5<-------- OuterDiameter
        //      /  \
        //    3/    \6<------ Pitch Diameter
        //  ->|------|<------- Tooth Thickness (at Pitch Diameter)
        //  ->|------|<------- Working Depth
        // 1__2      7__8 <--- Whole Depth; Root Radius
        private void DrawGearFace(float centerX, float centerY)
        {
            var outsideRadius       = SpurGear.OutsideDiameter / 2 + centerX;
            var rootRadius          = outsideRadius - SpurGear.WholeDepth;
            var pitchRadius         = SpurGear.PitchDiameter / 2;
            var circularPitchAngle  = (float)(RadInCyrcle / SpurGear.NumberOfTeeth);
            var toothThicknessAngle = ((float)(RadInCyrcle * SpurGear.ToothThickness) / (Math.PI * SpurGear.PitchDiameter));
            var halfBottomLandPitch = ((circularPitchAngle - toothThicknessAngle) / 2f);
            var initVerticesCount   = SpurGear.Vertices.Count;
            /*1*/
            float startAngle = 0;
            var   pos        = new Pos2D(centerX, rootRadius + centerY);

            AddFace(pos.X, pos.Y, SpurGear.FaceWidth, SpurGear, 0, initVerticesCount);

            for (var i = 0; i < SpurGear.NumberOfTeeth; i++)
            {
                var pitchFacePos2D = new PitchFacePos2D(i);
                _pitchFacePos2Ds.Add(pitchFacePos2D);
                /*1-2 draw first half base*/
                for (var angle = _segmentAngleInRad; angle < halfBottomLandPitch; angle += _segmentAngleInRad)
                {
                    var pos2D = Pos(rootRadius, startAngle + angle, centerX, centerY);
                    AddFace(pos2D.X, pos2D.Y, SpurGear.FaceWidth, SpurGear, 0, initVerticesCount);
                }
                /*2*/
                pos = Pos(rootRadius, startAngle + halfBottomLandPitch, centerX, centerY);
                AddFace(pos.X, pos.Y, SpurGear.FaceWidth, SpurGear, 0, initVerticesCount);
                pitchFacePos2D.Add(AddFace(pos.X, pos.Y, SpurGear.FaceWidth, SpurGear, 0, initVerticesCount));
                /*3 - draw tooth*/
                pos = Pos(pitchRadius, startAngle + halfBottomLandPitch, centerX, centerY);
                pitchFacePos2D.Add(AddFace(pos.X, pos.Y, SpurGear.FaceWidth, SpurGear, 0, initVerticesCount));
                /*4*/
                var q = toothThicknessAngle / 4;
                pos = Pos(outsideRadius, startAngle + halfBottomLandPitch + q, centerX, centerY);
                pitchFacePos2D.Add(AddFace(pos.X, pos.Y, SpurGear.FaceWidth, SpurGear, 0, initVerticesCount));
                /*5*/
                pos = Pos(outsideRadius, startAngle + halfBottomLandPitch + toothThicknessAngle - q, centerX, centerY);
                pitchFacePos2D.Add(AddFace(pos.X, pos.Y, SpurGear.FaceWidth, SpurGear, 0, initVerticesCount));
                /*6*/
                pos = Pos(pitchRadius, startAngle + halfBottomLandPitch + toothThicknessAngle, centerX, centerY);
                pitchFacePos2D.Add(AddFace(pos.X, pos.Y, SpurGear.FaceWidth, SpurGear, 0, initVerticesCount));
                /*7*/
                pos = Pos(rootRadius, startAngle + halfBottomLandPitch + toothThicknessAngle, centerX, centerY);
                pitchFacePos2D.Add(AddFace(pos.X, pos.Y, SpurGear.FaceWidth, SpurGear, 0, initVerticesCount));
                /*8* draw second half base*/
                for (var angle = startAngle + halfBottomLandPitch + toothThicknessAngle; angle < circularPitchAngle; angle += _segmentAngleInRad)
                {
                    pos = Pos(rootRadius, angle, centerX, centerY);
                    pitchFacePos2D.Add(AddFace(pos.X, pos.Y, SpurGear.FaceWidth, SpurGear, 0, initVerticesCount));
                }

                startAngle += circularPitchAngle;
            }
            /*1 draw last half base*/
            for (var angle = _segmentAngleInRad; angle < halfBottomLandPitch; angle += _segmentAngleInRad)
            {
                pos = Pos(rootRadius, startAngle + angle, centerX, centerY);
                AddFace(pos.X, pos.Y, SpurGear.FaceWidth, SpurGear, 0, initVerticesCount);
            }

            foreach (var pitchFacePos2D in _pitchFacePos2Ds)
            {
                for (int i = 2; i < pitchFacePos2D.Vertices.Count; i++)
                {
                    AddTriangleFace(SpurGear, null, SpurGear.Vertices.IndexOf(pitchFacePos2D.Vertices[i].Top) + 1, 3, 2, 1);
                    AddTriangleFace(SpurGear, null, SpurGear.Vertices.IndexOf(pitchFacePos2D.Vertices[i - 1].Top) + 1, 3, 2, 1);
                    AddTriangleFace(SpurGear, null, SpurGear.Vertices.IndexOf(pitchFacePos2D.Vertices[i - 2].Top) + 1, 3, 2, 1);
                }
            }
        }