I wanted to create a tattoo combining three childhood magic universes that shaped both my own upbringing and my daughter’s: Harry Potter’s Deathly Hallows, Zelda’s Triforce, and Pokémon’s Poké Ball. My design is two-fold — I have always been drawn to geometry: triangles, inner and outer circles, symmetry and harmony. But I am also a nerd: look closely and you will find all three hidden in the shapes, along with the peace symbol and even Trivial Pursuit.
I started with Harry Potter’s Deathly Hallows — three objects that together make the bearer the Master of Death:
Next, Zelda’s Triforce, on its own: three lines connecting the midpoints of an equilateral triangle’s sides subdivide it into four smaller triangles. The three corner triangles form the Triforce, with the inverted center triangle as the negative space between them.
And Pokémon’s Poké Ball, on its own: a circle with a small filled dot at its center. When a Poké Ball is thrown at a target, it opens and converts the Pokémon into energy to capture it. Despite their small, pocket-sized exterior, Poké Balls house a customized, comfortable habitat for the Pokémon living inside.
With all three symbols designed on their own, I combined them: the Deathly Hallows’ triangle, circle, and vertical line already share the same geometry as the Triforce’s subdivided triangle and the Poké Ball’s circle and center dot, so all three overlap perfectly into one figure.
I almost stopped at the combined step, but something felt off: the Deathly Hallows and the Triforce each contributed 3 elements, while the altitudes had only 1. I also noticed the design only had 1 line of symmetry at that point — I wanted the full 6 that an equilateral triangle is capable of.
Adding the two remaining altitudes — one from each bottom vertex perpendicular to the opposite side. All three altitudes of an equilateral triangle meet at a single center point, which is also the center of the inscribed circle.
from PIL import Image, ImageDraw
import math
SCALE = 4
SIZE = 180 * SCALE # 720px high-res canvas
PAD = 10 # padding so strokes don't clip
LW = SCALE * 2 # 8px at 720 -> 2px after downscale
# Equilateral triangle, pointing up, centered in canvas
side = SIZE - 2 * PAD
tri_h = side * math.sqrt(3) / 2
cx = SIZE / 2
cy = SIZE / 2
top_y = cy - tri_h / 2
bottom_y = cy + tri_h / 2
apex = (cx, top_y)
bl = (PAD, bottom_y)
br = (SIZE - PAD, bottom_y)
# Inscribed circle: inradius = tri_h / 3, tangent to all three sides
inradius = tri_h / 3
ic_center = (cx, bottom_y - inradius)
def new_img():
img = Image.new('RGB', (SIZE, SIZE), 'white')
return img, ImageDraw.Draw(img)
def save(img, name):
img.save(name)
img.resize((180, 180), Image.LANCZOS).save('thumb_' + name)
def draw_triangle(draw):
draw.line([apex, bl, br, apex], fill='black', width=LW)
def draw_circle(draw):
x0 = ic_center[0] - inradius
y0 = ic_center[1] - inradius
x1 = ic_center[0] + inradius
y1 = ic_center[1] + inradius
draw.ellipse([x0, y0, x1, y1], outline='black', width=LW)
def draw_vline(draw):
draw.line([apex, (cx, bottom_y)], fill='black', width=LW)
def draw_vline_short(draw):
draw.line([(cx, ic_center[1] - inradius), (cx, ic_center[1] + inradius)], fill='black', width=LW)
# Triforce midpoints
mid_left = ((cx + PAD) / 2, (top_y + bottom_y) / 2)
mid_right = ((cx + SIZE - PAD) / 2, (top_y + bottom_y) / 2)
mid_base = (cx, bottom_y)
def draw_triforce(draw):
draw.line([mid_left, mid_right], fill='black', width=LW)
draw.line([mid_left, mid_base], fill='black', width=LW)
draw.line([mid_right, mid_base], fill='black', width=LW)
def draw_pokeball(draw):
r = SCALE * 7
x0 = ic_center[0] - r
y0 = ic_center[1] - r
x1 = ic_center[0] + r
y1 = ic_center[1] + r
draw.ellipse([x0, y0, x1, y1], fill='black')
def draw_altitudes(draw):
draw.line([bl, mid_right], fill='black', width=LW)
draw.line([br, mid_left], fill='black', width=LW)
# part1: triangle + inscribed circle + vertical line (Deathly Hallows, standalone)
img, draw = new_img()
draw_triangle(draw)
draw_circle(draw)
draw_vline(draw)
save(img, 'part1.png')
# part2: triangle + Triforce subdivision (Triforce, standalone)
img, draw = new_img()
draw_triangle(draw)
draw_triforce(draw)
save(img, 'part2.png')
# part3: circle + vertical line (clipped to the circle) + center dot (Poke Ball, standalone)
img, draw = new_img()
draw_circle(draw)
draw_vline_short(draw)
draw_pokeball(draw)
save(img, 'part3.png')
# combined: all three symbols combined
img, draw = new_img()
draw_triangle(draw)
draw_circle(draw)
draw_vline(draw)
draw_triforce(draw)
draw_pokeball(draw)
save(img, 'combined.png')
# final: combined + altitudes from bottom-left and bottom-right vertices
draw_altitudes(draw)
save(img, 'final.png')
img.resize((180, 180), Image.LANCZOS).save('thumb.png')
print("Done")
The designs were created with Claude Code using Python / Pillow. These were the most significant prompts in chronological order: