#wallpaper import gradio as gr import math import random def generate_svg(width, height, num_shapes, symmetry_group, shape_complexity, color_scheme): # Calculate the size of a single tile tile_width = width // 3 tile_height = height // 3 svg = f'' # Create a group for the tile svg += f'' def create_shape(x, y): shape_type = random.choice(['circle', 'rect', 'polygon', 'star', 'flower']) colors = get_color_scheme(color_scheme) color = random.choice(colors) if shape_type == 'circle': r = random.randint(5, 20) return f'' elif shape_type == 'rect': w, h = random.randint(10, 40), random.randint(10, 40) return f'' elif shape_type == 'polygon': points = " ".join([f"{x+random.randint(-20,20)},{y+random.randint(-20,20)}" for _ in range(shape_complexity)]) return f'' elif shape_type == 'star': points = star_points(x, y, 5, 10, 20) return f'' else: # flower petals = flower_petals(x, y, shape_complexity, 20) return f'' def apply_symmetry(shape, group): shapes = [shape] if 'p1' in group: # Translation shapes.append(shape.replace(f'x="{x}"', f'x="{x+50}"').replace(f'y="{y}"', f'y="{y+50}"')) if 'pm' in group: # Reflection shapes.append(shape.replace(f'x="{x}"', f'x="{tile_width-x}"')) if 'pg' in group: # Glide reflection shapes.append(shape.replace(f'x="{x}"', f'x="{tile_width-x}"').replace(f'y="{y}"', f'y="{y+50}"')) if 'cm' in group: # Reflection + Glide reflection shapes.append(shape.replace(f'x="{x}"', f'x="{tile_width-x}"')) shapes.append(shape.replace(f'x="{x}"', f'x="{tile_width-x}"').replace(f'y="{y}"', f'y="{y+50}"')) if 'p2' in group: # 180° rotation shapes.append(shape.replace(f'x="{x}"', f'x="{tile_width-x}"').replace(f'y="{y}"', f'y="{tile_height-y}"')) if 'p4' in group: # 90° rotation for i in range(1, 4): angle = i * 90 shapes.append(f'{shape}') return "".join(shapes) for _ in range(num_shapes): x, y = random.randint(0, tile_width), random.randint(0, tile_height) shape = create_shape(x, y) svg += apply_symmetry(shape, symmetry_group) svg += '' # Use the tile to create a 3x3 grid for i in range(3): for j in range(3): svg += f'' svg += '' return svg def star_points(cx, cy, inner_radius, outer_radius, num_points): points = [] for i in range(num_points * 2): angle = math.pi * i / num_points radius = inner_radius if i % 2 == 0 else outer_radius x = cx + math.cos(angle) * radius y = cy + math.sin(angle) * radius points.append(f"{x},{y}") return " ".join(points) def flower_petals(cx, cy, num_petals, size): path = f"M {cx},{cy}" for i in range(num_petals): angle = 2 * math.pi * i / num_petals x1 = cx + math.cos(angle) * size * 0.5 y1 = cy + math.sin(angle) * size * 0.5 x2 = cx + math.cos(angle) * size y2 = cy + math.sin(angle) * size path += f" Q {x1},{y1} {x2},{y2} Q {x1},{y1} {cx},{cy}" return path def get_color_scheme(scheme): schemes = { 'Pastel': ['#FFB3BA', '#BAFFC9', '#BAE1FF', '#FFFFBA'], 'Vibrant': ['#FF1493', '#00FF00', '#1E90FF', '#FFD700'], 'Earthy': ['#8B4513', '#556B2F', '#8B8B83', '#D2691E'], 'Monochrome': ['#000000', '#333333', '#666666', '#999999'] } return schemes.get(scheme, schemes['Pastel']) def generate_wallpaper(width, height, num_shapes, symmetry_group, shape_complexity, color_scheme): svg = generate_svg(width, height, num_shapes, symmetry_group, shape_complexity, color_scheme) return svg iface = gr.Interface( fn=generate_wallpaper, inputs=[ gr.Slider(300, 900, 600, label="Width"), gr.Slider(300, 900, 600, label="Height"), gr.Slider(1, 50, 10, step=1, label="Number of Shapes"), gr.Dropdown(["p1", "pm", "pg", "cm", "p2", "p4"], label="Symmetry Group"), gr.Slider(3, 10, 5, step=1, label="Shape Complexity"), gr.Dropdown(["Pastel", "Vibrant", "Earthy", "Monochrome"], label="Color Scheme") ], outputs=gr.HTML(), title="An SVG Wallpaper Pattern Generator v2", description="Generate custom SVG wallpaper patterns with various symmetry groups and shape types." ) iface.launch(share=True)