public static void Hypercube() { List <Vector3D> vertices = new List <Vector3D>(); vertices.Add(new Vector3D(1, 1, 1, 1)); vertices.Add(new Vector3D(1, 1, 1, -1)); vertices.Add(new Vector3D(1, 1, -1, 1)); vertices.Add(new Vector3D(1, 1, -1, -1)); vertices.Add(new Vector3D(1, -1, 1, 1)); vertices.Add(new Vector3D(1, -1, 1, -1)); vertices.Add(new Vector3D(1, -1, -1, 1)); vertices.Add(new Vector3D(1, -1, -1, -1)); vertices.Add(new Vector3D(-1, 1, 1, 1)); vertices.Add(new Vector3D(-1, 1, 1, -1)); vertices.Add(new Vector3D(-1, 1, -1, 1)); vertices.Add(new Vector3D(-1, 1, -1, -1)); vertices.Add(new Vector3D(-1, -1, 1, 1)); vertices.Add(new Vector3D(-1, -1, 1, -1)); vertices.Add(new Vector3D(-1, -1, -1, 1)); vertices.Add(new Vector3D(-1, -1, -1, -1)); HashSet <H3.Cell.Edge> edges = new HashSet <H3.Cell.Edge>(new H3.Cell.EdgeEqualityComparer()); foreach (Vector3D v1 in vertices) { foreach (Vector3D v2 in vertices) { if (v1.Dist(v2) == 2) { edges.Add(new H3.Cell.Edge(v1, v2)); } } } // Radial project to S3, then stereographic to R3. foreach (H3.Cell.Edge edge in edges) { edge.Start.Normalize(); edge.Start = Sterographic.S3toR3(edge.Start); edge.End.Normalize(); edge.End = Sterographic.S3toR3(edge.End); } PovRay.WriteEdges(new PovRay.Parameters() { AngularThickness = .05 }, Geometry.Spherical, edges.ToArray(), "433.pov", append: false); }
/// <summary> /// Inputs and Outputs are in R3 (stereographically projected). /// </summary> public static Vector3D[] GeodesicPoints(Vector3D v1, Vector3D v2) { Vector3D start = Sterographic.R3toS3(v1); Vector3D end = Sterographic.R3toS3(v2); AvoidNorthPole(ref start, end); AvoidNorthPole(ref end, start); int div = 42; //int div = 56; // 343 //int div = 50; // 333 Segment seg = Segment.Line(start, end); Vector3D[] result = seg.Subdivide(div); for (int i = 0; i < result.Length; i++) { result[i].Normalize(); result[i] = Sterographic.S3toR3(result[i]); } return(result); }