public void Face_Polygon_has_the_same_vertices_as_the_Face([ValueSource("GetFaceOrientationTestCases")] FaceOrientationTestCase testCase)
        {
            var surface = CreateSurface(isClosedBase: true, isClosedSurface: true, isCounterclockwise: testCase.IsOrientedOutside);

            IPolysurfaceFace face;

            if (testCase.IsVertical)
            {
                face = surface.GetVerticalFace(2);
            }
            else
            {
                face = surface.GetHorizontalFace(testCase.Side);
            }

            var actual   = new ClosedPolyline3(face.Polygon.Vertices());
            var expected = new ClosedPolyline3(face.Vertices().Select(v => v.Point));

            GeometryTestUtils.ExpectClosedPolylinesAreEqual(actual, expected, _tolerance);
        }
        public void Face_Normal_is_consistent_with_edge_order_for_convex_base([ValueSource("GetFaceOrientationTestCases")] FaceOrientationTestCase testCase)
        {
            var baseVertices = new List <Vector2>
            {
                new Vector2(-1, +2),
                new Vector2(+1, +2),
                new Vector2(+2, +1),
                new Vector2(+2, -1),
                new Vector2(+1, -2),
                new Vector2(-1, -2),
                new Vector2(-2, -1),
                new Vector2(-2, +1)
            };

            var line  = new ClosedPolyline(baseVertices);
            var @base = testCase.IsOrientedOutside ? line.AsReverse() : line;

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

            var surface = new VerticalPrismalSurface(@base, zRange, isClosed: true);

            IPolysurfaceFace face;

            if (testCase.IsVertical)
            {
                face = surface.GetVerticalFace(2);
            }
            else
            {
                face = surface.GetHorizontalFace(testCase.Side);
            }

            var edge1 = face.Edges.ElementAt(0);
            var edge2 = face.Edges.ElementAt(1);

            var expected = edge1.Vector().Cross(edge2.Vector());

            Expect(face.Normal * expected, Is.Positive);
        }