codex/grid-fitting-stroke-coverage.py

grid-fitting-stroke-coverage.py
"""Draw an ideal area-coverage example; write the PNG to the working directory."""
from pathlib import Path

import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import numpy as np


def coverage(intervals):
    return np.array([
        sum(max(0.0, min(right, column + 1) - max(left, column))
            for left, right in intervals)
        for column in range(6)
    ])


def main():
    cases = [
        ("Unfitted: both strokes are 1.2 pixels wide", [(0.4, 1.6), (3.9, 5.1)]),
        ("Fitted: both strokes are 1.0 pixel wide", [(0.0, 1.0), (4.0, 5.0)]),
    ]
    assert np.allclose(coverage(cases[0][1]), [0.6, 0.6, 0, 0.1, 1, 0.1])
    assert np.allclose(coverage(cases[1][1]), [1, 0, 0, 0, 1, 0])
    fig = plt.figure(figsize=(9, 4.2), dpi=100, facecolor="white")
    fig.suptitle("Grid fitting: matching geometry to a pixel grid",
                 y=0.97, fontsize=17, weight="bold", color="#172330")
    for left, (title, intervals) in zip([0.055, 0.555], cases):
        ax = fig.add_axes([left, 0.27, 0.39, 0.55])
        values = coverage(intervals)
        ax.imshow(np.tile(1.0 - values, (5, 1)), cmap="gray", vmin=0, vmax=1,
                  extent=(0, 6, 0, 5), origin="lower", interpolation="nearest")
        for edge in range(7):
            ax.axvline(edge, color="#82909c", linewidth=0.6)
        for edge in range(6):
            ax.axhline(edge, color="#82909c", linewidth=0.6)
        for start, end in intervals:
            ax.vlines([start, end], 0.06, 4.94, colors="#bb3e34",
                      linewidth=1.7, linestyles="dashed")
        ax.set_title(title, fontsize=11.3, pad=10)
        ax.set_xticks(np.arange(6) + 0.5, labels=[str(i) for i in range(6)])
        ax.set_yticks([])
        ax.set_xlabel("Pixel column", fontsize=10)
        ax.set(xlim=(0, 6), ylim=(0, 5))
        ax.text(0.5, -0.28, "Coverage: " + "  ".join(f"{v:.1f}" for v in values),
                transform=ax.transAxes, ha="center", fontsize=10,
                family="DejaVu Sans Mono", color="#34465b")
    fig.text(0.5, 0.075, "Red dashes: geometric stroke boundaries",
             ha="center", color="#bb3e34", fontsize=11)
    fig.text(0.5, 0.025, "Ideal area coverage on white; the fitted outlines deliberately have different geometry.",
             ha="center", color="#34465b", fontsize=10.5)
    fig.savefig(Path.cwd() / "grid-fitting-stroke-coverage.png", dpi=100,
                facecolor="white", transparent=False)
    plt.close(fig)


if __name__ == "__main__":
    main()