サンプルプログラム
![]()
| 一次元セルオートマトン |
/*
2006/11/21 一次元セルオートマトンによる図形描画
3ビットによる8個のパターン(000 001 010 ・・・・)
自分の真上とその左右を含めた3ビットの状態により自分のビットが決まると言う単純なもの
rule2(?)=0 or 1 の部分で 自分のビットの決め方を決めている
repeat〜loop のところで 自分より上のビットを読んで 8個のうちのどのパターンなのかを読み取り
対応するrule2()から1か0かのデータを読み取り書きこむというもの
*/
window_x=400 ;画面のサイズが変わるよ
window_y=400
screen 0,window_x,window_y
title "フラクタル図形ーセルオートマトン"
color 0,0,0 : boxf : color 255,255,255
rule_many = 8
;************** ここ大事! Y=0のところに 点を打つことで図形が変わる
pset 200,0
; pset 40,0
;**********************************************************************
;element="000,001,010,011,100,101,110,111"
dim rule2,rule_many
rule2(0)=0 ;この辺を変えるとめちゃ面白くなる
rule2(1)=1
rule2(2)=0
rule2(3)=1
rule2(4)=1
rule2(5)=0
rule2(6)=1
rule2(7)=0
repeat window_y-1 ;実際に描画を行うところ
y=cnt+1
repeat window_x-2
a=0 : b=0 : c=0
x=cnt+1
pget x-1,y-1
if ginfo_r=255 : a=1
pget x,y-1
if ginfo_r=255 : b=1
pget x+1,y-1
if ginfo_r=255 : c=1
if a+b+c==0 : inp = 0 : goto*tobasi
if a+b+c==3 : inp = 7 : goto*tobasi
if a+b+c==1 : {
if a == 1 :inp=4 :goto*tobasi
if b==1 : inp=2 :goto*tobasi
if c==1 : inp=1:goto*tobasi
}
if (a=1) and (b=1) : inp=6 : goto*tobasi
if (a=1) and (c=1) : inp=5 : goto*tobasi
inp=3
*tobasi
color rule2(inp)*255,rule2(inp)*255,rule2(inp)*255
pset x,y
loop
await 5
loop
stop
|
| 3次元的にグラフを表示する |
randomize dim x,10,300 dim b,10,300 a=50 : wariai=13 : xx=2 : yy=2 : w1=1 screen 0,400,400 : title "3次元乱数グラフ" cls 2 objsize 48,25 pos 302,10 : button gosub "sizex+",*xx1 pos 350,10 : button gosub "sizex-",*xx2 pos 302,35 : button gosub "sizey+",*yy1 pos 350,35 : button gosub "sizey-",*yy2 pos 302,60 : button gosub "up",*zz1 pos 350,60 : button gosub "down",*zz2 objsize 80,25 pos 302,85 : button gosub "負極on/off",*zz pos 302,110 : button gosub "line on/off",*wi pos 302,135 : button gosub "block on/off",*w2 *main redraw 2 color 0,0,0 : boxf 0,0,300,400 : color 255,255,255 pos 0,0 : color 200,200,200 :print "sizex:"+xx+" sizey:"+yy+" 上昇率:"+(13-wariai) repeat 10 e=cnt a(e)=a(e)+rnd(26)-wariai if z=0 : if a(e)<1 : a(e)=1 b(e,0)=a(e) repeat 256 b(e,cnt+1)=x(e,cnt) ;次に渡すために保存 x(e,cnt)=b(e,cnt) ;前のをもらう color 256-cnt,e*25,255-e*25 if w1=1:line cnt+40-e*xx,200-x(e,cnt)+cnt/4+e*yy,cnt+40-e*xx,200+cnt/4+e*yy if w=1 :line cnt+40-e*xx,200-x(e,cnt)+cnt/4+e*yy,cnt+40-e*xx+1,200-b(e,cnt+1)+(cnt+1)/4+e*yy loop loop redraw 1 wait 1 goto*main *xx1:xx+:return *xx2:xx-:return *yy1:yy+:return *yy2:yy-:return *zz1:wariai-:return *zz2:wariai+:return *zz:if z=0 : z=1 :else :z=0 return *wi:if w=0 : w=1 : else : w=0 return *w2:if w1=0 : w1=1 : else : w1=0 return |
| 滑らかに移動 |
/* 目的地入力 現在地との差を計算 一定時間での移動で加速度計算 ※最高速度の設定
2005/9/7 */
time=30 //移動時間 ただし 半分までの移動速度
Vmax=5 //最高速度
//現在地設定
x=400 : y=200
//目的地設定
lastx=400 : lasty=225
repeat
redraw 2
color 255,255,255:boxf:color 0,0,0
pos x,y
print "slow move"
//キー入力 キー入力時に加速度を計算
getkey key,1
if (key=1) and (k=0) :{
lastx=mousex : lasty=mousey ;遊び
k=1
t=0 : ax=0.0 : ay=0.0 :sx=0.0 : sy=0.0 : tousokux=0 : tousokuy=0 ;各種初期化
x0=x : y0=y
xx=0 : yy=0 ;運動物体の移動距離 初期は0 最後にはsx,syの値になる
sx=0.0+lastx-x ;移動距離 x & y
sy=0.0+lasty-y
ax=sx/(time*time) ;時間tでS移動するために必要な加速度a
ay=sy/(time*time)
/*
Vmax_x=ax*time ;最大速度
Vmax_y=ay*time
if Vmax_x>Vmax : tousokux=1 ;最大速度が 最大設定速度より大きければ 等速運動する
if Vmax_y>Vmax : tousokuy=1
*/
}
if k!0 : t+
if k=1: { //x方向への加速運動
xx=ax*t*t/2 ;初速度0 加速度による加速運動のみ
x=x0+xx
yy=ay*t*t/2 ;初速度0 加速度による加速運動のみ
y=y0+yy
if t>=time :vx=ax*t : vy=ay*t : x0=x : y0=y : k=2 : t=0 ;目的時間だけ移動したら 加速度を逆向きに直し 減加速度運動へ
}
if k=2 : { //x,y方向への減加速運動
xx=vx*t-ax*t*t/2 ;前回の速度を初速度に 逆方向に加速度をはたらかせる
x=x0+xx
yy=vy*t-ay*t*t/2
y=y0+yy
if t>=time : k=0 :x=lastx : y= lasty ;割りきれなかった場合にちゃんと 最終目的地に着くようにする
}
await 5
redraw 1
loop
|
| 滑らかに移動 sinバージョン |
/* 目的地入力 現在地との差を計算 sinを利用した移動バージョン ※最高速度の設定
2005/9/7 */
x=300 : y=300 //現在位置
lastx=100 : lasty=100 //目的地
p=3.141592 //円周率
z=0.0 : a=0.0 : t=0.0 //実数を使うので 実数として使えるように 実数の数字を無意味でも入れておく
repeat
redraw 2
color 255,255,255 : boxf :color 0,0,0
pos x,y
print "slow move"
if k!0 : t=t+0.015 ;多くすれば早くなるよ
getkey key,1
if (key=1) and (k=0):{
lastx=mousex : lasty=mousey ;遊び
x0=x ;移動する前の場所を保存しておく
y0=y
xx=lastx-x ;移動しなきゃいけない距離がxxとyyです
yy=lasty-y
k=1
}
if k=1 : {
x=sin(t*p-p/2)*xx/2+xx/2+x0 ;-1→+1へとsinの値が変化する それに移動量xxをかけて 移動量xxの半分をたす
y=sin(t*p-p/2)*yy/2+yy/2+y0
if t>=1.0 :x=lastx :y=lasty:t=0.0:k=0
}
await 5
redraw 1
loop
|