mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-01-19 00:37:25 +01:00
[python] Implement turtle.position()
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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 },
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user