Source code for pymunk.matplotlib_util

"""This submodule contains helper functions to help with quick prototyping
using pymunk together with matplotlib.

Intended to help with debugging and prototyping, not for actual production use
in a full application. The methods contained in this module is opinionated
about your coordinate system and not very optimized.
"""

__docformat__ = "reStructuredText"

import warnings
from typing import TYPE_CHECKING, Any, Sequence

import matplotlib.pyplot as plt  # type: ignore

import pymunk
from pymunk.space_debug_draw_options import SpaceDebugColor
from pymunk.vec2d import Vec2d

if TYPE_CHECKING:
    import matplotlib as mpl


[docs] class DrawOptions(pymunk.SpaceDebugDrawOptions):
[docs] def __init__(self, ax: Any) -> None: """DrawOptions for space.debug_draw() to draw a space on a ax object. Typical usage:: >>> import matplotlib as mpl >>> import matplotlib.pyplot as plt >>> import pymunk >>> import pymunk.matplotlib_util >>> space = pymunk.Space() >>> ax = plt.subplot() >>> options = pymunk.matplotlib_util.DrawOptions(ax) >>> space.debug_draw(options) You can control the color of a Shape by setting shape.color to the color you want it drawn in. >>> shape = pymunk.Circle(space.static_body, 10) >>> shape.color = (1, 0, 0, 1) # will draw shape in red See matplotlib_util.demo.py for a full example .. deprecated:: 7.0.0 If you find this class useful, please open an issue on the pymunk issue tracker at https://github.com/viblo/pymunk/issues Otherwise this is likely to be completely removed in a future Pymunk version. :Param: ax: matplotlib.Axes A matplotlib Axes object. """ warnings.warn( "matplotlib_util.DrawOptions is deprecated. If you find it useful, " "please open an issue on the pymunk issue tracker at " "https://github.com/viblo/pymunk/issues Otherwise this is likely " "to be completely removed in a future Pymunk version.", category=DeprecationWarning, stacklevel=2, ) super(DrawOptions, self).__init__() self.ax = ax
[docs] def draw_circle( self, pos: Vec2d, angle: float, radius: float, outline_color: SpaceDebugColor, fill_color: SpaceDebugColor, ) -> None: p = plt.Circle( pos, radius, facecolor=fill_color.as_float(), edgecolor=outline_color.as_float(), ) self.ax.add_patch(p) circle_edge = pos + Vec2d.from_polar(radius, angle) line = plt.Line2D( [pos.x, circle_edge.x], [pos.y, circle_edge.y], linewidth=1, color=outline_color.as_float(), ) line.set_solid_capstyle("round") self.ax.add_line(line)
[docs] def draw_segment(self, a: Vec2d, b: Vec2d, color: SpaceDebugColor) -> None: line = plt.Line2D([a.x, b.x], [a.y, b.y], linewidth=1, color=color.as_float()) line.set_solid_capstyle("round") self.ax.add_line(line)
[docs] def draw_fat_segment( self, a: Vec2d, b: Vec2d, radius: float, outline_color: SpaceDebugColor, fill_color: SpaceDebugColor, ) -> None: radius = max(1, 2 * radius) line = plt.Line2D( [a.x, b.x], [a.y, b.y], linewidth=radius, color=fill_color.as_float() ) line.set_solid_capstyle("round") self.ax.add_line(line)
[docs] def draw_polygon( self, verts: Sequence[Vec2d], radius: float, outline_color: SpaceDebugColor, fill_color: SpaceDebugColor, ) -> None: radius = max(1, 2 * radius) p = plt.Polygon( verts, linewidth=radius, joinstyle="round", facecolor=fill_color.as_float(), edgecolor=outline_color.as_float(), ) self.ax.add_patch(p)
[docs] def draw_dot(self, size: float, pos: Vec2d, color: SpaceDebugColor) -> None: p = plt.Circle(pos, size, facecolor=color.as_float(), edgecolor="None") self.ax.add_patch(p)