summaryrefslogtreecommitdiffstats
path: root/Third_Party/generate_recursive_dithering.py
blob: 417647e05a7c4e7144fc102683d1a384cef765c6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import numpy as np
from PIL import Image, ImageDraw
import argparse
import math

from shift_image_to_corner import shift_to_corner

def create_circle_image(res, radius, center=None):
    """Create a binary image with a white circle on black background."""
    if center is None:
        center = (res/2, res/2)
    
    img = Image.new('L', (res, res), 0)
    draw = ImageDraw.Draw(img)
    
    # Convert radius and center to pixels
    r_px = int(radius * res)
    cx, cy = int(center[0]), int(center[1])
    
    # Draw white circle (255)
    draw.ellipse([cx-r_px, cy-r_px, cx+r_px, cy+r_px], fill=255)
    return img

def main():
    parser = argparse.ArgumentParser(description="Generate dot and circle images.")
    parser.add_argument("--res", type=int, default=128, help="Resolution of the images.")
    args = parser.parse_args()

    res = args.res
    goal_area = 0.1
    # a = pi * r^2
    # r = sqrt(a / pi)
    initial_r = math.sqrt(goal_area / math.pi) * res  # Start with a circle that fills 1/4 of the image
    
    # Calculate areas and radii for each layer
    initial_area = math.pi * (initial_r/res)**2
    
    # Layer 1: Single circle in corner
    r1 = math.sqrt(initial_area/1) * res  # Calculate radius consistently with other layers
    base_img = create_circle_image(res, r1/res)
    corner_img = shift_to_corner(base_img)
    corner_img.save("dots_L1.png")
    
    # Layer 2: Two circles, split area
    r2 = math.sqrt(initial_area/2) * res  # New radius for each circle
    # Create corner circle
    corner_img = shift_to_corner(create_circle_image(res, r2/res))
    # Create center circle
    center_img = create_circle_image(res, r2/res)
    # Combine images
    layer2 = Image.fromarray(np.maximum(np.array(corner_img), np.array(center_img)))
    layer2.save("dots_L2.png")
    
    # Layer 3: Three circles
    r3 = math.sqrt(initial_area/3) * res
    # Create corner and center circles as before
    corner_img = shift_to_corner(create_circle_image(res, r3/res))
    center_img = create_circle_image(res, r3/res)
    # Create top circle
    top_img = shift_to_corner(create_circle_image(res, r3/res), shift_side=False)
    # Combine images
    layer3 = Image.fromarray(np.maximum.reduce([
        np.array(corner_img),
        np.array(center_img),
        np.array(top_img)
    ]))
    layer3.save("dots_L3.png")
    
    # Layer 4: Four circles
    r4 = math.sqrt(initial_area/4) * res
    # Create corner and center circles
    corner_img = shift_to_corner(create_circle_image(res, r4/res))
    center_img = create_circle_image(res, r4/res)
    # Create top and right circles
    top_img = shift_to_corner(create_circle_image(res, r4/res), shift_side=False)
    right_img = shift_to_corner(create_circle_image(res, r4/res), shift_up=False)
    # Combine images

    layer4 = Image.fromarray(np.maximum.reduce([
        np.array(corner_img),
        np.array(center_img),
        np.array(top_img),
        np.array(right_img)
    ]))
    layer4.save("dots_L4.png")

if __name__ == "__main__":
    main()