新しく発言する EXIT インデックスへ
なぜ、こんなものが描けるのか。

  なぜ、こんなものが描けるのか。 SECOND 2007/08/18 15:09:17  (修正1回)
  2進数のビット列でC曲線、ドラゴン曲線を... 山中和義 2007/08/18 23:47:53 
  !追記 SECOND 2007/08/19 20:41:53 
  !シダの葉:確率的プロットの実験、高速&リ... SECOND 2007/08/20 15:01:03 
  !アンモナイト:確率的な縮小写像。 SECOND 2007/08/20 17:29:43  (修正1回)
  │└Linuxで綺麗に書けるか心配です。というのは... SECOND 2007/08/21 16:10:00 
  │ ├画像が浮び上っていくところは幻想的です。... 山中和義 2007/08/21 17:10:51 
  │ │├正しい確率分岐だと思います。 SECOND 2007/08/21 22:57:47  (修正1回)
  │ ││└>PLOTPOINTS:x,yの前の、ELSE文が無い場... 山中和義 2007/08/22 09:29:38 
  │ ││ ├大満足です。15万発ぐらい欲しいですね。 SECOND 2007/08/22 11:18:26 
  │ ││ └貴兄の案の方が、実態に近いと思います。 SECOND 2007/08/23 17:19:32 
  │ │└DELETED  SECOND  2007/08/22 06:21:35  (削除)
  │ └SECONDさん、こんばんわ。 島村1243 2007/08/21 22:37:13 
  │  └ホッと、しました。ありがとうございます。 SECOND 2007/08/21 22:59:02 
  !山中氏の提案の方が、より実体に近い。 SECOND 2007/08/23 16:22:58 

  なぜ、こんなものが描けるのか。 SECOND 2007/08/18 15:09:17  (修正1回) ツリーへ

なぜ、こんなものが描けるのか。 返事を書く ノートメニュー
SECOND <cszcthjjdj> 2007/08/18 15:09:17 ** この記事は1回修正されてます
!なぜ、こんなものが描けるのか。
!ミクロな、隣接するステップの関係しか、計算していない。
!だが、マクロな全体形状が、制御されている。
!生体も、おそらく・・

SET TEXT FONT "MS 明朝",12
SET TEXT BACKGROUND "OPAQUE"
LET t$="シダの葉"
LET N=11
LET xm=0
LET ym=0.5
LET h=0.6
!----------
SET WINDOW xm-h,xm+h, ym-h,ym+h
DRAW axes
PLOT TEXT,AT xm+h*0.1,ym+h*0.85:t$
PLOT TEXT,AT xm+h*0.5,ym+h*0.85, USING "N= %%":N
PLOT TEXT,AT xm-h*0.75, ym+h*0.85:"しばらく御待ち下さい。"
SET POINT STYLE 1
SET POINT COLOR 51
CALL f(N, 0,0)
beep
PLOT TEXT,AT xm-h*0.75, ym+h*0.85:" 描画の終了     "

!------------------------------------------------------------
! 複数の縮小アファイン変換 (シダの葉)
DEF W1x(x,y)= 0.836*x+0.044*y
DEF W1y(x,y)=-0.044*x+0.836*y+0.169 ! p1=0.4
DEF W2x(x,y)=-0.141*x+0.302*y
DEF W2y(x,y)= 0.302*x+0.141*y+0.127 ! p2=0.2
DEF W3x(x,y)= 0.141*x-0.302*y
DEF W3y(x,y)= 0.302*x+0.141*y+0.169 ! p3=0.2
DEF W4x(x,y)= 0
DEF W4y(x,y)= 0.175337*y ! p4=0.2
!------------------------------------------------------------
!確率的プロット(p1~p4)は、無視されています。

SUB f(k, x,y)
IF 1<k THEN
CALL f(k-1, W1x(x,y),W1y(x,y))
CALL f(k-1, W2x(x,y),W2y(x,y))
CALL f(k-1, W3x(x,y),W3y(x,y))
CALL f(k-1, W4x(x,y),W4y(x,y))
ELSE
PLOT POINTS: W1x(x,y),W1y(x,y); W2x(x,y),W2y(x,y); W3x(x,y),W3y(x,y); W4x(x,y),W4y(x,y)
END IF
END SUB

