Ejemplo n.º 1
0
 def __init__(self, subject, clip, **kwargs) -> None:
     super().__init__(**kwargs)
     outpen = SkiaPath()
     xor(
         [self._convert_vmobject_to_skia_path(subject)],
         [self._convert_vmobject_to_skia_path(clip)],
         outpen.getPen(),
     )
     self._convert_skia_path_to_vmobject(outpen)
Ejemplo n.º 2
0
 def __init__(self, *vmobjects: VMobject, **kwargs) -> None:
     if len(vmobjects) < 2:
         raise ValueError("At least 2 mobjects needed for Union.")
     super().__init__(**kwargs)
     paths = []
     for vmobject in vmobjects:
         paths.append(self._convert_vmobject_to_skia_path(vmobject))
     outpen = SkiaPath()
     union(paths, outpen.getPen())
     self._convert_skia_path_to_vmobject(outpen)
Ejemplo n.º 3
0
    def __init__(self, *vmobjects, **kwargs) -> None:
        if len(vmobjects) < 2:
            raise ValueError("At least 2 mobjects needed for Intersection.")

        super().__init__(**kwargs)
        outpen = SkiaPath()
        intersection(
            [self._convert_vmobject_to_skia_path(vmobjects[0])],
            [self._convert_vmobject_to_skia_path(vmobjects[1])],
            outpen.getPen(),
        )
        new_outpen = outpen
        for _i in range(2, len(vmobjects)):
            new_outpen = SkiaPath()
            intersection(
                [outpen],
                [self._convert_vmobject_to_skia_path(vmobjects[_i])],
                new_outpen.getPen(),
            )
            outpen = new_outpen

        self._convert_skia_path_to_vmobject(outpen)
Ejemplo n.º 4
0
    def _convert_vmobject_to_skia_path(self, vmobject: VMobject) -> SkiaPath:
        """Converts a :class:`~.VMobject` to SkiaPath. This method only works for
        cairo renderer because it treats the points as Cubic beizer curves.

        Parameters
        ----------
        vmobject:
            The :class:`~.VMobject` to convert from.

        Returns
        -------
        SkiaPath:
            The converted path.
        """
        path = SkiaPath()

        if not np.all(np.isfinite(vmobject.points)):
            points = np.zeros((1, 3))  # point invalid?
        else:
            points = vmobject.points

        if len(points) == 0:  # what? No points so return empty path
            return path

        # In OpenGL it's quadratic beizer curves while on Cairo it's cubic...
        if config.renderer == "opengl":
            subpaths = vmobject.get_subpaths_from_points(points)
            for subpath in subpaths:
                quads = vmobject.get_bezier_tuples_from_points(subpath)
                start = subpath[0]
                path.moveTo(*start[:2])
                for p0, p1, p2 in quads:
                    path.quadTo(*p1[:2], *p2[:2])
                if vmobject.consider_points_equals(subpath[0], subpath[-1]):
                    path.close()
        else:
            subpaths = vmobject.gen_subpaths_from_points_2d(points)
            for subpath in subpaths:
                quads = vmobject.gen_cubic_bezier_tuples_from_points(subpath)
                start = subpath[0]
                path.moveTo(*start[:2])
                for p0, p1, p2, p3 in quads:
                    path.cubicTo(*p1[:2], *p2[:2], *p3[:2])

                if vmobject.consider_points_equals_2d(subpath[0], subpath[-1]):
                    path.close()

        return path