• ベストアンサー

ドラゴン曲線を再帰で書く

ドラゴン曲線を描くプログラミングをC言語で書こうというものですが、どのように書いたらよいかわかりません。 「Dragon曲線の場合,線分を直角に曲げるという処理を,呼び出す度に反対になるようにすればよいだけです.いろいろな実装の方法があると思いますが,一番簡単なのは,-45度向きを変えていた部分を45度にし,45度向きを変えていた部分を-45度にする方法です」 というヒントをもらったのですが、これの意味もよくわからず困っています。どのように書いたらいいかわかる方どうか教えてください。 なんとか今年中に締め切ることができるように頑張ります。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

//(x1,y1)から(x2,y2)まで、lvの階層までのドラゴン曲線を描く。 //x1とx2、y1とy2のどちらかが等しい状態で呼び出す事。 //また、2点の距離は「2のn乗」である事。 //lvが0の場合は単に直線を引くだけ。 //例:1024×960の領域に描く場合は //Dragon(256,480,768,480,18); //などと呼び出す事。 //呼び出し条件に合っていない場合の動作は不定。 void Dragon(int x1,int y1,int x2,int y2,int lv) {  int h,x3,y3;  if (x1 == x2) {   h = abs(y1 - y2) / 2;   if (h * lv == 0) {    //ここで(x1,y1)から(x2,y2)まで線を描く   } else {    if (y1 < y2) {     x3 = x1 + h;     y3 = y1 + h;    } else {     x3 = x1 - h;     y3 = y1 - h;    }    Dragon(x1,y1,x3,y3,lv - 1);    Dragon(x2,y2,x3,y3,lv - 1);   }  } else if (y1 == y2) {   h = abs(x1 - x2) / 2;   if (h * lv == 0) {    //ここで(x1,y1)から(x2,y2)まで線を描く   } else {    if (x1 < x2) {     x3 = x1 + h;     y3 = y1 - h;    } else {     x3 = x1 - h;     y3 = y1 + h;    }    Dragon(x1,y1,x3,y3,lv - 1);    Dragon(x2,y2,x3,y3,lv - 1);   }  } else {   if (lv == 0) {    //ここで(x1,y1)から(x2,y2)まで線を描く   } else if (x1 < x2) {    if (y1 < y2) {     Dragon(x1,y1,x2,y1,lv - 1);     Dragon(x2,y2,x2,y1,lv - 1);    } else {     Dragon(x1,y1,x1,y2,lv - 1);     Dragon(x2,y2,x1,y2,lv - 1);    }   } else {    if (y1 < y2) {     Dragon(x1,y1,x1,y2,lv - 1);     Dragon(x2,y2,x1,y2,lv - 1);    } else {     Dragon(x1,y1,x2,y1,lv - 1);     Dragon(x2,y2,x2,y1,lv - 1);    }   }  } } インデントが「全角スペース」になっているので、半角スペース等に置き換えて下さい。

bluckb1
質問者

お礼

回答ありがとうございます! 今、必至でこのプログラムの意味を解読しています。 わからないことがあったらまた質問するかもしれません。

bluckb1
質問者

補足

追記 なんとか完成できました。 ありがとうございました!

その他の回答 (3)

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.4

#1です。 >コッホ曲線も書くことができません。 件の「ヒント」は、おそらくC曲線が書けるようになったことを踏まえてのヒントだと思います。 なので、なので、C曲線が書けない段階で読んでも意味がわからないと思います。 書き方ですが、ドラゴン曲線がC曲線、コッホ曲線に比べて、特に難しいというわけではありません。 擬似コードだと、#2さんの図を借りて、 点Aから点Bまでドラゴン曲線を描く関数  もし、十分細かいなら   点Aから点Bまで直線を描く  そうでないなら、   点Cを求める   点Aから点Cまでドラゴン曲線を描く関数を呼ぶ   点Bから点Cまでドラゴン曲線を描く関数を呼ぶ 関数終わり こんな感じです。 点Cの求め方ですが、条件を限定して、#3さんの方法で求めることもできますが、任意の点A、点Bから点Cを求めることも難しくはないです。 図を書いて、三角形の合同を使って考えればよいです。

bluckb1
質問者

お礼

2回も回答ありがとうございます^^ C曲線やコッホ曲線というものもあるんですね。 少し調べてみます^ ありがとうございました!

回答No.2

AからBに向かって曲線を書く時 A--------B を        C     /    \   /        \ A             B にして、AからC、BからCに向かって、2本の曲線を書く処理をすれば良いです。 重要なのは「AからC、BからC」です。 これを「AからC、CからB」にしてしまうと、ドラゴン曲線ではなくなってしまいます。

bluckb1
質問者

お礼

回答ありがとうございます! そのような考えを常に頭にいれつつやってみます。

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.1

ドラゴン曲線じゃなくて、コッホ曲線なら書けるのでしょうか?

bluckb1
質問者

補足

コッホ曲線も書くことができません。 無知ですいません。

関連するQ&A