void turtle_draw_circle(int x0, int y0, int radius) { // implementation based on midpoint circle algorithm: // https://en.wikipedia.org/wiki/Midpoint_circle_algorithm int x = radius; int y = 0; int switch_criteria = 1 - x; if (main_turtle.filled) { turtle_fill_circle(x0, y0, radius); } while (x >= y) { turtle_draw_pixel( x + x0, y + y0); turtle_draw_pixel( y + x0, x + y0); turtle_draw_pixel(-x + x0, y + y0); turtle_draw_pixel(-y + x0, x + y0); turtle_draw_pixel(-x + x0, -y + y0); turtle_draw_pixel(-y + x0, -x + y0); turtle_draw_pixel( x + x0, -y + y0); turtle_draw_pixel( y + x0, -x + y0); y++; if (switch_criteria <= 0) { switch_criteria += 2 * y + 1; // no x-coordinate change } else { x--; switch_criteria += 2 * (y - x) + 1; } } }
void turtle_draw_line(int x0, int y0, int x1, int y1) { // uses a variant of Bresenham's line algorithm: // https://en.wikipedia.org/wiki/Talk:Bresenham%27s_line_algorithm int absX = ABS(x1-x0); // absolute value of coordinate distances int absY = ABS(y1-y0); int offX = x0<x1 ? 1 : -1; // line-drawing direction offsets int offY = y0<y1 ? 1 : -1; int x = x0; // incremental location int y = y0; int err; turtle_draw_pixel(x, y); if (absX > absY) { // line is more horizontal; increment along x-axis err = absX / 2; while (x != x1) { err = err - absY; if (err < 0) { y += offY; err += absX; } x += offX; turtle_draw_pixel(x,y); } } else { // line is more vertical; increment along y-axis err = absY / 2; while (y != y1) { err = err - absX; if (err < 0) { x += offX; err += absY; } y += offY; turtle_draw_pixel(x,y); } } }
void turtle_draw_int(int value) { // calculate number of digits to draw int ndigits = 1; if (value > 9) { ndigits = (int)(ceil(log10(value))); } // draw each digit for (int i=ndigits-1; i>=0; i--) { int digit = value % 10; for (int y=0; y<5; y++) { for (int x=0; x<4; x++) { if (TURTLE_DIGITS[digit][y*4+x] == 1) { turtle_draw_pixel(main_turtle.xpos + i*5 + x, main_turtle.ypos - y); } } } value = value / 10; } }
void turtle_dot() { // draw a pixel at the current location, regardless of pen status turtle_draw_pixel((int)round(main_turtle.xpos), (int)round(main_turtle.ypos)); }