123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- from typing import List, Tuple
- import numpy as np
- from matplotlib.patches import Circle, Polygon
- from matplotlib.axes import Axes
- from .circle_math import point_of_intersection_with_unit
- # UTILS
- def draw_smith_circle(ax: Axes, x: float, y: float, r: float, color=(0, 0, 0)):
- ax.add_artist(
- Circle((x, y),
- r,
- clip_on=True,
- zorder=2,
- linewidth=2,
- edgecolor=color,
- facecolor=(0, 0, 0, .0)))
- def draw_grid_circle(ax: Axes,
- x: float,
- y: float,
- r: float,
- color=(.2, .2, .2, .5),
- clip=None):
- a = ax.add_artist(
- Circle((x, y),
- r,
- clip_on=True,
- linewidth=1.5,
- edgecolor=color,
- facecolor=(0, 0, 0, 0)))
- if clip:
- a.set_clip_path(clip)
- def draw_polygon(axis: Axes, a: List, color=(0, 0, 0), clip=None):
- artist = axis.add_artist(
- Polygon(np.array(a),
- clip_on=True,
- linewidth=1.5,
- edgecolor=color,
- facecolor=(0, 0, 0, 0)))
- if clip:
- artist.set_clip_path(clip)
- # !UTILS
- # |S|
- def plot_abs_s_gridlines(ax: Axes):
- abs_s_ticks = [0.1, 0.3, 0.5, 0.75, 1]
- for r in abs_s_ticks:
- draw_grid_circle(ax, 0, 0, r)
- ax.text(r / (2**0.5) + 0.05,
- r / (2**0.5) + 0.05,
- f'{r:0.2f}'.rstrip('.0'),
- horizontalalignment='center',
- verticalalignment='center',
- fontsize=12)
- # Re(Z)
- def plot_re_z_gridlines(ax: Axes):
- z_ticks = [0, 0.2, 0.5, 1, 2, 5]
- for r in z_ticks:
- draw_grid_circle(ax, r / (1 + r), 0, 1 / (1 + r))
- if r != 0:
- ax.text(r / (1 + r) * 2 - 1.055,
- 0.045,
- f'{r}',
- horizontalalignment='center',
- verticalalignment='center',
- fontsize=12)
- # Im(Z)
- def plot_im_z_gridlines(ax: Axes):
- patch = Circle(
- (0, 0),
- radius=1,
- transform=ax.transData,
- )
- z_ticks = [0.2, 0.5, 1, 2, 5]
- for r in z_ticks:
- for direction in (-1, 1):
- x, y, r = 1, direction * 1 / r, 1 / r
- draw_grid_circle(ax, x, y, r, clip=patch)
- tx, ty = point_of_intersection_with_unit(x, y, r)
- ax.text(
- tx * 1.10,
- ty * 1.07,
- f'{direction/r}'.rstrip('.0') + 'j',
- horizontalalignment='center',
- verticalalignment='center',
- fontsize=12,
- )
- # 'x' line
- draw_polygon(ax, [[-1, 0], [1, 0]], clip=patch)
- ax.text(-1.13,
- 0.01,
- '0 + 0j',
- horizontalalignment='center',
- verticalalignment='center',
- fontsize=12)
- ax.set_clip_box([[-1, 1], [-1, 1]])
- ax.set_clip_on(True)
- ax.text(1.07,
- 0.01,
- r"$\infty$",
- horizontalalignment='center',
- verticalalignment='center',
- fontsize=24)
|