- ベストアンサー
ドラゴン曲線を再帰で書く
ドラゴン曲線を描くプログラミングをC言語で書こうというものですが、どのように書いたらよいかわかりません。 「Dragon曲線の場合,線分を直角に曲げるという処理を,呼び出す度に反対になるようにすればよいだけです.いろいろな実装の方法があると思いますが,一番簡単なのは,-45度向きを変えていた部分を45度にし,45度向きを変えていた部分を-45度にする方法です」 というヒントをもらったのですが、これの意味もよくわからず困っています。どのように書いたらいいかわかる方どうか教えてください。 なんとか今年中に締め切ることができるように頑張ります。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
//(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); } } } } インデントが「全角スペース」になっているので、半角スペース等に置き換えて下さい。
その他の回答 (3)
- titokani
- ベストアンサー率19% (341/1726)
#1です。 >コッホ曲線も書くことができません。 件の「ヒント」は、おそらくC曲線が書けるようになったことを踏まえてのヒントだと思います。 なので、なので、C曲線が書けない段階で読んでも意味がわからないと思います。 書き方ですが、ドラゴン曲線がC曲線、コッホ曲線に比べて、特に難しいというわけではありません。 擬似コードだと、#2さんの図を借りて、 点Aから点Bまでドラゴン曲線を描く関数 もし、十分細かいなら 点Aから点Bまで直線を描く そうでないなら、 点Cを求める 点Aから点Cまでドラゴン曲線を描く関数を呼ぶ 点Bから点Cまでドラゴン曲線を描く関数を呼ぶ 関数終わり こんな感じです。 点Cの求め方ですが、条件を限定して、#3さんの方法で求めることもできますが、任意の点A、点Bから点Cを求めることも難しくはないです。 図を書いて、三角形の合同を使って考えればよいです。
お礼
2回も回答ありがとうございます^^ C曲線やコッホ曲線というものもあるんですね。 少し調べてみます^ ありがとうございました!
- chie65536(@chie65535)
- ベストアンサー率44% (8741/19839)
AからBに向かって曲線を書く時 A--------B を C / \ / \ A B にして、AからC、BからCに向かって、2本の曲線を書く処理をすれば良いです。 重要なのは「AからC、BからC」です。 これを「AからC、CからB」にしてしまうと、ドラゴン曲線ではなくなってしまいます。
お礼
回答ありがとうございます! そのような考えを常に頭にいれつつやってみます。
- titokani
- ベストアンサー率19% (341/1726)
ドラゴン曲線じゃなくて、コッホ曲線なら書けるのでしょうか?
補足
コッホ曲線も書くことができません。 無知ですいません。
お礼
回答ありがとうございます! 今、必至でこのプログラムの意味を解読しています。 わからないことがあったらまた質問するかもしれません。
補足
追記 なんとか完成できました。 ありがとうございました!