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); }
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)); }
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); } } }
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 }); }
/// <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); }