public void TestTask2_3()
        {
            Figure3    figure    = new Figure3(4, 6);
            Square3    square    = new Square3(3, 4);
            Rectangle3 rectangle = new Rectangle3(5, 7);

            Assert.AreEqual(figure.Draw(), figure.GetType().Name);
            Assert.AreEqual(square.Draw(), square.GetType().Name);
            Assert.AreEqual(rectangle.Draw(), rectangle.GetType().Name);
        }
 public void fillingStack()
 {
     playerStack[0]  = new Figure1(playerNumber);
     playerStack[1]  = new Figure2(playerNumber);
     playerStack[2]  = new Figure3(playerNumber);
     playerStack[3]  = new Figure4(playerNumber);
     playerStack[4]  = new Figure5(playerNumber);
     playerStack[5]  = new Figure6(playerNumber);
     playerStack[6]  = new Figure7(playerNumber);
     playerStack[7]  = new Figure8(playerNumber);
     playerStack[8]  = new Figure9(playerNumber);
     playerStack[9]  = new Figure10(playerNumber);
     playerStack[10] = new Figure11(playerNumber);
     playerStack[11] = new Figure12(playerNumber);
     playerStack[12] = new Figure13(playerNumber);
     playerStack[13] = new Figure14(playerNumber);
     playerStack[14] = new Figure15(playerNumber);
     playerStack[15] = new Figure16(playerNumber);
     playerStack[16] = new Figure17(playerNumber);
     playerStack[17] = new Figure18(playerNumber);
     playerStack[18] = new Figure19(playerNumber);
     playerStack[19] = new Figure20(playerNumber);
     playerStack[20] = new Figure21(playerNumber);
 }
        //-----------------------------------------------------------------------------
        /// <summary>
        /// Generates tor.
        /// </summary>
        /// <returns>Generated tor.</returns>
        public override Figure3 Generate()
        {
            var figure = new Figure3();

            #region Structure of tor: points.

            // Big outer circle.
            const double doublePi = 2 * Math.PI;
            for (double angleBig = 0; angleBig < doublePi; angleBig += _angleStep)
            {
                // Calculate data only once.
                var cosAngleBig = Math.Cos(angleBig);
                var sinAngleBig = Math.Sin(angleBig);

                // Coordinates of center of little inner circle at plane XY.
                var centerInnerX = _radiusBig * cosAngleBig;
                var centerInnerY = _radiusBig * sinAngleBig;

                // Small inner circle.
                for (double angleSmall = 0; angleSmall < doublePi; angleSmall += _angleStep)
                {
                    // Coordinates of point at surface of small little circle in plane of circle.
                    var surfaceInnerX = _radiusSmall * Math.Cos(angleSmall);
                    var surfaceInnerY = _radiusSmall * Math.Sin(angleSmall);

                    // Vector to point of tor surface at XYZ space.
                    var surfaceOuter = new Vector4
                    {
                        X = _center.X + centerInnerX + surfaceInnerX * cosAngleBig,
                        Y = _center.Y + centerInnerY + surfaceInnerX * sinAngleBig,
                        Z = _center.Z + surfaceInnerY
                    };
                    figure.Points.Add(surfaceOuter);
                }
            }

            #endregion

            #region Structure of tor: ribs and faces.

            // Build ribs and faces.
            var countPoints = (int)Math.Ceiling(2 * Math.PI / _angleStep);
            for (var i = 0; i < countPoints; i++)
            {
                for (var j = 0; j < countPoints; j++)
                {
                    // Index of current point.
                    var currentPoint = i * countPoints + j;

                    // Index of point of next inner circle.
                    int rightPoint;
                    if (i == countPoints - 1)								// Last circle.
                        rightPoint = j;
                    else
                        rightPoint = (i + 1) * countPoints + j;				// In the middle.

                    // Index of next point of current inner circle.
                    int topPoint;
                    if (j == countPoints - 1)								// Last point of circle.
                        topPoint = i * countPoints + 1;
                    else
                        topPoint = i * countPoints + j + 1;					// In the middle.

                    // Index of next point of next inner circle.
                    int topRightPoint;
                    if ((j == countPoints - 1) && (i == countPoints - 1))	// Last point of last circle.
                        topRightPoint = 1;
                    else if (i == countPoints - 1)							// Last circle.
                        topRightPoint = j + 1;
                    else if (j == countPoints - 1)							// Last point of circle.
                        topRightPoint = (i + 1) * countPoints;
                    else
                        topRightPoint = (i + 1) * countPoints + j + 1;		// In the middle.

                    // Connect points of small inner circle.
                    var circleRib = new Rib3
                    {
                        First = figure.Points[currentPoint],
                        Second = figure.Points[topPoint]
                    };
                    figure.Ribs.Add(circleRib);

                    // Connect points of small inner circles.
                    var circlesRib = new Rib3
                    {
                        First = figure.Points[currentPoint],
                        Second = figure.Points[rightPoint]
                    };
                    figure.Ribs.Add(circlesRib);

                    var face = new Face3
                    {
                        First = figure.Points[currentPoint],
                        Second = figure.Points[rightPoint],
                        Third = figure.Points[topRightPoint]
                    };
                    figure.Faces.Add(face);

                    face = new Face3
                    {
                        First = figure.Points[currentPoint],
                        Second = figure.Points[topPoint],
                        Third = figure.Points[topRightPoint]
                    };
                    figure.Faces.Add(face);

                } // End for j

            } // End for i

            #endregion

            return figure;
        }