def __draw_link(self, vlink: VLink) -> None:
     """Draw a link."""
     if vlink.name == VLink.FRAME or not vlink.points:
         return
     pen = QPen()
     # Rearrange: Put the nearest point to the next position.
     qpoints = convex_hull(
         [(c.x * self.zoom, c.y * -self.zoom)
          for c in vlink.points_pos(self.vpoints)], as_qpoint=True)
     if (
         self.select_mode == SelectMode.LINK
         and self.vlinks.index(vlink) in self.selections
     ):
         pen.setWidth(self.link_width + 6)
         pen.setColor(Qt.black if self.monochrome else QColor(161, 16, 239))
         self.painter.setPen(pen)
         self.painter.drawPolygon(*qpoints)
     pen.setWidth(self.link_width)
     pen.setColor(Qt.black if self.monochrome else color_qt(vlink.color))
     self.painter.setPen(pen)
     self.painter.drawPolygon(*qpoints)
     if not self.show_point_mark:
         return
     pen.setColor(Qt.darkGray)
     self.painter.setPen(pen)
     p_count = len(qpoints)
     cen_x = sum(p.x() for p in qpoints) / p_count
     cen_y = sum(p.y() for p in qpoints) / p_count
     self.painter.drawText(
         QRectF(cen_x - 50, cen_y - 50, 100, 100),
         Qt.AlignCenter,
         f'[{vlink.name}]'
     )
            def catch_l(vlink: VLink) -> bool:
                """Detection function for links.

                + Is polygon: Using Qt polygon geometry.
                + If just a line: Create a range for mouse detection.
                """
                points = [(c.x * self.zoom, c.y * -self.zoom)
                          for c in vlink.points_pos(self.vpoints)]
                if len(points) > 2:
                    polygon = QPolygonF(convex_hull(points, as_qpoint=True))
                else:
                    polygon = QPolygonF(convex_hull(
                        [(x + self.sr, y + self.sr) for x, y in points]
                        + [(x - self.sr, y - self.sr) for x, y in points],
                        as_qpoint=True
                    ))
                if rect:
                    return polygon.intersects(
                        QPolygonF(self.selector.to_rect(self.zoom)))
                else:
                    return polygon.containsPoint(
                        QPointF(self.selector.x, -self.selector.y) * self.zoom,
                        Qt.WindingFill
                    )