Files
LEDMatrix/src/weather_icons.py
Chuck 953616a143 Weather forecast icon enhancements
using google icon set for weather
2025-04-07 21:44:38 -05:00

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)