END

  2進数のビット列でC曲線、ドラゴン曲線を... 山中和義 2007/08/18 23:47:53  ツリーへ

Re: なぜ、こんなものが描けるのか。 返事を書く ノートメニュー
山中和義 <drdlxujciw> 2007/08/18 23:47:53
2進数のビット列でC曲線、ドラゴン曲線を描く



!C曲線を描く(再帰処理を使わない)

SET WINDOW -5,5,-5,5

LET N=16 !ビット数

LET x0=0 !初期位置は原点
LET y0=0

FOR i=0 TO 2^9-1 !9段階
LET B$=right$(REPEAT$("0",N-1)&BSTR$(I,2),N) !2進数へ

LET d=0 !方向
FOR k=1 TO N
IF mid$(B$,k,1)="1" THEN LET d=d+1 !1の数を得る
NEXT k
!!!LET d=MOD(d,4) !0=右,1=上,2=左,3=下

LET x1=x0+COS(d*PI/2)/10 !指定される方向に線分を描く
LET y1=y0+SIN(d*PI/2)/10
PLOT LINES:x0,y0; x1,y1

LET x0=x1 !次へ
LET y0=y1
NEXT i

END





!ドラゴン曲線を描く(再帰処理を使わない)

SET WINDOW -5,5,-5,5

LET x0=0 !初期位置は原点
LET y0=0

FOR i=0 TO 2^9-1 !9段階
IF i>0 THEN
LET L=i
DO WHILE MOD(L,2)=0 !2で割れるまで割っておく
LET L=L/2
LOOP
IF MOD(L,4)=1 THEN LET d=d+1 ELSE LET d=d-1 !MOD(d,4) 0=右,1=上,2=左,3=下
ELSE
LET d=0 !方向
END IF

LET x1=x0+COS(d*PI/2)/10 !指定される方向に線分を描く
LET y1=y0+SIN(d*PI/2)/10
PLOT LINES:x0,y0; x1,y1

LET x0=x1 !次へ
LET y0=y1
NEXT i

END

  !追記 SECOND 2007/08/19 20:41:53  ツリーへ

Re: なぜ、こんなものが描けるのか。 返事を書く ノートメニュー
SECOND <cszcthjjdj> 2007/08/19 20:41:53
!追記

!速度が、あまり変わりなければ、下の文の方が、見やすい。

SUB f(k, x,y)
IF 1<k THEN
CALL f(k-1, W1x(x,y),W1y(x,y))
CALL f(k-1, W2x(x,y),W2y(x,y))
CALL f(k-1, W3x(x,y),W3y(x,y))
CALL f(k-1, W4x(x,y),W4y(x,y))
ELSE
PLOT POINTS: W1x(x,y),W1y(x,y); W2x(x,y),W2y(x,y); W3x(x,y),W3y(x,y); W4x(x,y),W4y(x,y)
END IF
END SUB

!-------------------------------
! IF 0<k THEN にすると見やすい。(上と同内容)実行速度?あまり変わらない。

SUB f(k, x,y)
IF 0<k THEN
CALL f(k-1, W1x(x,y),W1y(x,y))
CALL f(k-1, W2x(x,y),W2y(x,y))
CALL f(k-1, W3x(x,y),W3y(x,y))
CALL f(k-1, W4x(x,y),W4y(x,y))
ELSE
PLOT POINTS: x,y ! 単純になる。
END IF
END SUB

  !シダの葉:確率的プロットの実験、高速&リ... SECOND 2007/08/20 15:01:03  ツリーへ

Re: なぜ、こんなものが描けるのか。 返事を書く ノートメニュー
SECOND <cszcthjjdj> 2007/08/20 15:01:03
!シダの葉:確率的プロットの実験、高速&リアル

!なぜ、こんなものが描けるのか。
!ミクロな、隣接するステップの関係しか、計算していない。
!だが、マクロな全体形状が、制御されている。
!生体も、おそらく・・

