vec2pt / all_projects / tags / about

Maurer rose ()

Maurer rose

[sketch]

import numpy as np
from PIL import Image, ImageDraw


def maurer_rose(n: int, d: int) -> np.ndarray:
    """Maurer rose.

    Args:
        n: Positive integer.
        d: Degrees.

    Returns:
        np.ndarray: Maurer rose points array.
    """
    k = np.arange(361) * d * np.pi / 180
    r = np.sin(n * k)
    return np.array([np.cos(k), np.sin(k)]) * r


def _plot_maurer_rose(
    image_size: tuple[int, int],
    n_range: tuple[int, int],
    d_range: tuple[int, int],
    scale: float = 36,
    margin: int = 4,
) -> Image.Image:
    img = Image.new("RGB", image_size, "white")
    draw = ImageDraw.Draw(img)
    for j, d in enumerate(range(*d_range)):
        for i, n in enumerate(range(*n_range)):
            position = np.array(
                [
                    scale * i * 2 + scale + i * margin * 2 + margin,
                    scale * j * 2 + scale + j * margin * 2 + margin,
                ]
            )
            points = maurer_rose(n, d).T * scale + position
            draw.line(points.tolist(), fill="black", width=0)
    return img


if __name__ == "__main__":
    img = _plot_maurer_rose((800, 800), (9, 19), (24, 34))
    img.save("maurer-rose.png")

sketch-maurer-rose-01.png