mirror of
https://github.com/ChuckBuilds/LEDMatrix.git
synced 2026-04-11 05:13:01 +00:00
Weather forecast icon enhancements
using google icon set for weather
This commit is contained in:
135
src/weather_icons.py
Normal file
135
src/weather_icons.py
Normal file
@@ -0,0 +1,135 @@
|
||||
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)
|
||||
Reference in New Issue
Block a user