mirror of
https://github.com/ChuckBuilds/LEDMatrix.git
synced 2026-04-11 05:13:01 +00:00
135 lines
5.0 KiB
Python
135 lines
5.0 KiB
Python
from PIL import Image, ImageDraw
|
|
import math
|
|
|
|
class WeatherIcons:
|
|
@staticmethod
|
|
def draw_sun(draw: ImageDraw, x: int, y: int, size: int = 16, color: tuple = (255, 200, 0)):
|
|
"""Draw a sun icon with rays."""
|
|
center_x = x + size // 2
|
|
center_y = y + size // 2
|
|
radius = size // 3
|
|
|
|
# Draw main sun circle
|
|
draw.ellipse([
|
|
center_x - radius, center_y - radius,
|
|
center_x + radius, center_y + radius
|
|
], fill=color)
|
|
|
|
# Draw rays
|
|
ray_length = size // 4
|
|
for angle in range(0, 360, 45):
|
|
rad = math.radians(angle)
|
|
start_x = center_x + (radius * math.cos(rad))
|
|
start_y = center_y + (radius * math.sin(rad))
|
|
end_x = center_x + ((radius + ray_length) * math.cos(rad))
|
|
end_y = center_y + ((radius + ray_length) * math.sin(rad))
|
|
draw.line([start_x, start_y, end_x, end_y], fill=color, width=2)
|
|
|
|
@staticmethod
|
|
def draw_cloud(draw: ImageDraw, x: int, y: int, size: int = 16, color: tuple = (200, 200, 200)):
|
|
"""Draw a cloud icon."""
|
|
# Draw multiple circles to form cloud shape
|
|
circle_size = size // 2
|
|
positions = [
|
|
(x + size//4, y + size//3),
|
|
(x + size//2, y + size//3),
|
|
(x + size//3, y + size//6)
|
|
]
|
|
|
|
for pos_x, pos_y in positions:
|
|
draw.ellipse([
|
|
pos_x, pos_y,
|
|
pos_x + circle_size, pos_y + circle_size
|
|
], fill=color)
|
|
|
|
@staticmethod
|
|
def draw_rain(draw: ImageDraw, x: int, y: int, size: int = 16):
|
|
"""Draw rain icon with cloud and droplets."""
|
|
# Draw cloud first
|
|
WeatherIcons.draw_cloud(draw, x, y, size)
|
|
|
|
# Draw rain drops
|
|
drop_color = (0, 150, 255) # Light blue
|
|
drop_length = size // 3
|
|
drop_spacing = size // 4
|
|
|
|
for i in range(3):
|
|
drop_x = x + size//4 + (i * drop_spacing)
|
|
drop_y = y + size//2
|
|
draw.line([
|
|
drop_x, drop_y,
|
|
drop_x - 2, drop_y + drop_length
|
|
], fill=drop_color, width=2)
|
|
|
|
@staticmethod
|
|
def draw_snow(draw: ImageDraw, x: int, y: int, size: int = 16):
|
|
"""Draw snow icon with cloud and snowflakes."""
|
|
# Draw cloud first
|
|
WeatherIcons.draw_cloud(draw, x, y, size)
|
|
|
|
# Draw snowflakes
|
|
snow_color = (200, 200, 255) # Light blue-white
|
|
flake_size = size // 6
|
|
flake_spacing = size // 4
|
|
|
|
for i in range(3):
|
|
center_x = x + size//4 + (i * flake_spacing)
|
|
center_y = y + size//2
|
|
|
|
# Draw 6-point snowflake
|
|
for angle in range(0, 360, 60):
|
|
rad = math.radians(angle)
|
|
end_x = center_x + (flake_size * math.cos(rad))
|
|
end_y = center_y + (flake_size * math.sin(rad))
|
|
draw.line([center_x, center_y, end_x, end_y], fill=snow_color, width=1)
|
|
|
|
@staticmethod
|
|
def draw_thunderstorm(draw: ImageDraw, x: int, y: int, size: int = 16):
|
|
"""Draw thunderstorm icon with cloud and lightning."""
|
|
# Draw dark cloud
|
|
WeatherIcons.draw_cloud(draw, x, y, size, color=(100, 100, 100))
|
|
|
|
# Draw lightning bolt
|
|
lightning_color = (255, 255, 0) # Yellow
|
|
bolt_points = [
|
|
(x + size//2, y + size//3),
|
|
(x + size//2 - size//4, y + size//2),
|
|
(x + size//2, y + size//2),
|
|
(x + size//2 - size//4, y + size//2 + size//4)
|
|
]
|
|
draw.line(bolt_points, fill=lightning_color, width=2)
|
|
|
|
@staticmethod
|
|
def draw_mist(draw: ImageDraw, x: int, y: int, size: int = 16):
|
|
"""Draw mist/fog icon."""
|
|
mist_color = (200, 200, 200) # Light gray
|
|
wave_height = size // 4
|
|
wave_spacing = size // 3
|
|
|
|
for i in range(3):
|
|
wave_y = y + size//3 + (i * wave_spacing)
|
|
draw.line([
|
|
x + size//4, wave_y,
|
|
x + size//4 + size//2, wave_y + wave_height
|
|
], fill=mist_color, width=2)
|
|
|
|
@staticmethod
|
|
def draw_weather_icon(draw: ImageDraw, condition: str, x: int, y: int, size: int = 16):
|
|
"""Draw the appropriate weather icon based on the condition."""
|
|
condition = condition.lower()
|
|
|
|
if 'clear' in condition or 'sunny' in condition:
|
|
WeatherIcons.draw_sun(draw, x, y, size)
|
|
elif 'cloud' in condition:
|
|
WeatherIcons.draw_cloud(draw, x, y, size)
|
|
elif 'rain' in condition or 'drizzle' in condition:
|
|
WeatherIcons.draw_rain(draw, x, y, size)
|
|
elif 'snow' in condition:
|
|
WeatherIcons.draw_snow(draw, x, y, size)
|
|
elif 'thunder' in condition or 'storm' in condition:
|
|
WeatherIcons.draw_thunderstorm(draw, x, y, size)
|
|
elif 'mist' in condition or 'fog' in condition or 'haze' in condition:
|
|
WeatherIcons.draw_mist(draw, x, y, size)
|
|
else:
|
|
# Default to cloud for unknown conditions
|
|
WeatherIcons.draw_cloud(draw, x, y, size) |