Exemplo n.º 1
0
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;
        }
    }
}
Exemplo n.º 2
0
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);
        }
    }
}
Exemplo n.º 3
0
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;
    }
}
Exemplo n.º 4
0
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));
}