RosettaCodeData/Task/Draw-a-clock/Ring/draw-a-clock.ring
2026-04-30 12:34:36 -04:00

96 lines
2.6 KiB
Text

# Author: Gal Zsolt (CalmoSoft)
load "libsdl.ring"
load "stdlibcore.ring"
# Settings
screen_w = 640
screen_h = 480
xp = screen_w/2
yp = screen_h/2
size = 200
pi = 3.14159265
sdl_init(SDL_INIT_EVERYTHING)
window = sdl_createwindow("Analog Clock - CalmoSoft", 100, 100, screen_w, screen_h, SDL_WINDOW_SHOWN)
render = sdl_createrenderer(window, -1, SDL_RENDERER_ACCELERATED)
ev = sdl_new_sdl_event()
while true
# Event handling
sdl_pollevent(ev)
if sdl_get_sdl_event_type(ev) = SDL_QUIT exit ok
# Get system time
t = time()
h = 0 + substr(t,1,2)
m = 0 + substr(t,4,2)
s = 0 + substr(t,7,2)
# Clear background (Black)
sdl_setrenderdrawcolor(render, 0, 0, 0, 255)
sdl_renderclear(render)
# Draw the clock components
draw_clock(render, xp, yp, size, h, m, s, pi)
sdl_renderpresent(render)
sdl_delay(100)
end
# Clean up
sdl_destroyrenderer(render)
sdl_destroywindow(window)
sdl_quit()
func draw_clock render, x, y, r, h, m, s, pi
# 1. Draw Clock Face (White circle outline)
sdl_setrenderdrawcolor(render, 255, 255, 255, 255)
for i = 0 to 360 step 1
angle = i * pi / 180
sdl_renderdrawpoint(render, x + r * cos(angle), y + r * sin(angle))
next
# 2. Draw Hour Markers (Ticks)
sdl_setrenderdrawcolor(render, 255, 255, 255, 255)
for i = 1 to 12
angle = i * 30 * pi / 180
x1 = x + r * 0.95 * sin(angle)
y1 = y - r * 0.95 * cos(angle)
x2 = x + r * 0.85 * sin(angle)
y2 = y - r * 0.85 * cos(angle)
sdl_renderdrawline(render, x1, y1, x2, y2)
next
# Calculate angles for hands
s_angle = (s / 60) * 2 * pi
m_angle = ((m + s/60) / 60) * 2 * pi
h_angle = ((h % 12 + m/60) / 12) * 2 * pi
# 3. Draw Hands (Thickened)
# Hour Hand (Green - thickest: 5px)
sdl_setrenderdrawcolor(render, 0, 255, 0, 255)
for i = -2 to 2
sdl_renderdrawline(render, x+i, y+i, x + r*0.5*sin(h_angle)+i, y - r*0.5*cos(h_angle)+i)
next
# Minute Hand (Blue - medium: 3px)
sdl_setrenderdrawcolor(render, 0, 100, 255, 255)
for i = -1 to 1
sdl_renderdrawline(render, x+i, y+i, x + r*0.8*sin(m_angle)+i, y - r*0.8*cos(m_angle)+i)
next
# Second Hand (Red - 2px)
sdl_setrenderdrawcolor(render, 255, 0, 0, 255)
for i = 0 to 1
sdl_renderdrawline(render, x+i, y+i, x + r*0.9*sin(s_angle)+i, y - r*0.9*cos(s_angle)+i)
next
# 4. Center Cap (Axis)
sdl_setrenderdrawcolor(render, 200, 200, 200, 255)
for i = 0 to 360 step 10
angle = i * pi / 180
for radius = 0 to 5
sdl_renderdrawpoint(render, x + radius * cos(angle), y + radius * sin(angle))
next
next