Example #1
0
 public Polygon2D Geometry2D()
 {
     return(new Polygon2D
     {
         Vertices = BaseVertices.Concat(EndVertices).ToList(),
     });
 }
Example #2
0
        public Polyhedron Geometry3D()
        {
            var baseVertices3D = BaseVertices.Select(baseVertex => baseVertex.ToPoint3D()).ToList();
            var endVertices3D  = EndVertices.Select(endVertex => endVertex.ToPoint3D()).ToList();

            var zeroBaseVertices = BaseBevelCuts.Any()
                ? BaseBevelCuts.SelectMany(bevelCuts => bevelCuts.Vertices.Where(vertex => Math.Abs(vertex.Z) < 0.001))
                : baseVertices3D;
            var zeroEndVertices = EndBevelCuts.Any()
                ? EndBevelCuts.SelectMany(bevelCuts => bevelCuts.Vertices.Where(vertex => Math.Abs(vertex.Z) < 0.001))
                : endVertices3D;
            var zeroFace = new Polygon3D {
                Vertices = zeroBaseVertices.Concat(zeroEndVertices).ToList()
            };

            var thicknessVector = new Vector3D {
                X = 0, Y = 0, Z = Thickness
            };

            var baseFaces = BaseBevelCuts.Any()
                ? BaseBevelCuts
                : baseVertices3D.Zip(baseVertices3D.Skip(1), (baseVertex, endVertex) => new Polygon3D
            {
                Vertices = new List <Point3D>
                {
                    baseVertex,
                    endVertex,
                    endVertex + thicknessVector,
                    baseVertex + thicknessVector,
                }
            }).ToList();

            var endFaces = EndBevelCuts.Any()
                ? EndBevelCuts
                : endVertices3D.Zip(endVertices3D.Skip(1), (baseVertex, endVertex) => new Polygon3D
            {
                Vertices = new List <Point3D>
                {
                    baseVertex,
                    endVertex,
                    endVertex + thicknessVector,
                    baseVertex + thicknessVector,
                }
            });

            var baseToEndBaseVertices = BaseBevelCuts.Any()
                ? BaseBevelCuts.Select(cut => cut.Vertices[1]).Append(BaseBevelCuts.Last().Vertices[0])
                : new List <Point3D>
            {
                baseVertices3D.Last() + thicknessVector,
                baseVertices3D.Last(),
            };

            var baseToEndEndVertices = EndBevelCuts.Any()
                ? EndBevelCuts.Select(cut => cut.Vertices[3]).Append(EndBevelCuts.Last().Vertices[0])
                : new List <Point3D>
            {
                endVertices3D.First(),
                endVertices3D.First() + thicknessVector,
            };

            var baseToEndFace = new Polygon3D
            {
                Vertices = baseToEndBaseVertices.Concat(baseToEndEndVertices).ToList(),
            };

            var endToBaseEndVertices = EndBevelCuts.Any()
                ? EndBevelCuts.Select(cut => cut.Vertices[2]).Append(EndBevelCuts.Last().Vertices[1])
                : new List <Point3D>
            {
                endVertices3D.Last() + thicknessVector,
                endVertices3D.Last()
            };

            var endToBaseBaseVertices = BaseBevelCuts.Any()
                ? BaseBevelCuts.Select(cut => cut.Vertices[3]).Append(BaseBevelCuts.Last().Vertices[2])
                : new List <Point3D>
            {
                baseVertices3D.First(),
                baseVertices3D.First() + thicknessVector,
            };

            var endToBaseFace = new Polygon3D
            {
                Vertices = endToBaseEndVertices.Concat(endToBaseBaseVertices).ToList(),
            };

            var thicknessBaseVertices = BaseBevelCuts.Any()
                ? BaseBevelCuts.SelectMany(bevelCuts =>
                                           bevelCuts.Vertices.Where(vertex => Math.Abs(vertex.Z - Thickness) < 0.001))
                : ((IEnumerable <Point3D>)baseVertices3D).Reverse().Select(vertex => vertex + thicknessVector);
            var thicknessEndVertices = EndBevelCuts.Any()
                ? EndBevelCuts.SelectMany(bevelCuts =>
                                          bevelCuts.Vertices.Where(vertex => Math.Abs(vertex.Z - Thickness) < 0.001))
                : ((IEnumerable <Point3D>)endVertices3D).Reverse().Select(vertex => vertex + thicknessVector);
            var thicknessFace = new Polygon3D {
                Vertices = thicknessBaseVertices.Concat(thicknessEndVertices).ToList()
            };

            return(new Polyhedron
            {
                Faces = baseFaces.Concat(endFaces).Prepend(zeroFace).Prepend(baseToEndFace).Prepend(endToBaseFace)
                        .Prepend(thicknessFace).ToList(),
            });
        }