private static string H3Edge(Parameters parameters, H3.Cell.Edge edge) { Vector3D v1 = edge.Start, v2 = edge.End; Vector3D[] points = null; Func <Vector3D, Sphere> sizeFunc = v => new Sphere() { Center = v, Radius = H3Models.SizeFuncConst(v, parameters.Scale) }; if (parameters.Halfspace) { points = H3Models.UHS.GeodesicPoints(v1, v2); if (!parameters.ThinEdges) { sizeFunc = v => { // XXX, inexact return(new Sphere() { Center = v, Radius = H3Models.UHS.SizeFunc(v, parameters.AngularThickness) }); } } ; } else { points = H3Models.Ball.GeodesicPoints(v1, v2); if (!parameters.ThinEdges) { sizeFunc = v => { Vector3D c; double r; H3Models.Ball.DupinCyclideSphere(v, parameters.AngularThickness / 2, out c, out r); return(new Sphere() { Center = c, Radius = r }); //return new Sphere() { Center = v, Radius = H3Models.Ball.SizeFunc( v, parameters.AngularThickness ) }; // inexact } } ; } return(H3EdgeSphereSweep(points, sizeFunc)); }
private static string Edge(Parameters parameters, Geometry g, H3.Cell.Edge edge) { Vector3D v1 = edge.Start, v2 = edge.End; Vector3D[] points = null; Func <Vector3D, Sphere> sizeFunc = v => new Sphere() { Center = v, Radius = H3Models.SizeFuncConst(v, parameters.Scale) }; //double minRad = 0.0005; double minRad = 0.0004; //double minRad = 0.0017; // STL //minRad = 0.8 / 100; if (parameters.Halfspace) { //v1 = H3Models.BallToUHS( v1 ); //v2 = H3Models.BallToUHS( v2 ); points = H3Models.UHS.GeodesicPoints(v1, v2); if (!parameters.ThinEdges) { sizeFunc = v => { // XXX, inexact return(new Sphere() { Center = v, Radius = Math.Max(H3Models.UHS.SizeFunc(v, parameters.AngularThickness), minRad) }); } } ; } else { if (g == Geometry.Hyperbolic) { points = H3Models.Ball.GeodesicPoints(v1, v2, edge.Color.Z); } else if (g == Geometry.Spherical) { points = S3.GeodesicPoints(v1, v2); //points = points.Select( p => { p.Normalize(); return p; } ).ToArray(); } else { //points = new Vector3D[] { v1, v2 }; List <Vector3D> interpolated = new List <Vector3D>(); int count = 20; for (int i = 0; i <= count; i++) { interpolated.Add(v1 + (v2 - v1) * ((double)i / count)); } points = interpolated.ToArray(); } if (!parameters.ThinEdges) { sizeFunc = v => { Vector3D c; double r; H3Models.Ball.DupinCyclideSphere(v, parameters.AngularThickness / 2, g, out c, out r); return(new Sphere() { Center = c, Radius = Math.Max(r, minRad) }); } } ; } //if( g == Geometry.Euclidean ) // return EdgeCylinder( points, sizeFunc ); return(EdgeSphereSweep(points, sizeFunc, edge.Color)); }