LoginSignup
7
6

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-07-30

0. 概要

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

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

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

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


7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6