
ドラゴン曲線を描くプログラミングを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);
}
}
}
}
インデントが「全角スペース」になっているので、半角スペース等に置き換えて下さい。
回答ありがとうございます!
今、必至でこのプログラムの意味を解読しています。
わからないことがあったらまた質問するかもしれません。
No.4
- 回答日時:
#1です。
>コッホ曲線も書くことができません。
件の「ヒント」は、おそらくC曲線が書けるようになったことを踏まえてのヒントだと思います。
なので、なので、C曲線が書けない段階で読んでも意味がわからないと思います。
書き方ですが、ドラゴン曲線がC曲線、コッホ曲線に比べて、特に難しいというわけではありません。
擬似コードだと、#2さんの図を借りて、
点Aから点Bまでドラゴン曲線を描く関数
もし、十分細かいなら
点Aから点Bまで直線を描く
そうでないなら、
点Cを求める
点Aから点Cまでドラゴン曲線を描く関数を呼ぶ
点Bから点Cまでドラゴン曲線を描く関数を呼ぶ
関数終わり
こんな感じです。
点Cの求め方ですが、条件を限定して、#3さんの方法で求めることもできますが、任意の点A、点Bから点Cを求めることも難しくはないです。
図を書いて、三角形の合同を使って考えればよいです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルのVBAでの7×7の魔方陣...
-
VBAでcallで呼び出したsubを終...
-
vb.net 文字コードから漢字へ変換
-
C#のループでtextboxに値を入れ...
-
subsequentとnextの違いってな...
-
アクセスできない保護レベルエ...
-
SavePictureで保存できない
-
【VB.NET】テキストボックスに...
-
VB.netである関数を呼んで、そ...
-
VBAで入力数値について
-
[vb.net] 起動したFrom2を閉じ...
-
VB6で配列を引数にするときの2...
-
ClickとChangeイベントの違いは...
-
ExcelVBAイベントでTrueにしたf...
-
pthread_cond_waitとptherad_co...
-
vba 日本語以外を抽出について
-
Functionの戻り値を配列にした...
-
VB.NETでのイベントの途中終了
-
ディレクトリ以下のファイル・...
-
チェックボックスを操作できな...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
二点の座標から距離や角度を求...
-
ドラゴン曲線を再帰で書く
-
VBAにおけるニュートン法
-
検索結果の指定列をリストボッ...
-
エクセル・VBAでテキストボック...
-
カラーの16進表記の足し算
-
VB.NET)コンボボックスの連動に...
-
VC++ (byte)(col & 0xFF) の意味
-
複数条件のオートフィルタ(VBA)
-
このプログラムがうまく作動し...
-
2次元配列を返す関数について
-
線の太さ
-
C#を勉強していて、指定したフ...
-
VBA public変数はどのようなこ...
-
エクセルVBAでテキストボッ...
-
他のフォームから別のフォーム...
-
レコードセットにnullの場合
-
VBAで入力数値について
-
VBAでcallで呼び出したsubを終...
-
チェックボックスを操作できな...
おすすめ情報