SET TEXT FONT "MS 明朝",12
SET TEXT BACKGROUND "OPAQUE"
LET t$="シダの葉"
LET N=20
LET xm=0
LET ym=0.5
LET h=0.6
!----------
SET WINDOW xm-h,xm+h, ym-h,ym+h
DRAW axes
PLOT TEXT,AT xm+h*0.1,ym+h*0.85:t$
PLOT TEXT,AT xm+h*0.5,ym+h*0.85, USING "N= %%":N
PLOT TEXT,AT xm-h*0.75, ym+h*0.85:"しばらく御待ち下さい。"
SET POINT STYLE 1
SET POINT COLOR 10 !51
CALL f(N, 0,0)
beep
PLOT TEXT,AT xm-h*0.75, ym+h*0.85:" 描画の終了     "

!------------------------------------------------------------
! 複数の縮小アファイン変換 (シダの葉)
DEF W1x(x,y)= 0.836*x+0.044*y
DEF W1y(x,y)=-0.044*x+0.836*y+0.169 ! p1=0.4
DEF W2x(x,y)=-0.141*x+0.302*y
DEF W2y(x,y)= 0.302*x+0.141*y+0.127 ! p2=0.2
DEF W3x(x,y)= 0.141*x-0.302*y
DEF W3y(x,y)= 0.302*x+0.141*y+0.169 ! p3=0.2
DEF W4x(x,y)= 0
DEF W4y(x,y)= 0.175337*y ! p4=0.2
!------------------------------------------------------------
!確率的プロット(p1~p4)は、変形されています。

SUB f(k, x,y)
IF 0<k THEN
CALL f(k-1, W1x(x,y),W1y(x,y))
IF RND<0.3 THEN CALL f(k-1, W2x(x,y),W2y(x,y))
IF RND<0.3 THEN CALL f(k-1, W3x(x,y),W3y(x,y))
IF RND<0.3 THEN CALL f(k-1, W4x(x,y),W4y(x,y))
ELSE
PLOT POINTS: x,y
END IF
END SUB

END

  !アンモナイト:確率的な縮小写像。 SECOND 2007/08/20 17:29:43  (修正1回) ツリーへ

Re: なぜ、こんなものが描けるのか。 返事を書く ノートメニュー
SECOND <cszcthjjdj> 2007/08/20 17:29:43 ** この記事は1回修正されてます
!アンモナイト:確率的な縮小写像。

!なぜ、こんなものが描けるのか。
!ミクロな、隣接するステップの関係しか、計算していない。
!だが、マクロな全体形状が、制御されている。
!生体も、おそらく・・

SET TEXT FONT "MS 明朝",12
SET TEXT BACKGROUND "OPAQUE"
LET t$="アンモナイト"
LET N=151
LET xm=0
LET ym=0
LET h=1
!----------
SET WINDOW xm-h,xm+h, ym-h,ym+h
DRAW axes
PLOT TEXT,AT xm+h*0.1,ym+h*0.85:t$
PLOT TEXT,AT xm+h*0.6,ym+h*0.85, USING "N= %%%":N
PLOT TEXT,AT xm-h*0.75, ym+h*0.85:"しばらく御待ち下さい。"
SET POINT STYLE 1
SET POINT COLOR 44
CALL f(N, 0,0)
beep
PLOT TEXT,AT xm-h*0.75, ym+h*0.85:" 描画の終了     "

!------------------------------------------------------------
! 複数の縮小アファイン変換 (アンモナイト)
DEF W1x(x,y)=-0.289993*x-0.001347*y+0.593333
DEF W1y(x,y)= 0.001986*x-0.196662*y-0.32 ! p1=0.06124
DEF W2x(x,y)=-0.073058*x-0.024834*y+0.793333
DEF W2y(x,y)=-0.006353*x+0.285589*y-0.056667 ! p2=0.022236
DEF W3x(x,y)= 0.939186*x-0.218787*y-0.046667
DEF W3y(x,y)= 0.214337*x+0.958685*y+0.01 ! p3=0.916524
!------------------------------------------------------------
!確率的な写像(p1~p3)は、要調整。

