From fcf7cc33cfd63f414bbeb674156bfef151094652 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Boric Date: Tue, 30 Oct 2018 18:10:25 +0100 Subject: [PATCH] [python] Implement turtle.position() --- python/port/genhdr/qstrdefs.in.h | 5 +++ python/port/modturtle.c | 9 ++++- python/port/modturtle.h | 5 ++- python/port/modturtle_impl.cpp | 65 +++++++++++++++++++++----------- 4 files changed, 61 insertions(+), 23 deletions(-) diff --git a/python/port/genhdr/qstrdefs.in.h b/python/port/genhdr/qstrdefs.in.h index 94fe5e180..ad4b89938 100644 --- a/python/port/genhdr/qstrdefs.in.h +++ b/python/port/genhdr/qstrdefs.in.h @@ -36,10 +36,15 @@ Q(rt) Q(left) Q(lt) Q(goto) +Q(setpos) +Q(setposition) Q(setheading) Q(seth) Q(speed) +Q(position) +Q(pos) + Q(pendown) Q(pd) Q(down) diff --git a/python/port/modturtle.c b/python/port/modturtle.c index d84a1d14c..472294708 100644 --- a/python/port/modturtle.c +++ b/python/port/modturtle.c @@ -6,10 +6,12 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(turtle_forward_obj, turtle_forward); STATIC MP_DEFINE_CONST_FUN_OBJ_1(turtle_backward_obj, turtle_backward); STATIC MP_DEFINE_CONST_FUN_OBJ_1(turtle_right_obj, turtle_right); STATIC MP_DEFINE_CONST_FUN_OBJ_1(turtle_left_obj, turtle_left); -STATIC MP_DEFINE_CONST_FUN_OBJ_2(turtle_goto_obj, turtle_goto); +STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(turtle_goto_obj, 1, 2, turtle_goto); STATIC MP_DEFINE_CONST_FUN_OBJ_1(turtle_setheading_obj, turtle_setheading); STATIC MP_DEFINE_CONST_FUN_OBJ_1(turtle_speed_obj, turtle_speed); +STATIC MP_DEFINE_CONST_FUN_OBJ_0(turtle_position_obj, turtle_position); + STATIC MP_DEFINE_CONST_FUN_OBJ_0(turtle_pendown_obj, turtle_pendown); STATIC MP_DEFINE_CONST_FUN_OBJ_0(turtle_penup_obj, turtle_penup); STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(turtle_pensize_obj, 0, 1, turtle_pensize); @@ -33,10 +35,15 @@ STATIC const mp_rom_map_elem_t turtle_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_left), (mp_obj_t)&turtle_left_obj }, { MP_ROM_QSTR(MP_QSTR_lt), (mp_obj_t)&turtle_left_obj }, { MP_ROM_QSTR(MP_QSTR_goto), (mp_obj_t)&turtle_goto_obj }, + { MP_ROM_QSTR(MP_QSTR_setpos), (mp_obj_t)&turtle_goto_obj }, + { MP_ROM_QSTR(MP_QSTR_setposition), (mp_obj_t)&turtle_goto_obj }, { MP_ROM_QSTR(MP_QSTR_setheading), (mp_obj_t)&turtle_setheading_obj }, { MP_ROM_QSTR(MP_QSTR_seth), (mp_obj_t)&turtle_setheading_obj }, { MP_ROM_QSTR(MP_QSTR_speed), (mp_obj_t)&turtle_speed_obj }, + { MP_ROM_QSTR(MP_QSTR_position), (mp_obj_t)&turtle_position_obj }, + { MP_ROM_QSTR(MP_QSTR_pos), (mp_obj_t)&turtle_position_obj }, + { MP_ROM_QSTR(MP_QSTR_pendown), (mp_obj_t)&turtle_pendown_obj }, { MP_ROM_QSTR(MP_QSTR_pd), (mp_obj_t)&turtle_pendown_obj }, { MP_ROM_QSTR(MP_QSTR_down), (mp_obj_t)&turtle_pendown_obj }, diff --git a/python/port/modturtle.h b/python/port/modturtle.h index 07757d0c3..f60cbdbc1 100644 --- a/python/port/modturtle.h +++ b/python/port/modturtle.h @@ -4,10 +4,12 @@ mp_obj_t turtle_forward(mp_obj_t px); mp_obj_t turtle_backward(mp_obj_t px); mp_obj_t turtle_right(mp_obj_t deg); mp_obj_t turtle_left(mp_obj_t deg); -mp_obj_t turtle_goto(mp_obj_t x, mp_obj_t y); +mp_obj_t turtle_goto(size_t n_args, const mp_obj_t *args); mp_obj_t turtle_setheading(mp_obj_t deg); mp_obj_t turtle_speed(mp_obj_t speed); +mp_obj_t turtle_position(); + mp_obj_t turtle_pendown(); mp_obj_t turtle_penup(); mp_obj_t turtle_pensize(size_t n_args, const mp_obj_t *args); @@ -20,4 +22,5 @@ mp_obj_t turtle_hideturtle(); mp_obj_t turtle___init__(); void turtle_initpen(int size); +void turtle_moveto(float x, float y); void turtle_deinit(); diff --git a/python/port/modturtle_impl.cpp b/python/port/modturtle_impl.cpp index 5e9bf11c4..81f7833a2 100644 --- a/python/port/modturtle_impl.cpp +++ b/python/port/modturtle_impl.cpp @@ -93,7 +93,8 @@ void dot_turtle(float x, float y) { mp_obj_t turtle_forward(mp_obj_t px) { float x = t_x + mp_obj_get_float(px)*sin(t_heading); float y = t_y + mp_obj_get_float(px)*cos(t_heading); - return turtle_goto(mp_obj_new_float(x), mp_obj_new_float(y)); + turtle_moveto(x, y); + return mp_const_none; } mp_obj_t turtle_backward(mp_obj_t px) { @@ -109,29 +110,21 @@ mp_obj_t turtle_left(mp_obj_t angle) { return turtle_setheading(mp_obj_new_float(new_angle)); } -mp_obj_t turtle_goto(mp_obj_t x, mp_obj_t y) { - float newx = mp_obj_get_float(x), newy = mp_obj_get_float(y); - float oldx = t_x, oldy = t_y; - float length = sqrt((newx - oldx) * (newx - oldx) + (newy - oldy) * (newy - oldy)); +mp_obj_t turtle_goto(size_t n_args, const mp_obj_t *args) { + float newx, newy; - if (length > 1) { - for (int i = 0; i < length; i++) { - float progress = i / length; - - if (t_speed > 0) { - Ion::Display::waitForVBlank(); - } - erase_turtle(); - dot_turtle(newx * progress + oldx * (1 - progress), newy * progress + oldy * (1 - progress)); - draw_turtle(); - } + if (n_args == 1) { + mp_obj_t *mp_coords; + mp_obj_get_array_fixed_n(args[0], 2, &mp_coords); + newx = mp_obj_get_float(mp_coords[0]); + newy = mp_obj_get_float(mp_coords[1]); + } + else { + newx = mp_obj_get_float(args[0]); + newy = mp_obj_get_float(args[1]); } - Ion::Display::waitForVBlank(); - erase_turtle(); - dot_turtle(newx, newy); - draw_turtle(); - + turtle_moveto(newx, newy); return mp_const_none; } @@ -161,6 +154,13 @@ mp_obj_t turtle_speed(mp_obj_t speed) { return mp_const_none; } +mp_obj_t turtle_position() { + mp_obj_t mp_pos[2]; + mp_pos[0] = mp_obj_new_float(t_x); + mp_pos[1] = mp_obj_new_float(t_y); + return mp_obj_new_tuple(2, mp_pos); +} + mp_obj_t turtle_pendown() { t_penup = false; return mp_const_none; @@ -257,6 +257,29 @@ void turtle_initpen(int size) { } } +void turtle_moveto(float x, float y) { + float oldx = t_x, oldy = t_y; + float length = sqrt((x - oldx) * (x - oldx) + (y - oldy) * (y - oldy)); + + if (length > 1) { + for (int i = 0; i < length; i++) { + float progress = i / length; + + if (t_speed > 0) { + Ion::Display::waitForVBlank(); + } + erase_turtle(); + dot_turtle(x * progress + oldx * (1 - progress), y * progress + oldy * (1 - progress)); + draw_turtle(); + } + } + + Ion::Display::waitForVBlank(); + erase_turtle(); + dot_turtle(x, y); + draw_turtle(); +} + void turtle_deinit() { delete[] t_underneath; t_underneath = nullptr;