Ejemplo n.º 1
0
        public static ConwayPoly ElongatedBicupola(int sides, bool gyro)
        {
            ConwayPoly poly        = ElongatedCupola(sides);
            Face       bottom      = poly.Faces[sides * 2];
            int        i           = 0;
            var        middleVerts = bottom.GetVertices();

            poly.Faces.Remove(bottom);
            poly.FaceRoles.RemoveAt(poly.FaceRoles.Count - 1);
            poly.FaceTags.RemoveAt(poly.FaceRoles.Count - 1);

            float      baseOffset  = -(_CalcSideLength(sides * 2) + _CalcCupolaHeight(sides));
            float      angleOffset = gyro ? 0.75f : 0.25f;
            ConwayPoly cap2        = _MakePolygon(sides, false, angleOffset, baseOffset, _CalcCupolaCapRadius(sides));

            poly.Append(cap2);
            var edge2 = poly.Faces.Last().Halfedge.Prev;

            int edgeOffset = gyro ? 0 : 1;

            while (true)
            {
                var side1 = new List <Vertex>
                {
                    middleVerts[PolyUtils.ActualMod(i * 2 - 1 - edgeOffset, sides * 2)],
                    middleVerts[PolyUtils.ActualMod(i * 2 - edgeOffset, sides * 2)],
                    edge2.Vertex
                };
                poly.Faces.Add(side1);
                poly.FaceRoles.Add(ConwayPoly.Roles.New);
                poly.FaceTags.Add(new HashSet <Tuple <string, ConwayPoly.TagType> >());

                var side2 = new List <Vertex>
                {
                    middleVerts[PolyUtils.ActualMod(i * 2 - edgeOffset, sides * 2)],
                    middleVerts[PolyUtils.ActualMod(i * 2 + 1 - edgeOffset, sides * 2)],
                    edge2.Next.Vertex,
                    edge2.Vertex,
                };
                poly.Faces.Add(side2);
                poly.FaceRoles.Add(ConwayPoly.Roles.NewAlt);
                poly.FaceTags.Add(new HashSet <Tuple <string, ConwayPoly.TagType> >());

                i++;
                edge2 = edge2.Next;

                if (i == sides)
                {
                    break;
                }
            }
            poly.Halfedges.MatchPairs();
            return(poly);
        }
Ejemplo n.º 2
0
        public static ConwayPoly GyroelongatedCupola(int sides)
        {
            ConwayPoly poly    = Antiprism(sides * 2);
            Face       topFace = poly.Faces[1];
            ConwayPoly cap1    = _MakePolygon(sides, true, 0f, _CalcCupolaHeight(sides) + _CalcAntiprismHeight(sides * 2), _CalcCupolaCapRadius(sides));

            poly.Append(cap1);

            int i           = 0;
            var middleVerts = topFace.GetVertices();

            poly.Faces.Remove(topFace);
            poly.FaceRoles.RemoveAt(1);
            poly.FaceTags.RemoveAt(1);

            var edge2 = poly.Faces.Last().Halfedge.Prev;

            while (true)
            {
                var side1 = new List <Vertex>
                {
                    middleVerts[PolyUtils.ActualMod(i * 2 - 1, sides * 2)],
                    middleVerts[PolyUtils.ActualMod(i * 2, sides * 2)],
                    edge2.Vertex
                };
                poly.Faces.Add(side1);
                poly.FaceRoles.Add(ConwayPoly.Roles.New);
                poly.FaceTags.Add(new HashSet <Tuple <string, ConwayPoly.TagType> >());

                var side2 = new List <Vertex>
                {
                    middleVerts[PolyUtils.ActualMod(i * 2, sides * 2)],
                    middleVerts[PolyUtils.ActualMod(i * 2 + 1, sides * 2)],
                    edge2.Next.Vertex,
                    edge2.Vertex,
                };
                poly.Faces.Add(side2);
                poly.FaceRoles.Add(ConwayPoly.Roles.NewAlt);
                poly.FaceTags.Add(new HashSet <Tuple <string, ConwayPoly.TagType> >());

                i++;
                edge2 = edge2.Next;
                if (i == sides)
                {
                    break;
                }
            }

            poly.Halfedges.MatchPairs();
            return(poly);
        }
