C言語による描画(SVG編)
SVG(Scalable Vector Graphics)はベクトルグラフィックを記述するための形式です。詳しくはこちらをご覧ください。 SVGファイルを作るための簡単なライブラリです:
code:svgplot.c
static double ymax;
void plot_start(int x, int y) /* プロット開始 */
{
printf("<path d=\"");
ymax = y;
}
void plot_end(int close) /* プロット終了 */
{
if (close) printf("Z");
printf("\" fill=\"none\" stroke=\"black\" />\n");
printf("</svg>\n");
}
void move(double x, double y) /* ペンアップで移動 */
{
printf("M %g %g ", x, ymax - y);
}
void move_rel(double dx, double dy) /* 同上 (相対座標) */
{
printf("m %g %g ", dx, -dy);
}
void draw(double x, double y) /* ペンダウンで移動 */
{
printf("L %g %g ", x, ymax - y);
}
void draw_rel(double dx, double dy) /* 同上 (相対座標) */
{
printf("l %g %g ", dx, -dy);
}
上のコードを svgplot.c という名前で保存し、それと同じディレクトリ(フォルダ)に次の main.c を置いて、main.c のほうをコンパイルしてください。
code:main.c
int main(void)
{
int i;
double theta, x, y;
plot_start(300, 300); /* x, yの最大値(整数)を与えてプロット開始。最小値は0, 0(左下隅) */
for (i = 0; i < 5; i++) {
theta = 2 * M_PI * i / 5;
x = 150 + 140 * cos(theta);
y = 150 + 140 * sin(theta);
if (i == 0) {
move(x, y);
} else {
draw(x, y);
}
}
plot_end(1); /* プロット終了。1なら閉じる(出発点に戻る線を引く)。0なら閉じない */
return 0;
}
上の main.c をコンパイルしたバイナリを a.out とすれば、a.out >test.svg と打ち込むと test.svg というSVGファイルができます。これを開けば、五角形の図が現れるはずです。
向きを正しくするにはどうすればいいでしょうか。星形にするには?
もう一つおもしろい図形を描いてみましょう。これはdragon curveというものです。辰年の年賀状などにお使いください。
code:dragon.c
void dragon(int i, double dx, double dy, int sign)
{
if (i == 0) {
draw_rel(dx, dy);
} else {
dragon(i-1, (dx-sign*dy)/2, (dy+sign*dx)/2, 1);
dragon(i-1, (dx+sign*dy)/2, (dy-sign*dx)/2, -1);
}
}
int main(void)
{
plot_start(800, 500);
move(200, 200);
dragon(14, 400, 0, 1);
plot_end(0);
return 0;
}