Пример #1
0
        public static List <Face> GetOrderedFaces(HexSpherePoint point)
        {
            var workingList = new List <Face>(point.Faces);
            var ret         = new List <Face>();

            var i = 0;

            while (i < point.Faces.Count)
            {
                if (i == 0)
                {
                    ret.Add(workingList[i]);
                    workingList.RemoveAt(i);
                }
                else
                {
                    for (var j = 0; j < workingList.Count; j++)
                    {
                        if (i > ret.Count || !FaceHelpers.AreAdjacent(workingList[j], ret[i - 1]))
                        {
                            continue;
                        }

                        ret.Add(workingList[j]);
                        workingList.RemoveAt(j);
                        break;
                    }
                }
                i++;
            }
            return(ret);
        }
Пример #2
0
        private HexSpherePoint Segment(HexSpherePoint p1, HexSpherePoint p2, float ratio)
        {
            var x = p1.X * (1 - ratio) + p2.X * ratio;
            var y = p1.Y * (1 - ratio) + p2.Y * ratio;
            var z = p1.Z * (1 - ratio) + p2.Z * ratio;

            return(new HexSpherePoint(x, y, z));
        }
Пример #3
0
        public Face(HexSpherePoint p1, HexSpherePoint p2, HexSpherePoint p3, bool registerFace = false)
        {
            Points = new[] { p1, p2, p3 };

            if (registerFace)
            {
                foreach (var p in Points)
                {
                    p.RegisterFace(this);
                }
            }
        }
Пример #4
0
        public static HexSpherePoint ProjectToRadius(HexSpherePoint point, float radius, float scale = 1.0f)
        {
            var projectedPoint = ProjectToRadius(point as Point, radius, scale);

            return(new HexSpherePoint
            {
                X = projectedPoint.X,
                Y = projectedPoint.Y,
                Z = projectedPoint.Z,
                Region = point.Region,
                Faces = point.Faces
            });
        }
Пример #5
0
        /// <summary>
        /// Divides the edge between two points into a number of subdivisions, returning a list of the new points
        /// ordered along the adge from p1 to p2.
        /// </summary>
        /// <returns></returns>
        private List <HexSpherePoint> SubdivideEdgeBetweenPoints(HexSpherePoint p1, HexSpherePoint p2, int divisions,
                                                                 Func <HexSpherePoint, HexSpherePoint> addPoint, int?regionId = null)
        {
            p1.Region = regionId;
            p2.Region = regionId;

            var points = new List <HexSpherePoint> {
                p1
            };

            for (var i = 1; i < divisions; i++)
            {
                var ratio    = (float)i / divisions;
                var newPoint = addPoint(Segment(p1, p2, ratio));
                newPoint.Region = regionId;
                points.Add(newPoint);
            }
            points.Add(p2);

            return(points);
        }