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

87 lines
2.1 KiB
Odin

package clock
import rl "vendor:raylib"
import "core:time"
import "core:time/datetime"
import "core:time/timezone"
import "core:os"
import "core:math"
TimePeriod :: enum {
AM,
PM
}
DistanceAngle :: proc(distance: f32, angle: f32) -> (vector: rl.Vector2) {
vector.x = math.sin_f32(angle)
vector.y = -math.cos_f32(angle)
vector *= distance
return
}
main :: proc() {
tz, ok := timezone.region_load("local")
rl.SetConfigFlags({.MSAA_4X_HINT})
rl.InitWindow(640, 480, "Rosetta Code - draw a clock")
screen_center := rl.Vector2 {f32(rl.GetScreenWidth()) / 2, f32(rl.GetScreenHeight()) / 2}
for !rl.WindowShouldClose() {
rl.BeginDrawing()
rl.ClearBackground(rl.RAYWHITE)
conversion_succeeded: bool = true
date_time: datetime.DateTime
date_time, ok = time.time_to_datetime(time.now())
if !ok do conversion_succeeded = false
date_time, ok = timezone.datetime_to_tz(date_time, tz)
if !ok do conversion_succeeded = false
regular_time: time.Time
regular_time, ok = time.datetime_to_time(date_time)
if !ok do conversion_succeeded = false
if !conversion_succeeded do os.exit(1)
period: TimePeriod
hour, min, sec := time.clock_from_time(regular_time)
if hour > 12 {
hour -= 12
period = .PM
}
radius := f32(rl.GetScreenHeight()) / 2.5
rl.DrawCircleV(screen_center, radius, rl.LIGHTGRAY)
rl.DrawLineEx(screen_center, screen_center + DistanceAngle(radius * .75, (f32(hour) / 12) * math.TAU), 4, rl.BLACK)
rl.DrawLineEx(screen_center, screen_center + DistanceAngle(radius * .7, (f32(min) / 60) * math.TAU), 4, rl.DARKGREEN)
rl.DrawLineEx(screen_center, screen_center + DistanceAngle(radius * .5, (f32(sec) / 60) * math.TAU), 4, rl.RED)
for i := 0; i < 60; i += 1 {
angle := (f32(i) / 60) * math.TAU
inside_distance: f32 = .8
thickness: f32 = 1.5
if i % 5 == 0 {
inside_distance = .775
thickness = 3
}
rl.DrawLineEx(screen_center + DistanceAngle(radius * inside_distance, angle), screen_center + DistanceAngle(radius * .95, angle), thickness, rl.DARKGRAY)
}
//fmt.printfln("%2d:%2d:%2d %s", hour, min, sec, period)
rl.EndDrawing()
}
rl.CloseWindow()
timezone.region_destroy(tz)
}