プロが教えるわが家の防犯対策術!

ドラゴン曲線を描くプログラミングをC言語で書こうというものですが、どのように書いたらよいかわかりません。

「Dragon曲線の場合,線分を直角に曲げるという処理を,呼び出す度に反対になるようにすればよいだけです.いろいろな実装の方法があると思いますが,一番簡単なのは,-45度向きを変えていた部分を45度にし,45度向きを変えていた部分を-45度にする方法です」

というヒントをもらったのですが、これの意味もよくわからず困っています。どのように書いたらいいかわかる方どうか教えてください。
なんとか今年中に締め切ることができるように頑張ります。

A 回答 (4件)

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

この回答への補足

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

補足日時:2008/12/25 11:25
    • good
    • 0

AからBに向かって曲線を書く時



A--------B



       C
    /    \
  /        \
A             B

にして、AからC、BからCに向かって、2本の曲線を書く処理をすれば良いです。

重要なのは「AからC、BからC」です。

これを「AからC、CからB」にしてしまうと、ドラゴン曲線ではなくなってしまいます。
    • good
    • 1
この回答へのお礼

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

お礼日時:2008/12/25 11:32

//(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);
   }
  }
 }
}

インデントが「全角スペース」になっているので、半角スペース等に置き換えて下さい。

この回答への補足

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

補足日時:2008/12/27 15:40
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/12/25 12:15

#1です。


>コッホ曲線も書くことができません。
件の「ヒント」は、おそらくC曲線が書けるようになったことを踏まえてのヒントだと思います。
なので、なので、C曲線が書けない段階で読んでも意味がわからないと思います。

書き方ですが、ドラゴン曲線がC曲線、コッホ曲線に比べて、特に難しいというわけではありません。
擬似コードだと、#2さんの図を借りて、

点Aから点Bまでドラゴン曲線を描く関数
 もし、十分細かいなら
  点Aから点Bまで直線を描く
 そうでないなら、
  点Cを求める
  点Aから点Cまでドラゴン曲線を描く関数を呼ぶ
  点Bから点Cまでドラゴン曲線を描く関数を呼ぶ
関数終わり

こんな感じです。
点Cの求め方ですが、条件を限定して、#3さんの方法で求めることもできますが、任意の点A、点Bから点Cを求めることも難しくはないです。
図を書いて、三角形の合同を使って考えればよいです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/12/27 15:43

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!