今回は中点の描画を再帰的に行って線分を描画するプログラムを作成しています.
使用言語はC言語です.
たとえば,(5,10)の点から(20,55)の点までの線分の描画を行うプログラムを考えます.
まず二点間の中点を求めて,その中点に色をつけます.(以降は(5,10)→(20,55)と表記します)
今回の場合,中点は(12,32)になりますので,この位置を赤色で塗ります.
そして,(5,10)→(12,32),(12,32)→(20,55)に対して中点描画を行います.
この流れで,再帰的に中点を描画することで線分の描画を実現しようと考えています.
以下に作成したコードの一部を記載します.
draw_lineという関数に二点のx,y座標を入力すると,線を描画します.
typedef unsigned short hword;
int main(){
draw_line(120,10,50,130,RED);
draw_line(120,10,210,150,RED);
draw_line(50,130,210,150,RED);
}
void draw_line(hword xa, hword ya, hword xb, hword yb, hword color){
hword xc, yc;
xc = (xa + xb) / 2; //中点計算(x)
yc = (ya + yb) / 2;//中点計算(y)
draw_point (xc, yc, color);//(xc,yc)座標にcolorの点を描画
if((distance(xa,xb)>1) && (distance(ya,yb)>1)){//引数となる座標のxとyの距離が1になるまで再帰を続ける
draw_line (xa, ya, xc, yc, color);
draw_line (xc, yc, xb, yb, color);
}
}
hword distance(hword a, hword b){
hword temp;
if(a>b){
return a-b;
}else{
return b-a;
}
}
線を三本引くことで三角形を描画しています.
ですが,底辺の線がおかしいです.
具体的には点の数が足りません.
おそらく再帰の条件である,
の部分に問題があると思われますが,なぜ問題なのかがわかりません.
このコードを書いた理由としては,中点を求めていくと,最終的には2点が隣り合うと考えたためです.
たとえば,(2,3)→(3,4)となった場合に,終了すればいいと考えました.
この考え方に問題があるのか,もし別の解決策等ありましたら,ご教授いただければと思います.
また,底辺以外の線が正常に描画されている理由についてもご教授いただければ幸いです.
よろしくお願いいたします.