まず、円を描くプログラムを考えてみましょう。円は、正N角形で近似することが できます。もちろん、このNの値が小さいときは(例えば正3角形や正4角形)円の ように見えませんが、Nの値をどんどん大きくすると円と見なすことができます。
左から順に、正3角形、正4角形、正8角形、正16角形、正32角形
では、まず正32角形の頂点を描くプログラムを示します。
#include <stdio.h> #include <math.h> #include <handy.h> #define PI 3.141592653589793 #define WIDTH 500.0 /* Windowの幅*/ #define HEIGHT 500.0 /* Windowの高さ*/ int main(void) { int w; double x0, y0, r, x, y, t; int i,imax; w = HgWOpen( 100.0, 100.0, WIDTH, HEIGHT ); HgWInitEPS(w,"hg_circle.eps"); /* eps ファイルで保存 */ /* Windowの中央を円の中心とする*/ x0=WIDTH/2.0; y0=HEIGHT/2.0; /* 円の半径を100とする */ r=100.0; /* 円を32分割する */ imax=32; for ( i = 1; i <= imax; i++ ) { t = 2.0*PI/imax*i; x = x0 + r*cos(t); y = y0 + r*sin(t); HgWCircleFill(w, x, y, 4.0); } getchar(); HgWClose(w); return 0; } 以下が、実行例です。これらの各頂点を直線で結ぶことで円を描くことができます。![]()
#include <stdio.h> #include <math.h> #include <handy.h> #define PI 3.141592653589793 #define WIDTH 500.0 /* Windowの幅*/ #define HEIGHT 500.0 /* Windowの高さ*/ int main(void) { int w; double x0, y0, r, x, y, t, xPrev, yPrev; int i,imax; w = HgWOpen( 100.0, 100.0, WIDTH, HEIGHT ); HgWInitEPS(w,"hg_circle.eps"); /* eps ファイルで保存 */ /* Windowの中央を円の中心とする*/ x0=WIDTH/2.0; y0=HEIGHT/2.0; /* 円の半径を100とする */ r=100.0; /* 円を32分割する */ imax=32; xPrev = x0 + r*cos(0.0); yPrev = y0 + r*sin(0.0); for ( i = 1; i <= imax; i++ ) { t = 2.0*PI/imax*i; x = x0 + r*cos(t); y = y0 + r*sin(t); HgWLine(w, x, y, xPrev, yPrev); xPrev = x; yPrev = y; } getchar(); HgWClose(w); return 0; }![]()