ドラゴン曲線を描くプログラミングをC言語で書こうというものですが、どのように書いたらよいかわかりません。
「Dragon曲線の場合,線分を直角に曲げるという処理を,呼び出す度に反対になるようにすればよいだけです.いろいろな実装の方法があると思いますが,一番簡単なのは,-45度向きを変えていた部分を45度にし,45度向きを変えていた部分を-45度にする方法です」
というヒントをもらったのですが、これの意味もよくわからず困っています。どのように書いたらいいかわかる方どうか教えてください。
なんとか今年中に締め切ることができるように頑張ります。
No.2
- 回答日時:
AからBに向かって曲線を書く時
A--------B
を
C
/ \
/ \
A B
にして、AからC、BからCに向かって、2本の曲線を書く処理をすれば良いです。
重要なのは「AからC、BからC」です。
これを「AからC、CからB」にしてしまうと、ドラゴン曲線ではなくなってしまいます。
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で質問しましょう!
似たような質問が見つかりました
- 物理学 動き続けたときの双子のパラドックス。 12 2023/02/02 17:29
- 経済学 経済学の総需要曲線の計算方法について教えて下さい。 3 2022/06/12 13:21
- 頭痛・腰痛・肩こり 元々腰が痛い時があったのですが1週間ほど前から立ち上がって体を一直線にした時(一番痛い)、腰を後ろに 5 2022/09/01 03:16
- 運転免許・教習所 左折中に車線変更 7 2022/09/04 18:59
- デパート・百貨店 きれいにデパート包み(回転包み)が出来るようになりたくてYou Tubeを見て包み方を練習しています 3 2023/08/02 11:49
- クラシック リムスキー・コルサコフの「熊蜂の飛行」のキーを教えて下さい。 3 2022/10/29 04:30
- ドライヤー・ヘアアイロン ドライヤーの電源コードを曲げるのに耐性のあるコードを選びたいのです。 2 2022/10/18 12:58
- 物理学 どうして放物線ですか? 15 2023/06/11 09:53
- 物理学 微分方程式の物理現象への適用について 3 2023/05/14 12:22
- その他(交通機関・地図) 愛知県の車のマナーって最悪らしいけど、トヨタのおひざ元だから愛知県があまあまなんですか? 4 2022/04/16 14:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
二点の座標から距離や角度を求...
-
VC++ (byte)(col & 0xFF) の意味
-
小数点以下五桁一致の判定
-
ドラゴン曲線を再帰で書く
-
Lispにおける最大値関数
-
VBA for next
-
【VB6.0】 あるフォームから他...
-
C#のループでtextboxに値を入れ...
-
VB.NETでのイベントの途中終了
-
エクセルVBAでテキストボッ...
-
C言語のサフィックスについて
-
VBAでcallで呼び出したsubを終...
-
他のフォームから別のフォーム...
-
pthread_cond_waitとptherad_co...
-
Pythonでのstrip()とsplit()の...
-
perlによるxmlファイルの取得
-
sublimit textっていうエディタ...
-
レコードセットにnullの場合
-
C言語で10行10列の行列式の値を...
-
タイムアウトする仕組みを作りたい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
二点の座標から距離や角度を求...
-
エクセル・VBAでテキストボック...
-
複数条件のオートフィルタ(VBA)
-
VC++ (byte)(col & 0xFF) の意味
-
VB.NET)コンボボックスの連動に...
-
エクセルのVBAでの7×7の魔方陣...
-
検索結果の指定列をリストボッ...
-
for文の質問です。
-
VBAにおけるニュートン法
-
テキストファイルの読み込みと...
-
カラーの16進表記の足し算
-
2次元配列を返す関数について
-
一行飛ばしで合計
-
どいつもこいつもbot3かよ
-
小数点以下五桁一致の判定
-
こうもりの撃退法
-
4変数の非線形方程式のときかた
-
ドラゴン曲線を再帰で書く
-
三項でたとえば交換って
-
VBA public変数はどのようなこ...
おすすめ情報