Ejemplo n.º 3
0
        private static ConwayPoly _MakeCupola(int sides, float height, bool bi = false, bool gyro = true)
        {
            sides = Mathf.Clamp(sides, 3, 64);

            ConwayPoly poly   = _MakePolygon(sides * 2);
            Face       bottom = poly.Faces[0];
            ConwayPoly cap1   = _MakePolygon(sides, true, 0.25f, height, _CalcCupolaCapRadius(sides));

            poly.Append(cap1);

            int i = 0;
            var squareSideFaces = new List <Face>();
            var edge1           = poly.Halfedges[0];
            var edge2           = poly.Halfedges[sides * 2];

            while (true)
            {
                var side1 = new List <Vertex>
                {
                    edge1.Next.Vertex,
                    edge1.Vertex,
                    edge2.Prev.Vertex
                };
                poly.Faces.Add(side1);
                poly.FaceRoles.Add(ConwayPoly.Roles.New);
                poly.FaceTags.Add(new HashSet <Tuple <string, ConwayPoly.TagType> >());

                var side2 = new List <Vertex>
                {
                    edge1.Vertex,
                    edge1.Prev.Vertex,
                    edge2.Vertex,
                    edge2.Prev.Vertex
                };
                poly.Faces.Add(side2);
                squareSideFaces.Add(poly.Faces.Last());
                poly.FaceRoles.Add(ConwayPoly.Roles.NewAlt);
                poly.FaceTags.Add(new HashSet <Tuple <string, ConwayPoly.TagType> >());

                i++;
                edge1 = edge1.Next.Next;
                edge2 = edge2.Prev;
                if (i == sides)
                {
                    break;
                }
            }

            if (bi)
            {
                float      angleOffset = gyro ? 0.75f : 0.25f;
                ConwayPoly cap2        = _MakePolygon(sides, false, angleOffset, -height, _CalcCupolaCapRadius(sides));
                poly.Append(cap2);

                i = 0;
                var middleVerts = bottom.GetVertices();

                poly.Faces.Remove(bottom);
                poly.FaceRoles.RemoveAt(0);

                edge2 = poly.Faces.Last().Halfedge.Prev;
                int indexOffset = gyro ? 0 : -1;
                while (true)
                {
                    var side1 = new List <Vertex>
                    {
                        middleVerts[PolyUtils.ActualMod(i * 2 - 1 + indexOffset, sides * 2)],
                        middleVerts[PolyUtils.ActualMod(i * 2 + indexOffset, sides * 2)],
                        edge2.Vertex
                    };
                    poly.Faces.Add(side1);
                    poly.FaceRoles.Add(ConwayPoly.Roles.New);
                    poly.FaceTags.Add(new HashSet <Tuple <string, ConwayPoly.TagType> >());

                    var side2 = new List <Vertex>
                    {
                        middleVerts[PolyUtils.ActualMod(i * 2 + indexOffset, sides * 2)],
                        middleVerts[PolyUtils.ActualMod(i * 2 + 1 + indexOffset, sides * 2)],
                        edge2.Next.Vertex,
                        edge2.Vertex,
                    };
                    poly.Faces.Add(side2);
                    poly.FaceRoles.Add(ConwayPoly.Roles.NewAlt);
                    poly.FaceTags.Add(new HashSet <Tuple <string, ConwayPoly.TagType> >());

                    i++;
                    edge2 = edge2.Next;

                    if (i == sides)
                    {
                        break;
                    }
                }
            }

            poly.Halfedges.MatchPairs();
            return(poly);
        }