2022-09-25 15:22:10 +03:00
|
|
|
module main
|
|
|
|
|
|
|
|
import gg
|
|
|
|
import gx
|
|
|
|
import math
|
|
|
|
|
|
|
|
const (
|
|
|
|
win_width = 700
|
|
|
|
win_height = 800
|
|
|
|
bg_color = gx.white
|
|
|
|
colour = gx.black
|
|
|
|
)
|
|
|
|
|
|
|
|
enum Selection {
|
|
|
|
segs = 0
|
|
|
|
len
|
|
|
|
}
|
|
|
|
|
|
|
|
struct App {
|
|
|
|
mut:
|
|
|
|
gg &gg.Context = unsafe { nil }
|
|
|
|
mouse struct {
|
|
|
|
mut:
|
|
|
|
x f32
|
|
|
|
y f32
|
|
|
|
}
|
|
|
|
|
|
|
|
sel Selection
|
|
|
|
segs int = 8
|
|
|
|
}
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
mut app := &App{
|
|
|
|
gg: 0
|
|
|
|
}
|
|
|
|
app.gg = gg.new_context(
|
|
|
|
width: win_width
|
|
|
|
height: win_height
|
|
|
|
create_window: true
|
|
|
|
window_title: 'Arcs and Slices'
|
|
|
|
user_data: app
|
|
|
|
bg_color: bg_color
|
|
|
|
frame_fn: on_frame
|
|
|
|
event_fn: on_event
|
|
|
|
)
|
|
|
|
app.gg.run()
|
|
|
|
}
|
|
|
|
|
|
|
|
fn on_frame(mut app App) {
|
|
|
|
app.gg.begin()
|
|
|
|
|
|
|
|
start := math.tau * app.mouse.y / (win_width * app.gg.scale)
|
|
|
|
end := math.tau * app.mouse.x / (win_width * app.gg.scale)
|
|
|
|
|
|
|
|
segs := if app.sel == .segs { '[$app.segs]' } else { '$app.segs' }
|
|
|
|
app.gg.draw_text_def(10, 10, 'Segments: $segs')
|
|
|
|
app.gg.draw_text_def(250, 10, 'Drawing Angles (radians)')
|
|
|
|
app.gg.draw_text_def(200, 26, 'Start: $start°')
|
|
|
|
app.gg.draw_text_def(350, 26, 'End: $end°')
|
|
|
|
mut x, mut y := 0, -80
|
|
|
|
|
|
|
|
y += 150
|
|
|
|
x = 20
|
|
|
|
app.gg.draw_text_def(10, y + 40, 'slice')
|
|
|
|
x += 150
|
|
|
|
app.gg.draw_slice_empty(x, y + 60, 50, start, end, app.segs, colour)
|
|
|
|
app.gg.draw_text_def(x - 50, y + 120, 'r=50 empty')
|
|
|
|
x += 150
|
|
|
|
app.gg.draw_slice_empty(x, y + 60, 0, start, end, app.segs, colour)
|
|
|
|
app.gg.draw_text_def(x - 50, y + 120, 'r=0 empty')
|
|
|
|
x += 150
|
|
|
|
app.gg.draw_slice_filled(x, y + 60, 50, start, end, app.segs, colour)
|
|
|
|
app.gg.draw_text_def(x - 50, y + 120, 'r=50 filled')
|
|
|
|
x += 150
|
|
|
|
app.gg.draw_slice_filled(x, y + 60, 0, start, end, app.segs, colour)
|
|
|
|
app.gg.draw_text_def(x - 50, y + 120, 'r=0 filled')
|
|
|
|
|
|
|
|
y += 150
|
|
|
|
x = 20
|
|
|
|
app.gg.draw_text_def(10, y + 40, 'arc_empty')
|
|
|
|
x += 150
|
|
|
|
app.gg.draw_arc_empty(x, y + 60, 30, 20, start, end, app.segs, colour)
|
|
|
|
app.gg.draw_text_def(x - 50, y + 120, 'r=[30,50]')
|
|
|
|
x += 150
|
|
|
|
app.gg.draw_arc_empty(x, y + 60, -10, 60, start, end, app.segs, colour)
|
|
|
|
app.gg.draw_text_def(x - 50, y + 120, 'r=[-10,50]')
|
|
|
|
x += 150
|
|
|
|
app.gg.draw_arc_empty(x, y + 60, 50, 0, start, end, app.segs, colour)
|
|
|
|
app.gg.draw_text_def(x - 50, y + 120, 'r=[50,50]')
|
|
|
|
x += 150
|
|
|
|
app.gg.draw_arc_empty(x, y + 60, 0, 0, start, end, app.segs, colour)
|
|
|
|
app.gg.draw_text_def(x - 50, y + 120, 'r=[0,0]')
|
|
|
|
|
|
|
|
y += 150
|
|
|
|
x = 20
|
|
|
|
app.gg.draw_text_def(10, y + 40, 'arc_filled')
|
|
|
|
x += 150
|
|
|
|
app.gg.draw_arc_filled(x, y + 60, 30, 20, start, end, app.segs, colour)
|
|
|
|
app.gg.draw_text_def(x - 50, y + 120, 'r=[30,50]')
|
|
|
|
x += 150
|
|
|
|
app.gg.draw_arc_filled(x, y + 60, -10, 60, start, end, app.segs, colour)
|
|
|
|
app.gg.draw_text_def(x - 50, y + 120, 'r=[-10,50]')
|
|
|
|
x += 150
|
|
|
|
app.gg.draw_arc_filled(x, y + 60, 50, 0, start, end, app.segs, colour)
|
|
|
|
app.gg.draw_text_def(x - 50, y + 120, 'r=[50,50]')
|
|
|
|
x += 150
|
|
|
|
app.gg.draw_arc_filled(x, y + 60, 0, 0, start, end, app.segs, colour)
|
|
|
|
app.gg.draw_text_def(x - 50, y + 120, 'r=[0,0]')
|
|
|
|
|
|
|
|
y += 150
|
|
|
|
x = 20
|
|
|
|
app.gg.draw_text_def(10, y + 40, 'arc_line')
|
|
|
|
x += 150
|
|
|
|
app.gg.draw_arc_line(x, y + 60, 50, start, end, app.segs, colour)
|
|
|
|
app.gg.draw_text_def(x - 50, y + 120, 'r=50')
|
|
|
|
x += 150
|
|
|
|
app.gg.draw_arc_line(x, y + 60, 0, start, end, app.segs, colour)
|
|
|
|
app.gg.draw_text_def(x - 50, y + 120, 'r=0')
|
|
|
|
|
|
|
|
y += 150
|
|
|
|
app.gg.draw_text_def(10, y + 20, 'Use arrow keys to increase/decrease number of segments.')
|
|
|
|
app.gg.draw_text_def(10, y + 36, 'Use the mouse to adjust the start/end angles, in radians. Mouse position (0,0) is at the top-left of the window.')
|
|
|
|
app.gg.draw_text_def(10, y + 52, 'Note: because y=0 is at the top of the screen and not the bottom, angle=0 is at the bottom of an arc, not the top!')
|
|
|
|
app.gg.draw_text_def(10, y + 68, 'Compared to a graph, where y=0 is at the bottom, arcs therefore appear y-flipped.')
|
|
|
|
|
|
|
|
app.gg.end()
|
|
|
|
}
|
|
|
|
|
|
|
|
fn on_event(e &gg.Event, mut app App) {
|
|
|
|
match e.typ {
|
|
|
|
.key_down {
|
|
|
|
match e.key_code {
|
|
|
|
.escape {
|
|
|
|
app.gg.quit()
|
|
|
|
}
|
|
|
|
.up {
|
2022-10-02 22:39:11 +03:00
|
|
|
app.sel = unsafe { Selection(math.max(0, int(app.sel) - 1)) }
|
2022-09-25 15:22:10 +03:00
|
|
|
}
|
|
|
|
.down {
|
2022-10-02 22:39:11 +03:00
|
|
|
app.sel = unsafe { Selection(math.min(int(Selection.len) - 1, int(app.sel) + 1)) }
|
2022-09-25 15:22:10 +03:00
|
|
|
}
|
|
|
|
.left {
|
|
|
|
match app.sel {
|
|
|
|
.segs {
|
|
|
|
app.segs = math.max(1, app.segs / 2)
|
|
|
|
}
|
|
|
|
else {}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
.right {
|
|
|
|
match app.sel {
|
|
|
|
.segs {
|
|
|
|
app.segs = math.min(64, app.segs * 2)
|
|
|
|
}
|
|
|
|
else {}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
.mouse_move {
|
|
|
|
app.mouse.x = e.mouse_x
|
|
|
|
app.mouse.y = e.mouse_y
|
|
|
|
}
|
|
|
|
else {}
|
|
|
|
}
|
|
|
|
}
|