class_docstr: Edge drawer implementation that draws undirected edges as
  straight lines and directed edges as tapered lines that are
  wider at the source and narrow at the destination.
class_docstr_tok: ["Edge","drawer","implementation","that","draws","undirected","edges","as","straight","lines","and","directed","edges","as","tapered","lines","that","are","wider","at","the","source","and","narrow","at","the","destination","."]
code: def draw_directed_edge(self, edge, src_vertex, dest_vertex):
      if src_vertex == dest_vertex:  # TODO
          return self.draw_loop_edge(edge, src_vertex)
  
      # Determine where the edge intersects the circumference of the
      # destination vertex.
      src_pos, dest_pos = src_vertex.position, dest_vertex.position
      dest_pos = dest_vertex.shape.intersection_point(
          dest_pos[0],
          dest_pos[1],
          src_pos[0],
          src_pos[1],
          dest_vertex.size,
      )
  
      ctx = self.context
  
      # Draw the edge
      ctx.set_source_rgba(*edge.color)
      ctx.set_line_width(edge.width)
      angle = atan2(dest_pos[1] - src_pos[1], dest_pos[0] - src_pos[0])
      arrow_size = src_vertex.size / 4.0
      aux_points = [
          (
              src_pos[0] + arrow_size * cos(angle + pi / 2),
              src_pos[1] + arrow_size * sin(angle + pi / 2),
          ),
          (
              src_pos[0] + arrow_size * cos(angle - pi / 2),
              src_pos[1] + arrow_size * sin(angle - pi / 2),
          ),
      ]
      ctx.move_to(*dest_pos)
      ctx.line_to(*aux_points[0])
      ctx.line_to(*aux_points[1])
      ctx.line_to(*dest_pos)
      ctx.fill()
  
imports: from math import atan2, cos, pi, sin
  from igraph.drawing.baseclasses import AbstractEdgeDrawer
  from igraph.drawing.colors import clamp
  from igraph.drawing.metamagic import AttributeCollectorBase
  from igraph.drawing.utils import euclidean_distance, get_bezier_control_points_for_curved_edge, intersect_bezier_curve_and_circle
  from .utils import find_cairo
label_desc: Use image node_id 1 for calling the TaperedEdgeDrawer obj's underlying member method code with example usage: obj.draw_directed_edge(edge, src_vertex, dest_vertex) and returns: self