private VerticalPrismalSurface CreateSurface(bool isClosedBase = false, bool isClosedSurface = false, bool isCounterclockwise = true)
        {
            var baseVertices = new List <Vector2>
            {
                new Vector2(1.1, 2.2),
                new Vector2(3.5, -5.3),
                new Vector2(-7.8, 9.1),
                new Vector2(-1.8, 0.1),
                new Vector2(3.8, 6.1)
            };

            IPolyline @base;

            if (isClosedBase)
            {
                var line = new ClosedPolyline(baseVertices);
                @base = line.SignedArea() > 0 ^ isCounterclockwise ? line : line.AsReverse();
            }
            else
            {
                @base = new OpenPolyline(baseVertices);
            }

            var zRange = new Interval(-3.14, 2.88);

            return(new VerticalPrismalSurface(@base, zRange, isClosedSurface));
        }
        public void ClosedPolyline_SignedArea_is_correct_for_horizontal_triangle()
        {
            var x = -0.13;
            var y = 3.14;
            var a = 1.44;
            var h = 2.72;

            IEnumerable <Vector2> triangleVertices = new List <Vector2>
            {
                new Vector2(x, y),
                new Vector2(5.555, y + h),
                new Vector2(x + a, y)
            };

            var area = a * h / 2;

            var negativeTriangle = new ClosedPolyline(triangleVertices.ToList());

            Expect(negativeTriangle.SignedArea(), Is.EqualTo(-area).Within(_tolerance));

            var positiveTriangle = new ClosedPolyline(triangleVertices.Reverse().ToList());

            Expect(positiveTriangle.SignedArea(), Is.EqualTo(area).Within(_tolerance));
        }