SUB f(k, x,y)
IF 0<k THEN
CALL f(k-1, W3x(x,y),W3y(x,y))
IF RND<0.02426 THEN CALL f(k-1, W2x(x,y),W2y(x,y))
IF RND<0.06658 THEN CALL f(k-1, W1x(x,y),W1y(x,y))
ELSE
PLOT POINTS: x,y
END IF
END SUB

END

  │└Linuxで綺麗に書けるか心配です。というのは... SECOND 2007/08/21 16:10:00  ツリーへ

Re: !アンモナイト:確率的な縮小写像。 返事を書く ノートメニュー
SECOND <cszcthjjdj> 2007/08/21 16:10:00
Linux で綺麗に書けるか心配です。というのは、

アンモナイト は、
N=151 という階数の深さが原因と思われますが、
Nの値と、乱数 RND のしきい値が、クリチカル critical になっていて、
僅かの違いで、スカスカになったり、真っ黒になったり、延々と戻らなく
なったりします。他の、BASIC では、多分、再調整が要るくらいです。

フラクタル構造(fractal 自己相似な縮小写像)からみても、
アンモナイトは、原始的なのでしょうか、
W3のワンパターン写像で、
僅か数%しか、w1とw2へ分岐してない。

それに比べ、
シダの葉は、W1メインのマルチパターンで、
W2,W3,W4へと半分ほども、分岐している。

  │ ├画像が浮び上っていくところは幻想的です。... 山中和義 2007/08/21 17:10:51  ツリーへ

Re: Linuxで綺麗に書けるか心配です。というのは... 返事を書く ノートメニュー
山中和義 <drdlxujciw> 2007/08/21 17:10:51
画像が浮び上っていくところは幻想的です。(圧縮された画像が展開される)

次元Nと確率P1〜P3(点の数と分布)の調整が難しいですね。

このように考えるのはどうでしょうか?




SET TEXT FONT "MS 明朝",12
SET TEXT BACKGROUND "OPAQUE"
LET t$="アンモナイト"

LET N=100 !←←←←←渦巻き度(巻き具合)

LET xm=0
LET ym=0
LET h=1
!----------
SET WINDOW xm-h,xm+h, ym-h,ym+h
DRAW axes
PLOT TEXT,AT xm+h*0.1,ym+h*0.85:t$
PLOT TEXT,AT xm+h*0.6,ym+h*0.85, USING "N= %%%":N
PLOT TEXT,AT xm-h*0.75, ym+h*0.85:"しばらく御待ち下さい。"
SET POINT STYLE 1
SET POINT COLOR 44

FOR i=1 TO 1500 !←←←←←分布させる点の数
CALL f(N, 0,0)
NEXT i !←←←←←

beep
PLOT TEXT,AT xm-h*0.75, ym+h*0.85:" 描画の終了     "

!------------------------------------------------------------
! 複数の縮小アファイン変換 (アンモナイト)
DEF W1x(x,y)=-0.289993*x-0.001347*y+0.593333
DEF W1y(x,y)= 0.001986*x-0.196662*y-0.32 ! p1=0.06124
DEF W2x(x,y)=-0.073058*x-0.024834*y+0.793333
DEF W2y(x,y)=-0.006353*x+0.285589*y-0.056667 ! p2=0.022236
DEF W3x(x,y)= 0.939186*x-0.218787*y-0.046667
DEF W3y(x,y)= 0.214337*x+0.958685*y+0.01 ! p3=0.916524
!------------------------------------------------------------

SUB f(k, x,y)
IF 0<k THEN
IF RND<0.916524 THEN CALL f(k-1, W3x(x,y),W3y(x,y)) !←←←←←確率で選択
IF RND<0.022236 THEN CALL f(k-1, W2x(x,y),W2y(x,y)) !←←←←←
IF RND<0.061240 THEN CALL f(k-1, W1x(x,y),W1y(x,y)) !←←←←←
END IF
PLOT POINTS: x,y !←←←←←k次
END SUB

END

  │ │├正しい確率分岐だと思います。 SECOND 2007/08/21 22:57:47  (修正1回) ツリーへ

