public H3.Cell.Edge[] Hyperboloid() { // Draw to circles of fibers, then twist them. List<H3.Cell.Edge> fiberList = new List<H3.Cell.Edge>(); Vector3D cen = new Vector3D( 0, 0, 0.5 ); double rad = .3; Circle3D c1 = new Circle3D { Center = cen, Radius = rad }; Circle3D c2 = new Circle3D { Center = -cen, Radius = rad }; int n = 50; Vector3D[] points1 = c1.Subdivide( n ); Vector3D[] points2 = c2.Subdivide( n ); double twist = 2 * Math.PI / 3; for( int i = 0; i < points2.Length; i++ ) { points2[i].RotateXY( twist ); Vector3D e1, e2; H3Models.Ball.GeodesicIdealEndpoints( points1[i], points2[i], out e1, out e2 ); e1 = Transform( e1 ); e2 = Transform( e2 ); fiberList.Add( new H3.Cell.Edge( e1, e2 ) ); } return fiberList.ToArray(); }