110 likes | 654 Views
Levy 曲線の書き方. 2006 年 12 月 8 日 科学科プログラミング. rp6b : Levy 曲線とは?. 与えられた線分を同じ方向に直角に曲げていく操作を繰り返した図形(直角三角形をどう描く?) 交互に直角三角形の向きを変えれば Dragon 曲線だ!. 1 次 Levy 曲線. 0 次 Levy 曲線. 3 次 Levy 曲線. 2 次 Levy 曲線. 0 次 Levy 曲線の描き方. 0 次 Levy 曲線. levy(200,0) dfollow(200); を実行すればよいことになります
E N D
Levy 曲線の書き方 2006年12月8日 科学科プログラミング
rp6b: Levy曲線とは? • 与えられた線分を同じ方向に直角に曲げていく操作を繰り返した図形(直角三角形をどう描く?) • 交互に直角三角形の向きを変えればDragon曲線だ! 1次Levy曲線 0次Levy曲線 3次Levy曲線 2次Levy曲線
0次Levy 曲線の描き方 0次Levy曲線 • levy(200,0) • dfollow(200);を実行すればよいことになります • dfollow(200) は現在位置( pos(x,y)で指定可能です) から 指定角度(初期角度は0度です) 方向に 200 進みます.ペンが降りていれば進んだ後に線が引かれます
1次Levy 曲線の描き方 1次Levy曲線 • levy(200,1) • turn(-45); • follow(200/√2); • turn(90); • follow(200/√2); • turn(-45);
1次Levy 曲線の描き方 (再帰) 1次Levy曲線 • levy(200,1) • turn(-45); • levy(200/√2, 0); • turn(90); • levy(200/√2, 0); • turn(-45);
2次Levy 曲線の描き方 2次Levy曲線 • levy(200,2) • turn(-45); • turn(-45); • dfollow(100); • turn(90); • dfollow(100); • turn(-45); • turn(90); • turn(-45); • dfollow(100); • turn(90); • dfollow(100); • turn(-45); • turn(-45);
2次Levy 曲線の描き方 (再帰) • levy(200,2) • turn(-45); • turn(-45); • dfollow(100); /* 0次Levy曲線に置き換え */ • turn(90); • dfollow(100); /* 0次Levy曲線に置き換え */ • turn(-45); • turn(90); • turn(-45); • dfollow(100); /* 0次Levy曲線に置き換え */ • turn(90); • dfollow(100); /* 0次Levy曲線に置き換え */ • turn(-45); • turn(-45);
2次Levy 曲線の描き方 (再帰) • levy(200,2) • turn(-45); • turn(-45); • levy(100,0); /* 0次Levy曲線に置き換え */ • turn(90); • levy(100,0); /* 0次Levy曲線に置き換え */ • turn(-45); • turn(90); • turn(-45); • levy(100,0); /* 0次Levy曲線に置き換え */ • turn(90); • levy(100,0); /* 0次Levy曲線に置き換え */ • turn(-45); • turn(-45);
2次Levy 曲線の描き方 (再帰) • levy(200/√2, 1) • turn(-45); • levy(100, 0); • turn(90); • levy(100, 0); • turn(-45); • levy(200,2) • turn(-45); • turn(-45); • levy(100,0); • turn(90); /* 1次Levy曲線に置き換え */ • levy(100,0); • turn(-45); • turn(90); • turn(-45); • levy(100,0); • turn(90); /* 1次Levy曲線に置き換え */ • levy(100,0); • turn(-45); • turn(-45);
2次Levy 曲線の描き方 (再帰) • levy(200,2) • turn(-45); • levy(200/√2, 1); /* 1次Levy曲線 */ • turn(90); • levy(200/√2, 1); /* 1次Levy曲線 */ • turn(-45);
levy(200,1) turn(-45); levy(200/√2, 0); turn(90); levy(200/√2, 0); turn(-45); levy(200,2) turn(-45); levy(200/√2, 1); turn(90); levy(200/√2, 1); turn(-45); 1次と2次のLevy曲線 /* levy 関数の定義 */ void levy(int leng, int dim){ if (dim < 1){ /* 終了条件 */ leng の長さの線を引く; } else { -45度回転; levy(leng/√2, dim-1); /* 再帰 */ 90度回転 levy(leng/√2, dim-1); /* 再帰 */ -45度回転; } }