Re: 画像が浮び上っていくところは幻想的です。... 返事を書く ノートメニュー
SECOND <cszcthjjdj> 2007/08/21 22:57:47 ** この記事は1回修正されてます
正しい確率分岐だと思います。

フラクタル画像は、
おびただしい点が、プロットされますが、元は、原点(0,0)などの、
1つだけの写像になっています。

W1〜W3の、3分岐に、確率を用いなければ、
N=100の場合、3^100乗 個にも、増えた写像で、絵になりますが、

W1〜W3の、3分岐の確率は、合計が1で、
どれか1つが選ばれるような場合は、N=100で写像しても、
1^100=1 個で、絵になりません。

W1〜W3の2つ以上が、同時に選ばれる確率の重なりへ命中しない限りは、
再帰コールによる、画素の増大も、見込めません。

この場合、FOR〜NEXTで、連射するのは、いい方法だと思います。

------------------------
ELSE が、除かれていますが、

PLOT POINTS: x,y の前の、ELSE 文が無い場合、

N階目の写像だけでは、なくなり、

0階目、1階目、2階目、・・・N−1階目の写像も、全部ミックスされて
表示されています。
画像を見る限り、あまり、分かりませんが、

親集合N=0の領域が、原点(0,0)の1点だけなので、
目立たないのかも知れません。

親集合N=0の領域が、線分(0,0)〜(1,0)などの場合は、
目立つと思います。


ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
白石先生、この一連に、間違いが有りましたら、共々、ご指導下さい。

  │ ││└>PLOTPOINTS:x,yの前の、ELSE文が無い場... 山中和義 2007/08/22 09:29:38  ツリーへ

Re: 正しい確率分岐だと思います。 返事を書く ノートメニュー
山中和義 <drdlxujciw> 2007/08/22 09:29:38
>PLOT POINTS: x,y の前の、ELSE 文が無い場合、

このプログラムでは、確率でn−1階の描画の有無を決定しているので、
0階に到達しないことも多々あり、実際の描画された点が疎になりやすいです。
したがって、途中(k階)を描画して点の数を増やしています。



>どれか1つが選ばれるような場合

次のようになると思います。

SUB f(k, x,y)
IF 0<k THEN
SELECT CASE RND !←←←←←確率で選択
CASE IS <0.06124
CALL f(k-1, W1x(x,y),W1y(x,y))
CASE IS <0.083476 !0.06124+0.022236
CALL f(k-1, W2x(x,y),W2y(x,y))
CASE ELSE
CALL f(k-1, W3x(x,y),W3y(x,y))
END SELECT
ELSE
PLOT POINTS: x,y
END IF
END SUB


点のサンプル数は、

FOR i=1 TO 50000 !←←←←←分布させる点の数
CALL f(N, 0,0)
NEXT i !←←←←←

で何とか形が見えてきます。

  │ ││ ├大満足です。15万発ぐらい欲しいですね。 SECOND 2007/08/22 11:18:26  ツリーへ

Re: >PLOTPOINTS:x,yの前の、ELSE文が無い場... 返事を書く ノートメニュー
SECOND <cszcthjjdj> 2007/08/22 11:18:26
大満足です。15万発ぐらい欲しいですね。
でも、無理にオーバーラップを、除かなくても・・ですね。
ありがとうございました。

壊れた再帰の方が、むしろ綺麗だったのが、気になっています。
生物も、あちこち壊れて、クロストークだらけだから、
かえって、リアルなのでしょうか(笑)

  │ ││ └貴兄の案の方が、実態に近いと思います。 SECOND 2007/08/23 17:19:32  ツリーへ

Re: >PLOTPOINTS:x,yの前の、ELSE文が無い場... 返事を書く ノートメニュー
SECOND <cszcthjjdj> 2007/08/23 17:19:32
貴兄の案の方が、実態に近いと思います。
内容を、ルート側スレッドに貼っておきました。

  │ │└DELETED  SECOND  2007/08/22 06:21:35  (削除) ツリーへ

Re: 画像が浮び上っていくところは幻想的です。... 返事を書く
SECOND <cszcthjjdj> 2007/08/22 06:21:35 ** この記事は削除されました

  │ └SECONDさん、こんばんわ。 島村1243 2007/08/21 22:37:13  ツリーへ

