配列で円を描く/円の描画プログラム


0. 概要

ふとプログラムで円の描画をしたくなったが、どうやるんだ?
円の方程式を解いて、ブレゼンハムアルゴリズムでタイルを埋めるのか・・?と悩んでいたところ、以下のサイトを発見。
http://fussy.web.fc2.com/algo/algo2-1.htm

動かしてみたところ簡単に円が描画できるようになった。すごい

備忘録として残しておく。

1. 実装

#include <stdio.h>
#define CANVAS_SIZE_X 20
#define CANVAS_SIZE_Y 20
int canvas[CANVAS_SIZE_X][CANVAS_SIZE_Y];


void set_dot(int _x, int _y) {
    canvas[_x][_y] = 1;
    return;
}

void circle(int x0, int y0, int r)
{
    int x = r;
    int y = 0;
    int F = -2 * r + 3;
    while (x >= y) {
        set_dot(x0 + x, y0 + y);
        set_dot(x0 - x, y0 + y);
        set_dot(x0 + x, y0 - y);
        set_dot(x0 - x, y0 - y);
        set_dot(x0 + y, y0 + x);
        set_dot(x0 - y, y0 + x);
        set_dot(x0 + y, y0 - x);
        set_dot(x0 - y, y0 - x);
        if (F >= 0) {
            x--;
            F -= 4 * x;
        }
        y++;
        F += 4 * y + 2;
    }
}

void disp() {
    printf("---------------------------------------------\n");
    for (int i = 0; i < CANVAS_SIZE_Y; i++) {
        for (int j = 0; j < CANVAS_SIZE_X; j++) {
            printf("%d ", canvas[j][i]);
        }
        printf("\n");
    }
    printf("---------------------------------------------\n");
    return;
}

int main() {

    // Init
    for (int i = 0; i < CANVAS_SIZE_Y; i++) {
        for (int j = 0; j < CANVAS_SIZE_X; j++) {
            canvas[j][i] = 0;
        }
    }
    disp();
    circle(10, 10, 6);
    disp();

    getchar();
    return 0;
}