質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

Q&A

解決済

2回答

1980閲覧

Processingでヒルベルト曲線を描く方法

diddy

総合スコア9

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

0グッド

0クリップ

投稿2020/07/03 15:30

編集2020/07/03 23:59

Processingでヒルベルト曲線(ペアノ曲線)を描く方法について

Processingでヒルベルト曲線の描画にチャレンジしているのですが, 3番目の描画からどうも繋ぎ目の線が崩れてしまいます.
何か解決策をご提示いただける方いらっしゃいますでしょうか?

3番目(正しい)の描画
イメージ説明

自分の結果
イメージ説明

自分の結果(回答者様のご指摘反映)
イメージ説明

また以下のページも参考にしましたが、うまくいきませんでした。
https://teratail.com/questions/129983

Processing

1int n = 0; 2int w = 800; 3int h = 800; 4void setup(){ 5 size(800, 800); 6 textFont(createFont("Tempus Sans ITC", 24)); 7 fill(0); 8 smooth(); 9} 10 11void Peano(int level){ 12 if(level == 1){ 13 line(0.25*w, 0.75*h, 0.25*w, 0.25*h); // draw line 14 line(0.25*w,0.25*h,0.75*w,0.25*h); // draw line 15 line(0.75*w,0.25*h,0.75*w,0.75*h); // draw line 16 return; 17 } 18 else if (level > 1){ 19 20 scale(0.5); 21 // B 22 pushMatrix(); 23 Peano(level - 1); 24 popMatrix(); 25 // C 26 pushMatrix(); 27 translate(w, 0); 28 Peano(level - 1); 29 popMatrix(); 30 // A 31 pushMatrix(); 32 translate(w, h); 33 rotate(PI/2); 34 Peano(level - 1); 35 popMatrix(); 36 // D 37 pushMatrix(); 38 translate(w, 2*h); 39 rotate(-PI/2); 40 Peano(level - 1); 41 popMatrix(); 42 43 line(0.25*w, 0.75*h,0.25*w, 1.25*h); 44 line(0.75*w,0.75*h,1.25*w,0.75*h); 45 line(1.75*w,0.75*h,1.75*w,1.25*h); 46 scale(2); 47 } 48} 49 50void mousePressed(){ 51 //左クリックで1段階進む 52 if((mouseButton == LEFT) && (n < 8)) n++; 53 //右クリックで1段階戻る 54 else if((mouseButton == RIGHT) && (n > 0)) n--; 55} 56void draw(){ 57 background(255); 58 text("n = " + n, 10, 30); 59 Peano(n); 60}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

再帰はあまり得意じゃないんですが、Peanoを各向きで描いた後つなぐ直線はPeanoの次数によって始終点(長さ)が変わるため、コの字を縮小/回転で描いた場合には始終点が得られず、再帰の流れに載らなくなってしまうように思います。

投稿2020/07/04 10:54

thkana

総合スコア7629

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

diddy

2020/07/04 10:59

やはりこの字での再帰で始終点を得るのは困難なのですね。もう一度0から再帰のプログラムを構築します。 ご回答ありがとうございます。
guest

0

ベストアンサー

Peanoの最後の方にあるline描画に対するscale(0.5)が足りてなさそうです。
あと一番最後にあるscale(2)は不要な気がします。
修正量が少ないように手を加えてみましたが、整理したらもっと良い書き方があるかもしれません。

processing

1 for (int i = 1; i < level - 1; i++) { 2 scale(0.5); 3 } 4 line(0.25*w, 0.75*h,0.25*w, 1.25*h); 5 line(0.75*w,0.75*h,1.25*w,0.75*h); 6 line(1.75*w,0.75*h,1.75*w,1.25*h);

投稿2020/07/03 17:58

hytNInE

総合スコア133

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

diddy

2020/07/03 23:57

ご回答ありがとうございます。ご指摘頂いた通りに実行してみましたが, やはり4隅の線が繋がりませんでした(上図を編集)。自分でも相当考えましたが、コの字で再帰で書こうとすること自体間違いなのかもしれないです、、、
hytNInE

2020/07/04 04:50

失礼しました。確かにダメでした。 軽くヒルベルト曲線について調べました。コの字の再帰という考え方は合っている気がします。コの描き終わりと次のコの描き始めを線でつなげる必要があるっぽいですね。あと一筆書きで描けるようにコを描く順番も考える必要がありそうです。 ↓考え方についてはこの辺りも参考にしてみてください。 https://jariten.exblog.jp/105069/
diddy

2020/07/04 10:06

ありがとうございます。順番と書き方についてもう一度検討してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問