[python] Implement turtle.position()

This commit is contained in:
Jean-Baptiste Boric
2018-10-30 18:10:25 +01:00
parent 0c94f44399
commit fcf7cc33cf
4 changed files with 61 additions and 23 deletions

View File

@@ -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)

View File

@@ -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 },

View File

@@ -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();

View File

@@ -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;