def sector(ray1, ray2, **extra_options): r""" Plot a sector between ``ray1`` and ``ray2`` centered at the origin. .. NOTE:: This function was intended for plotting strictly convex cones, so it plots the smaller sector between ``ray1`` and ``ray2`` and, therefore, they cannot be opposite. If you do want to use this function for bigger regions, split them into several parts. .. NOTE:: As of version 4.6 Sage does not have a graphic primitive for sectors in 3-dimensional space, so this function will actually approximate them using polygons (the number of vertices used depends on the angle between rays). INPUT: - ``ray1``, ``ray2`` -- rays in 2- or 3-dimensional space of the same length; - ``extra_options`` -- a dictionary of options that should be passed to lower level plotting functions. OUTPUT: - a plot. EXAMPLES:: sage: from sage.geometry.toric_plotter import sector sage: print sector((1,0), (0,1)) Graphics object consisting of 1 graphics primitive sage: print sector((3,2,1), (1,2,3)) Graphics3d Object """ ray1 = vector(RDF, ray1) ray2 = vector(RDF, ray2) r = ray1.norm() if len(ray1) == 2: # Plot an honest sector phi1 = arctan2(ray1[1], ray1[0]) phi2 = arctan2(ray2[1], ray2[0]) if phi1 > phi2: phi1, phi2 = phi2, phi1 if phi2 - phi1 > pi: phi1, phi2 = phi2, phi1 + 2 * pi return disk((0, 0), r, (phi1, phi2), **extra_options) else: # Plot a polygon, 30 vertices per radian. vertices_per_radian = 30 n = ceil(arccos(ray1 * ray2 / r**2) * vertices_per_radian) dr = (ray2 - ray1) / n points = (ray1 + i * dr for i in range(n + 1)) points = [r / pt.norm() * pt for pt in points] points.append(vector(RDF, 3)) return polygon(points, **extra_options)
def sector(ray1, ray2, **extra_options): r""" Plot a sector between ``ray1`` and ``ray2`` centered at the origin. .. NOTE:: This function was intended for plotting strictly convex cones, so it plots the smaller sector between ``ray1`` and ``ray2`` and, therefore, they cannot be opposite. If you do want to use this function for bigger regions, split them into several parts. .. NOTE:: As of version 4.6 Sage does not have a graphic primitive for sectors in 3-dimensional space, so this function will actually approximate them using polygons (the number of vertices used depends on the angle between rays). INPUT: - ``ray1``, ``ray2`` -- rays in 2- or 3-dimensional space of the same length; - ``extra_options`` -- a dictionary of options that should be passed to lower level plotting functions. OUTPUT: - a plot. EXAMPLES:: sage: from sage.geometry.toric_plotter import sector sage: sector((1,0), (0,1)) Graphics object consisting of 1 graphics primitive sage: sector((3,2,1), (1,2,3)) Graphics3d Object """ ray1 = vector(RDF, ray1) ray2 = vector(RDF, ray2) r = ray1.norm() if len(ray1) == 2: # Plot an honest sector phi1 = arctan2(ray1[1], ray1[0]) phi2 = arctan2(ray2[1], ray2[0]) if phi1 > phi2: phi1, phi2 = phi2, phi1 if phi2 - phi1 > pi: phi1, phi2 = phi2, phi1 + 2 * pi return disk((0,0), r, (phi1, phi2), **extra_options) else: # Plot a polygon, 30 vertices per radian. vertices_per_radian = 30 n = ceil(arccos(ray1 * ray2 / r**2) * vertices_per_radian) dr = (ray2 - ray1) / n points = (ray1 + i * dr for i in range(n + 1)) points = [r / pt.norm() * pt for pt in points] points.append(vector(RDF, 3)) return polygon(points, **extra_options)