Walldye

Orbits

Seven tilted orbits ring a sun, each carrying one small planet. The fifth planet out is filled in like the sun.

Made with Claude Opus 5.5

Technique
line art
Shape
Any screen
Added
27 September 2026

Colours

  • #1C1B1Abackground
  • #DAD8CEforeground
  • #CF6A4Caccent

Export

Format
Shape
Size

Source code

wallpapers/orbits/design.py, 43 lines

"""Seven concentric orbits in one tilted plane round a filled sun, a planet on each, drawn as ellipses of one line weight."""

import math

from walldye import ACCENT, MUTED, UI, UI_ALT, Canvas, P, Vec, design
from walldye.geom import Affine

SUN = 40  # radius
FLAT = 0.34  # minor over major semi-axis: the tilt of the orbital plane
# Major semi-axes, each gap 20 wider than the last; the innermost clears the sun by about as
# much as the first two orbits clear each other.
ORBITS = (190, 250, 330, 430, 550, 690, 850)
# One planet per orbit: angle along it (degrees, 0 at one end of the long axis, clockwise),
# radius, and tone (0 UI_ALT, 1 MUTED, 2 ACCENT: the one filled in like the sun).
PLANETS = (
    (-166, 7, 0),
    (20, 10, 1),
    (133, 9, 0),
    (135, 16, 1),
    (-4.5, 20, 2),
    (-132, 13, 1),
    (-117, 8, 0),
)
PAINTS = (UI_ALT, MUTED, ACCENT)
EDGE = 760  # sun to right edge: the outer orbit runs off it, the next stays clear of it


@design(aspects="any")
def draw(s: Canvas) -> None:
    # landscape: right of centre, the outer orbit running off the right edge; portrait: turned
    # a quarter so the orbits run down the screen, the filled planet near the top
    c = Vec(s.w - EDGE, s.h * 0.52) if s.landscape else Vec(s.w / 2, s.h * 0.56)
    turn = Affine.rotate(deg=-14 if s.landscape else -104, about=c)
    with s.group(transform=turn):
        orbits = P()
        for rx in ORBITS:
            orbits.ellipse(c, rx, rx * FLAT)
        s.stroke(orbits, UI, 2)
        with s.buckets(PAINTS, "fill") as b:
            for rx, (deg, r, tone) in zip(ORBITS, PLANETS, strict=True):
                t = math.radians(deg)
                b[tone].circle((c.x + rx * math.cos(t), c.y + rx * FLAT * math.sin(t)), r)
            b[2].circle(c, SUN)

Run it yourself

$ git clone https://github.com/nickolaj-jepsen/walldye && cd walldye$ uv run walldye render orbits --theme fireproof -o orbits-fireproof-16x9.svg