From e8ab128231b333edcfa58e8395e836bfd8ff610c Mon Sep 17 00:00:00 2001 From: Pavel Date: Fri, 9 Oct 2020 16:15:23 +0200 Subject: [PATCH] initial commit --- README | 12 +++ cavegui.png | Bin 0 -> 35738 bytes cavegui.py | 237 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 249 insertions(+) create mode 100644 README create mode 100644 cavegui.png create mode 100644 cavegui.py diff --git a/README b/README new file mode 100644 index 0000000..3c748d3 --- /dev/null +++ b/README @@ -0,0 +1,12 @@ +This is a modified version of the Python script for the TI-Planet and +Planete Casio back to school 2020 contest. + +This modified version works with Python 3 under GNU Linux and MS Windows. + +The original code can be found at: + +https://tiplanet.org/forum/viewtopic.php?f=49&t=24309 + +This script can be executed with the following command: + + python3 cavegui.py diff --git a/cavegui.png b/cavegui.png new file mode 100644 index 0000000000000000000000000000000000000000..40c0e1f21a10c3a660d08fe6eb89e7ae097fa68b GIT binary patch literal 35738 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 1: + plan = plan[:-1] + if index > len(plan) - 1: + index = len(plan) - 1 + voler_selon(plan) + +def next(event): + global plan, index + if index < len(plan) - 1: + index += 1 + voler_selon(plan) + +def previous(event): + global plan, index + if index > 0: + index -= 1 + voler_selon(plan) + +def left(event, step): + global plan, index + plan[index] = (round(plan[index][0] + step, 3), plan[index][1], plan[index][2]) + voler_selon(plan) + +def right(event, step): + global plan, index + plan[index] = (round(plan[index][0] - step, 3), plan[index][1], plan[index][2]) + voler_selon(plan) + +def up(event): + global plan, index + plan[index] = (plan[index][0], plan[index][1], round(plan[index][2] + 1, 1)) + voler_selon(plan) + +def down(event): + global plan, index + if plan[index][2] > 0: + plan[index] = (plan[index][0], plan[index][1], round(plan[index][2] - 1, 1)) + voler_selon(plan) + +def plus(event): + global plan, index + plan[index] = (plan[index][0], round(plan[index][1] + 0.1, 1), plan[index][2]) + voler_selon(plan) + +def minus(event): + global plan, index + plan[index] = (plan[index][0], round(plan[index][1] - 0.1, 1), plan[index][2]) + voler_selon(plan) + +def print_code(event): + global plan + print('') + print('def plan():') + print(' for e in %s:' % plan) + print(' modifier_vol(e[0], e[1], e[2])') + print('') + +master.bind('', escape) +master.bind('', add) +master.bind('', remove) +master.bind('', previous) +master.bind('', next) +master.bind('', lambda e: left(e, 0.1)) +master.bind('', lambda e: right(e, 0.1)) +master.bind('', lambda e: left(e, 0.01)) +master.bind('', lambda e: right(e, 0.01)) +master.bind('', plus) +master.bind('', minus) +master.bind('', up) +master.bind('', down) +master.bind('p', print_code) +master.bind('P', print_code) + +canvas = Canvas(master, width = screen_w, height = screen_h + 68, bg = 'white') +canvas.pack() + +def clean_screen(): + global canvas + canvas.delete('all') + +def draw_oval(x, y, rx, ry, color): + global canvas + canvas.create_oval(x - rx, y - ry, x + rx * 2, y + ry * 2, fill = color, outline = '') + +def draw_rect(x, y, w, h, color): + global canvas + canvas.create_rectangle(x, y, x + w, y + h, fill = color, outline = '') + +def draw_line(x1, y1, x2, y2, color): + global canvas + canvas.create_line(x1, y1, x2, y2, fill = color) + +def draw_plan(): + global canvas, plan + for i in range(len(plan)): + if i == index: + color = 'blue' + else: + color = 'black' + color = 'black' + if i < 10: + y = 0 + else: + y = 16 + canvas.create_text(4 + (i % 10) * 100, screen_h + 4 + y, anchor = NW, text = '(%5.2f, %4.1f, %2.0f)' % plan[i], fill = color) + +def draw_help(): + global canvas + help = 'ay: [Shift+]Left/Right, da: Ctrl+Up/Down, dt: Up/Down, add/remove element: Enter/BackSpace, previous/next element: Ctrl+Left/Right, print code: P, exit: Esc' + canvas.create_text(4, screen_h + 36, anchor = NW, text = help, fill = 'black') + +def draw_score(state): + global canvas + canvas.create_text(4, screen_h + 52, anchor = NW, text = 'score: %7.1f (state[0]: %3.1f, state[1]: %3.1f, state[2]: %3.1f, collisions: %2.0f)' % (state[4], state[0], state[1], state[2], state[5]), fill = 'black') + +def fix_angle(a): + return a * 2 * asin(1) / pi + +def interpol1(yi, yf, dx): + return yi + dx*(yf - yi) + +def interpol_list(lst, i): + i0 = int(i) + v = lst[i0] + if i > i0 and i < len(lst) - 1: + v = interpol1(v, lst[i0 + 1], i - i0) + return v + +def test_collision(x, y): + f = cave_h - interpol_list(fl, x) + return y >= f or y <= f-interpol_list(cv, x) + +def test_collision_rect(x, y, dx, dy): + x1, x2, y1, y2 = max(0, x - dx), min(cave_w - 1, x + dx), y - dy, y + dy + return test_collision(x1, y1) + test_collision(x2, y1) + test_collision(x1, y2) + test_collision(x2, y2) + +def test_balloon(x, y, rx, ry, d_vert): + rmax, r2, k, collisions = [rx, ry][d_vert], [ry, rx][d_vert], -1, 0 + while k < rmax: + k = min(k + 1, rmax) + k2 = sqrt(max(0, r2*r2*(1 - k*k/rmax/rmax))) + collisions += test_collision_rect(x, y, [k, k2][d_vert], [k2, k][d_vert]) + return collisions + +def rxy(a): + if a%2 == 1: + rx, ry = 0, 1-2*(a%4 == 3) + else: + a = fix_angle(a * pi/2) + rx, ry = abs(cos(a)), abs(sin(a)) + return 1 + abs(rx), 1 + abs(ry) + +def modifier_vol(ay, da, dt, current): + global state + if ay or da: + state[4] += 10 + x, y, a = state[0:3] + while state[0] < cave_w - 1 and dt: + state[0] += 1 + state[2] = max(0, min(1, a + da)) + state[3] -= ay + state[1] = max(0, min(cave_h - 1, state[1] + state[3])) + dt = max(0, dt - 1) + da, dapi, dx = abs(state[2] - a), abs(state[2] - .5), 1 + state[4] += 3*(da > 0)*(1 + da) + 2*(dapi > 0)*(1 + dapi) + xc, yc, dx = x, y, 1 + rx, ry = rxy(state[2]) + if state[1] != y: + dx = min(1 / abs(state[1] - y), 1) + collisions = test_balloon(state[0], state[1], rx, ry, 0) + test_balloon(state[0], state[1], rx, ry, 1) + if collisions: + state[4] += 7 * (1 + collisions) + state[5] += collisions + while xc < state[0]: + xc += dx/zx + yc = interpol1(y, state[1], xc - x) + rx, ry = rxy(interpol1(a, state[2], state[2] - a)) + if collisions > 0: + draw_oval(xc * zx, yc * zy, rx * zx, ry * zy, 'red') + elif current: + draw_oval(xc * zx, yc * zy, rx * zx, ry * zy, 'blue') + else: + draw_oval(xc * zx, yc * zy, rx * zx, ry * zy, 'black') + x, y, a = state[0], state[1], state[2] + +def voler_selon(plan): + global state, fl, cv + state = [0, 12, .5, 0, 0, 0] + clean_screen() + draw_rect(0, 0, screen_w, screen_h, 'grey') + for x in range(cave_w): + f1, dx = cave_h - fl[x], 0 + c1 = f1 - cv[x] + while dx < zx: + f2 = cave_h - interpol_list(fl, x + dx/zx) + c2 = f2 - interpol_list(cv, x + dx/zx) + draw_line(x*zx + dx, c2 * zy, x*zx + dx, f2 * zy, 'white') + dx += 1 + for i in range(len(plan)): + modifier_vol(*plan[i], i == index) + draw_plan() + draw_help() + draw_score(state) + +voler_selon(plan) + +master.mainloop()