Re: Linuxで綺麗に書けるか心配です。というのは... 返事を書く ノートメニュー
島村1243 <bjllmpcujp> 2007/08/21 22:37:13
SECONDさん、こんばんわ。

「Linuxでアンモナイトが綺麗に描けるか心配」と有りましたが、
Fedora7上のBASIC-641版でRUNして作成されたbmp画像保存し、
続いてWin98上のBASIC-59A版でRUNして作成されたbmp画像保存し、
両者をWin98上のMicrosoftPhotoEditerで見比べて見ました。
結果は両者共に同じ状態で素晴らしいアンモナイトが描画されていました。

それにしても、この画像って非常にリアルな感じですね。どの様な理屈で
この様な画像になるのか、ロジック解読(出来ないかも)に興味深々です。

以上、Linuxでの結果報告です。

  │  └ホッと、しました。ありがとうございます。 SECOND 2007/08/21 22:59:02  ツリーへ

Re: SECONDさん、こんばんわ。 返事を書く ノートメニュー
SECOND <cszcthjjdj> 2007/08/21 22:59:02
ホッと、しました。ありがとうございます。

  !山中氏の提案の方が、より実体に近い。 SECOND 2007/08/23 16:22:58  ツリーへ

Re: なぜ、こんなものが描けるのか。 返事を書く ノートメニュー
SECOND <cszcthjjdj> 2007/08/23 16:22:58
! 山中氏の提案 の方が、より実体に近い。
!N階だけでなく、0階、1階、2階・・N−1階も、重ねて描画するのが、
!生体の模写として、正しいのではないか?
!細胞は、N回分裂後の位置に、ポッコリ降って来るわけはなく、
!0回、1回、2回・・の分も置いて来ている。

!数学的な、N階の自己縮小写像としては、正しくないですが、
!私も、故意に、そうする方がと、思います。

!どなたか、ご教示下さい。


SET TEXT FONT "MS 明朝",12
SET TEXT BACKGROUND "OPAQUE"
LET t$="アンモナイト"

LET N=100

LET xm=0
LET ym=0
LET h=1
!----------
SET WINDOW xm-h,xm+h, ym-h,ym+h
DRAW axes
PLOT TEXT,AT xm+h*0.1,ym+h*0.85:t$
PLOT TEXT,AT xm+h*0.6,ym+h*0.85, USING "N= %%%":N
PLOT TEXT,AT xm-h*0.75, ym+h*0.85:"しばらく御待ち下さい。"
SET POINT STYLE 1
SET POINT COLOR 44

FOR i=1 TO 7000
CALL f(N, 0.4,0.2)
NEXT i

beep
PLOT TEXT,AT xm-h*0.75, ym+h*0.85:" 描画の終了     "

!------------------------------------------------------------
! 複数の縮小アファイン変換 (アンモナイト)
DEF W1x(x,y)=-0.289993*x-0.001347*y+0.593333
DEF W1y(x,y)= 0.001986*x-0.196662*y-0.32 ! p1=0.06124
DEF W2x(x,y)=-0.073058*x-0.024834*y+0.793333
DEF W2y(x,y)=-0.006353*x+0.285589*y-0.056667 ! p2=0.022236
DEF W3x(x,y)= 0.939186*x-0.218787*y-0.046667
DEF W3y(x,y)= 0.214337*x+0.958685*y+0.01 ! p3=0.916524
!------------------------------------------------------------

SUB f(k, x,y)
IF 0<k THEN
SELECT CASE RND !←←←←←確率で選択
CASE IS <0.06124
CALL f(k-1, W1x(x,y),W1y(x,y))
CASE IS <0.083476 !0.06124+0.022236
CALL f(k-1, W2x(x,y),W2y(x,y))
CASE ELSE
CALL f(k-1, W3x(x,y),W3y(x,y))
END SELECT
!ELSE !←取り外し、N階だけでなく、0階、1階、2階・・N−1階も全て描画。
END IF
PLOT POINTS: x,y
!END IF
END SUB

END


インデックスへ EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。