private static IEnumerable <Vector3> ArcVertices(IArc arc, IArc nextArc, Sweepline sweepline) { if (arc.LeftNeighbour == arc.Site) { var azimuths = DrawingUtilities.AnglesInRange(0, 2 * Mathf.PI, NumberOfVerticesPerArc); var vertices = azimuths.Select(azimuth => PointOnEllipse(arc, azimuth, sweepline)).ToList(); return(vertices); } else if (Mathf.Approximately((float)arc.Site.Priority, (float)sweepline.Priority)) { var intersection = arc.PointOfIntersection(sweepline).ToUnityVector3(); var site = arc.Site.Position.ToUnityVector3(); var downArc = DrawingUtilities.VerticesOnGeodesic(intersection, site, NumberOfVerticesPerArc); var upArc = DrawingUtilities.VerticesOnGeodesic(site, intersection, NumberOfVerticesPerArc); var vertices = downArc.Concat(upArc); return(vertices); } else { var leftLimit = DrawingUtilities.AzimuthOf(arc.LeftIntersection(sweepline).ToUnityVector3()); var rightLimit = DrawingUtilities.AzimuthOf(nextArc.LeftIntersection(sweepline).ToUnityVector3()); var azimuths = DrawingUtilities.AnglesInRange(leftLimit, rightLimit, NumberOfVerticesPerArc); var vertices = azimuths.Select(azimuth => PointOnEllipse(arc, azimuth, sweepline)).ToList(); return(vertices); } }
private static IEnumerable <Vector3> VerticesInEdge(Vertex origin, Vertex destination) { var originVector = origin.Position.ToUnityVector3(); var destinationVector = destination.Position.ToUnityVector3(); if (originVector == destinationVector || Vector3.Cross(originVector, destinationVector) != new Vector3(0, 0, 0)) { return(DrawingUtilities.VerticesOnGeodesic(originVector, destinationVector, NumberOfVerticesPerEdge)); } else { var commonSites = origin.Sites.Intersect(destination.Sites).ToList(); var normal = -(commonSites.First().Position.ToUnityVector3() - commonSites.Last().Position.ToUnityVector3()).normalized; return(DrawingUtilities.VerticesOnHalfOfGreatCircle(originVector, normal, NumberOfVerticesPerEdge)); } }