格子状に並べたい 樫木 2006/11/07 13:01:22 └!これも、きれいで楽しいですね。 SECOND 2006/11/07 13:57:21 └!でも、本来は、withshiftを使うべきでしょ... SECOND 2006/11/07 15:02:17 └ありがとうございました。 樫木 2006/11/07 17:43:29 ├ちらつき防止などの例が、Page:82にありま... SECOND 2006/11/07 18:40:51 └RE:絵定義を使って、さらに絵定義を書くこと... 山中和義 2006/11/08 09:52:48 └例として示していただいた「関節による表示... 樫木 2006/11/09 00:13:23 ├!ご参考 SECOND 2006/11/09 05:23:55 └主処理の部分でキー入力を行い、PICTURE文の... 山中和義 2006/11/09 08:47:33 └SECONDさん、山中和義さんどうもありがとう... 樫木 2006/11/11 00:43:43 └改良しよう! 山中和義 2006/11/11 09:22:29 └マウスで誘導! 山中和義 2006/11/11 10:53:39 ├改良第3弾、ライントレース(線沿う虫) 山中和義 2006/11/11 17:22:30 └!比例制御を付けました。 SECOND 2006/11/11 23:48:34 └驚きの連続でした。いろんなことができるの... 樫木 2006/11/12 23:17:41 └!オニの顔は2つも要らない。 SECOND 2006/11/13 04:01:42
格子状に並べたい 樫木 2006/11/07 13:01:22 ツリーへ
格子状に並べたい |
返事を書く |
樫木 2006/11/07 13:01:22 | |
次のプログラムで描いたものを格子状に並べたいのですが
どのようにすれば良いのでしょうか。 REM ステンドグラス SET WINDOW -200,200,-200,200!座標の範囲指定 DRAW grid(20,20) !格子を縦横とも20間隔で描く OPTION ANGLE DEGREES !角度は度を使用 RANDOMIZE DECLARE EXTERNAL PICTURE stained_glass !定義した絵のしよう宣言をする FOR a=0 TO 200 STEP 1.5 LET col=RND*100+2 !100-2=98色のランダムな色を使用 DRAW stained_glass(col) WITH SCALE(0.5)*ROTATE(RND*360+1) !大きさを0.4倍し、任意の方向にたくさん描く NEXT a END EXTERNAL PICTURE stained_glass(col) !絵を定義する SET AREA COLOR col PLOT AREA :0,0;20,60;90,100;40,25 SET AREA COLOR col !色は黒色 SET LINE WIDTH 3 PLOT LINES:0,0;20,60 SET AREA COLOR col SET AREA COLOR 1 !色は黒色 SET LINE WIDTH 3 PLOT LINES:20,60;90,100 SET AREA COLOR col SET AREA COLOR 1 !色は黒色 SET LINE WIDTH 3 PLOT LINES:90,100;40,25 SET AREA COLOR col SET AREA COLOR 1 !色は黒色 SET LINE WIDTH 3 PLOT LINES:40,25;0,0 SET AREA COLOR col END PICTURE |
└!これも、きれいで楽しいですね。 SECOND 2006/11/07 13:57:21 ツリーへ
Re: 格子状に並べたい |
返事を書く |
SECOND 2006/11/07 13:57:21 | |
!これも、きれいで楽しいですね。
!絵の定義は、よく知らないのですが、格子状に並べるだけなら、 !window を、ドライブすると、以下のように楽です。 !上書き御免。 ! REM ステンドグラス SET WINDOW -200,200,-200,200!座標の範囲指定 DRAW grid(20,20) !格子を縦横とも20間隔で描く OPTION ANGLE DEGREES !角度は度を使用 RANDOMIZE DECLARE EXTERNAL PICTURE stained_glass !定義した絵のしよう宣言をする FOR j=-200 TO +200 STEP 100 FOR i=-200 TO +200 STEP 100 SET WINDOW -200-i,200-i,-200+j,200+j !座標の範囲指定 FOR a=0 TO 200 STEP 1.5 LET col=RND*100+2 !100-2=98色のランダムな色を使用 DRAW stained_glass(col) WITH SCALE(0.5)*ROTATE(RND*360+1) !大きさを0.4倍し、任意の方向にたくさん描く NEXT a NEXT i NEXT j END EXTERNAL PICTURE stained_glass(col) !絵を定義する SET AREA COLOR col PLOT AREA :0,0;20,60;90,100;40,25 SET AREA COLOR col !色は黒色 SET LINE WIDTH 3 PLOT LINES:0,0;20,60 SET AREA COLOR col SET AREA COLOR 1 !色は黒色 SET LINE WIDTH 3 PLOT LINES:20,60;90,100 SET AREA COLOR col SET AREA COLOR 1 !色は黒色 SET LINE WIDTH 3 PLOT LINES:90,100;40,25 SET AREA COLOR col SET AREA COLOR 1 !色は黒色 SET LINE WIDTH 3 PLOT LINES:40,25;0,0 SET AREA COLOR col END PICTURE |
└!でも、本来は、withshiftを使うべきでしょ... SECOND 2006/11/07 15:02:17 ツリーへ
Re: !これも、きれいで楽しいですね。 |
返事を書く |
SECOND 2006/11/07 15:02:17 | |
!でも、本来は、with shift を使うべきでしょうか。
!こちらに、して下さい。この方が大きな構造へ発展しそうです。 !上書き御免。 ! REM ステンドグラス SET WINDOW -200,200,-200,200!座標の範囲指定 DRAW grid(20,20) !格子を縦横とも20間隔で描く OPTION ANGLE DEGREES !角度は度を使用 RANDOMIZE DECLARE EXTERNAL PICTURE stained_glass !定義した絵のしよう宣言をする FOR j=-200 TO +200 STEP 100 FOR i=-200 TO +200 STEP 100 DRAW stained_glass_unit WITH SHIFT(i,j) NEXT i NEXT j END EXTERNAL PICTURE stained_glass_unit OPTION ANGLE DEGREES FOR a=0 TO 200 STEP 1.5 LET col=RND*100+2 !100-2=98色のランダムな色を使用 DRAW stained_glass(col) WITH SCALE(0.5)*ROTATE(RND*360+1) !大きさを0.4倍し、任意の方向にたくさん描く NEXT a END PICTURE EXTERNAL PICTURE stained_glass(col) !絵を定義する SET AREA COLOR col PLOT AREA :0,0;20,60;90,100;40,25 SET AREA COLOR col !色は黒色 SET LINE WIDTH 3 PLOT LINES:0,0;20,60 SET AREA COLOR col SET AREA COLOR 1 !色は黒色 SET LINE WIDTH 3 PLOT LINES:20,60;90,100 SET AREA COLOR col SET AREA COLOR 1 !色は黒色 SET LINE WIDTH 3 PLOT LINES:90,100;40,25 SET AREA COLOR col SET AREA COLOR 1 !色は黒色 SET LINE WIDTH 3 PLOT LINES:40,25;0,0 SET AREA COLOR col END PICTURE |
└ありがとうございました。 樫木 2006/11/07 17:43:29 ツリーへ
Re: !でも、本来は、withshiftを使うべきでしょ... |
返事を書く |
樫木 2006/11/07 17:43:29 | |
ありがとうございました。
絵定義を使って、さらに絵定義を書くことができるのですね。 このことを利用すると簡単に楕円の回転を利用した絵も 書けるのですね。 実行キーを押すたびに、蝶の色と方向が変わる物を作ってみました。 SET WINDOW -200,200,-200,200 !座標の範囲指定 !DRAW grid(20,20) !格子を縦横とも20間隔で描く OPTION ANGLE DEGREES RANDOMIZE DECLARE EXTERNAL PICTURE butterfly FOR j=-200 TO +200 STEP 100 FOR i=-200 TO +200 STEP 100 LET col=RND*100+2 DRAW butterfly(col) WITH SCALE(0.2)*ROTATE(RND*360+1)*SHIFT(i,j) NEXT i NEXT j END EXTERNAL PICTURE butterfly(col) DRAW daen(col+3) WITH SCALE(0.5)*ROTATE(45)*SHIFT(80,50) DRAW daen(col+3) WITH SCALE(0.5)*ROTATE(-45)*SHIFT(-80,50) DRAW daen(col+3) WITH SCALE(0.5)*ROTATE(45)*SHIFT(-80,-80) DRAW daen(col+3) WITH SCALE(0.5)*ROTATE(-45)*SHIFT(80,-80) SET LINE COLOR 1 !色は黒色 SET LINE WIDTH 3 !線の太さは10倍にする SET AREA COLOR col !塗りつぶしの色は黄色 FOR a=0 TO 360 PLOT LINES :20*COS(a),140*SIN(a); !楕円を描く NEXT a paint 0,0 !中を塗りつぶす。 SET AREA COLOR 1 DRAW disk WITH SCALE(4)*SHIFT(15,140) DRAW disk WITH SCALE(4)*SHIFT(-15,140) END picture EXTERNAL PICTURE daen(col) OPTION ANGLE DEGREES !角度は、度で表す。 SET LINE COLOR 1 !色は黒色 SET LINE WIDTH 3 !線の太さは10倍にする SET AREA COLOR col !塗りつぶしの色はピンク色 FOR a=0 TO 360 PLOT LINES :150*COS(a),100*SIN(a); !楕円を描く NEXT a paint 0,0 !中を塗りつぶす。 END picture |
├ちらつき防止などの例が、Page:82にありま... SECOND 2006/11/07 18:40:51 ツリーへ
Re: ありがとうございました。 |
返事を書く |
SECOND 2006/11/07 18:40:51 | |
ちらつき防止 などの例が、Page:82 にあります。
Page 82 !続:バス発車、停車のプログラム 山中和義 2006/11/06 15:44:32 を、ぜひ御覧下さい。 こんな感じです。 FOR j=-200 TO +200 STEP 100 FOR i=-200 TO +200 STEP 100 LET col=RND*100+2 SET DRAW mode hidden !ちらつき防止(開始) DRAW butterfly(col) WITH SCALE(0.2)*ROTATE(RND*360+1)*SHIFT(i,j) SET DRAW mode explicit !ちらつき防止(終了) NEXT i NEXT j END |
└RE:絵定義を使って、さらに絵定義を書くこと... 山中和義 2006/11/08 09:52:48 ツリーへ
Re: ありがとうございました。 |
返事を書く |
山中和義 2006/11/08 09:52:48 | |
RE:絵定義を使って、さらに絵定義を書くことができるのですね。
これは、サブルーチン化ということです。 ここでは座標変換が連動することが大事です。 !関節による表示制御 !各部位を関連付ける(親子関係、階層構造) PICTURE 胸 DRAW 胸部位 !肩を中心に拡大・縮小(1)と回転(-15度)させて、肩に接合させる。 DRAW 上腕 WITH SCALE(1)*ROTATE(ToRadian(-15))*SHIFT(1.5,1.5) END PICTURE PICTURE 上腕 DRAW 上腕部位 !肘を中心に拡大・縮小(2)と回転(45度)、肘に接合。 DRAW 前腕 WITH SCALE(2)*ROTATE(ToRadian(45))*SHIFT(4,0) END PICTURE PICTURE 前腕 DRAW 前腕部位 !手首を中心に拡大・縮小(1)と回転(30度)、手首に接合。 DRAW 手 WITH SCALE(1)*ROTATE(ToRadian(30))*SHIFT(4,0) END PICTURE PICTURE 手 DRAW 手部位 END PICTURE SET WINDOW -5,25,-15,15 !図形が歪まないように正方形にする DRAW grid !ワールド座標を表示する DRAW 胸 WITH SCALE(1)*ROTATE(ToRadian(0))*SHIFT(0,0) !通常、腰が親になる END !体の各部位 EXTERNAL PICTURE 胸部位 SET AREA COLOR 2 PLOT AREA: -2,-2; 2,-2; 2,2; -2,2 DRAW 関節 END PICTURE EXTERNAL PICTURE 上腕部位 SET AREA COLOR 3 PLOT AREA: -0.5,-0.5; 4,-0.5; 4,0.5; -0.5,0.5 DRAW 関節 END PICTURE EXTERNAL PICTURE 前腕部位 SET AREA COLOR 5 PLOT AREA: -0.5,-0.5; 4,-0.5; 4,0.5; -0.5,0.5 DRAW 関節 END PICTURE EXTERNAL PICTURE 手部位 SET AREA COLOR 6 PLOT AREA: -0.5,-1; 1,-1; 1,1; -0.5,1 PLOT AREA: 1,0.5; 2,0.5; 2,1; 1,1 DRAW 関節 END PICTURE EXTERNAL PICTURE 関節 !各部位の拡大・縮小、回転の中心 SET LINE COLOR 4 PLOT LINES: 0,1; 0,0; 1,0 !ローカル座標軸 SET AREA COLOR 4 DRAW disk WITH SCALE(0.1) !原点 END PICTURE !角度 EXTERNAL FUNCTION ToRadian(a) !ラジアンへ LET ToRadian=a*PI/180 END FUNCTION EXTERNAL FUNCTION ToDegree(a) !度へ LET ToDegree=a*180/PI END FUNCTION |
└例として示していただいた「関節による表示... 樫木 2006/11/09 00:13:23 ツリーへ
Re: RE:絵定義を使って、さらに絵定義を書くこと... |
返事を書く |
樫木 2006/11/09 00:13:23 | |
例として示していただいた「関節による表示制御」で、
座標変換の連動が少しわかるようになりました。ありがとうございました。 せっかくだからと思ったので、キー(aまたはs)を 押すことによって、手が動くプログラムに改造してみました。 しかし、さらに前腕、上腕もキーを押すことによって連動して 動かそうとしたのですが、うまく動きませんでした。 アドバイスをいただけますでしょうか。 SET WINDOW -5,25,-15,15 !図形が歪まないように正方形にする !DRAW grid !ワールド座標を表示する PICTURE 手 SET DRAW mode hidden DRAW 手部位_w WITH SCALE(1)*ROTATE(ToRadian(q))*SHIFT(0,0) IF s$="a" THEN LET q=q+1 IF s$="s" THEN LET q=q-1 DRAW 手部位 WITH SCALE(1)*ROTATE(ToRadian(q))*SHIFT(0,0) SET DRAW mode explicit END PICTURE PICTURE 胸 DRAW 胸部位 !肩を中心に拡大・縮小(1)と回転(-15度)させて、肩に接合させる。 DRAW 上腕 WITH SCALE(1)*ROTATE(ToRadian(-15))*SHIFT(1.5,1.5) END PICTURE PICTURE 上腕 DRAW 上腕部位 !肘を中心に拡大・縮小(2)と回転(45度)、肘に接合。 DRAW 前腕 WITH SCALE(2)*ROTATE(ToRadian(45))*SHIFT(4,0) END PICTURE PICTURE 前腕 DRAW 前腕部位 !手首を中心に拡大・縮小(1)と回転(30度)、手首に接合。 DRAW 手 WITH SCALE(1)*ROTATE(ToRadian(30))*SHIFT(4,0) END PICTURE DO CHARACTER INPUT s$ IF s$=CHR$(13) THEN EXIT DO DRAW 胸 WITH SCALE(1)*ROTATE(ToRadian(0))*SHIFT(0,0) !通常、腰が親になる LOOP END !体の各部位 EXTERNAL PICTURE 胸部位 SET AREA COLOR 2 PLOT AREA: -2,-2; 2,-2; 2,2; -2,2 DRAW 関節 END PICTURE EXTERNAL PICTURE 上腕部位 SET AREA COLOR 3 PLOT AREA: -0.5,-0.5; 4,-0.5; 4,0.5; -0.5,0.5 DRAW 関節 END PICTURE EXTERNAL PICTURE 前腕部位 SET AREA COLOR 5 PLOT AREA: -0.5,-0.5; 4,-0.5; 4,0.5; -0.5,0.5 DRAW 関節 END PICTURE EXTERNAL PICTURE 手部位 SET AREA COLOR 6 PLOT AREA: -0.5,-1; 1,-1; 1,1; -0.5,1 PLOT AREA: 1,0.5; 2,0.5; 2,1; 1,1 DRAW 関節 END PICTURE EXTERNAL PICTURE 手部位_w SET AREA COLOR 0 PLOT AREA: -0.5,-1; 1,-1; 1,1; -0.5,1 PLOT AREA: 1,0.5; 2,0.5; 2,1; 1,1 DRAW 関節 END PICTURE EXTERNAL PICTURE 関節 !各部位の拡大・縮小、回転の中心 SET LINE COLOR 4 PLOT LINES: 0,1; 0,0; 1,0 !ローカル座標軸 SET AREA COLOR 4 DRAW disk WITH SCALE(0.1) !原点 END PICTURE !角度 EXTERNAL FUNCTION ToRadian(a) !ラジアンへ LET ToRadian=a*PI/180 END FUNCTION EXTERNAL FUNCTION ToDegree(a) !度へ LET ToDegree=a*180/PI END FUNCTION |
├!ご参考 SECOND 2006/11/09 05:23:55 ツリーへ
Re: 例として示していただいた「関節による表示... |
返事を書く |
SECOND 2006/11/09 05:23:55 | |
!ご参考
!この手本に上書きするのは、あまり気が進みませんが・・ !動くのは、面白い。 SET WINDOW -5,25,-15,15 !図形が歪まないように正方形にする DRAW grid !ワールド座標を表示する PICTURE 手 DRAW 手部位 END PICTURE PICTURE 胸 DRAW 胸部位 !肩を中心に拡大・縮小(1)と回転(-15度)させて、肩に接合させる。 DRAW 上腕 WITH SCALE(1)*ROTATE(ToRadian(-15+q))*SHIFT(1.5,1.5) END PICTURE PICTURE 上腕 DRAW 上腕部位 !肘を中心に拡大・縮小(2)と回転(45度)、肘に接合。 DRAW 前腕 WITH SCALE(2)*ROTATE(ToRadian(45+q))*SHIFT(4,0) END PICTURE PICTURE 前腕 DRAW 前腕部位 !手首を中心に拡大・縮小(1)と回転(30度)、手首に接合。 DRAW 手 WITH SCALE(1)*ROTATE(ToRadian(30+q))*SHIFT(4,0) END PICTURE DO SET DRAW mode hidden !ちらつき防止(開始) CLEAR DRAW grid !ワールド座標を表示する DRAW 胸 WITH SCALE(1)*ROTATE(ToRadian(0))*SHIFT(0,0) !通常、腰が親になる SET DRAW mode explicit !ちらつき防止(終了) CHARACTER INPUT s$ IF s$="a" THEN LET q=q+1 ELSEIF s$="s" THEN LET q=q-1 ELSE EXIT DO ! "a","s" でないキーは停止。 END IF LOOP END !体の各部位 EXTERNAL PICTURE 胸部位 SET AREA COLOR 2 PLOT AREA: -2,-2; 2,-2; 2,2; -2,2 DRAW 関節 END PICTURE EXTERNAL PICTURE 上腕部位 SET AREA COLOR 3 PLOT AREA: -0.5,-0.5; 4,-0.5; 4,0.5; -0.5,0.5 DRAW 関節 END PICTURE EXTERNAL PICTURE 前腕部位 SET AREA COLOR 5 PLOT AREA: -0.5,-0.5; 4,-0.5; 4,0.5; -0.5,0.5 DRAW 関節 END PICTURE EXTERNAL PICTURE 手部位 SET AREA COLOR 6 PLOT AREA: -0.5,-1; 1,-1; 1,1; -0.5,1 PLOT AREA: 1,0.5; 2,0.5; 2,1; 1,1 DRAW 関節 END PICTURE EXTERNAL PICTURE 関節 !各部位の拡大・縮小、回転の中心 SET LINE COLOR 4 PLOT LINES: 0,1; 0,0; 1,0 !ローカル座標軸 SET AREA COLOR 4 DRAW disk WITH SCALE(0.1) !原点 END PICTURE !角度 EXTERNAL FUNCTION ToRadian(a) !ラジアンへ LET ToRadian=a*PI/180 END FUNCTION EXTERNAL FUNCTION ToDegree(a) !度へ LET ToDegree=a*180/PI END FUNCTION |
└主処理の部分でキー入力を行い、PICTURE文の... 山中和義 2006/11/09 08:47:33 ツリーへ
Re: 例として示していただいた「関節による表示... |
返事を書く |
山中和義 2006/11/09 08:47:33 | |
主処理の部分でキー入力を行い、PICTURE文の部分に変数の値を渡してください。
・グローバル変数による(今回はこちら) ・引数による 十進BASICでは、SCALE,ROTATEなどの記述になっていますが、内部では(実際、記述もできる)、 行列(4行4列)による乗算ひとつで処理できます。 直接、手を描く場合 まず手首で変形、次に肘で変形、肩で変形、へそで変形、さらに腰で変形させる。ややこしい! DRAW 手部位 WITH SCALE(1)*ROTATE(ToRadian(30))*SHIFT(4,0) * SCALE(2)*ROTATE(ToRadian(45))*SHIFT(4,0) * SCALE(1)*ROTATE(ToRadian(-15))*SHIFT(1.5,3.5) これを、関節部分のみに着目して簡潔に記述できる訳です。 ゲームなどの3DCGのプログラムに使われている手法です。 ・DO WHILE〜LOOPの部分は、ゲームループ(レンダリングループ)。 全体の構造もおおざっぱに言えば、入力部、表示部も同じ。 ・体の部位(両PICTURE、パーツと関連性と形状)の部分は、モデリングツール(モデラ)で作成されたポリゴンデータ。 また、時間で姿勢の要素(拡大・縮小、回転、平行移動)を管理すれば、キーフレーム法となります。 ※変更したプログラムの上半分 !各部位を関連付ける(親子関係、階層構造) PICTURE 胸 DRAW 胸部位 !肩を中心に拡大・縮小(1)と回転(-15度)させて、肩に接合させる。 DRAW 上腕 WITH SCALE(1)*ROTATE(ToRadian(R1))*SHIFT(1.5,1.5) END PICTURE PICTURE 上腕 DRAW 上腕部位 !肘を中心に拡大・縮小(2)と回転(45度)、肘に接合。 DRAW 前腕 WITH SCALE(2)*ROTATE(ToRadian(R2))*SHIFT(4,0) END PICTURE PICTURE 前腕 DRAW 前腕部位 !手首を中心に拡大・縮小(1)と回転(30度)、手首に接合。 DRAW 手 WITH SCALE(1)*ROTATE(ToRadian(R3))*SHIFT(4,0) END PICTURE PICTURE 手 DRAW 手部位 END PICTURE SET WINDOW -5,25,-15,15 !図形が歪まないように正方形にする LET s$="" DO WHILE s$<>CHR$(13) !Enterキーが押されるまで IF s$="q" OR s$="Q" THEN LET R1=R1+1 !上腕 IF s$="w" OR s$="W" THEN LET R1=R1-1 IF s$="a" OR s$="A" THEN LET R2=R2+1 !前腕 IF s$="s" OR s$="S" THEN LET R2=R2-1 IF s$="z" OR s$="Z" THEN LET R3=R3+1 !手 IF s$="x" OR s$="X" THEN LET R3=R3-1 !制御された内容を反映させる SET DRAW mode hidden !ちらつき防止(開始) CLEAR DRAW grid !ワールド座標を表示する DRAW 胸 WITH SCALE(1)*ROTATE(ToRadian(0))*SHIFT(0,0) !通常、腰が親になる SET DRAW mode explicit !ちらつき防止(終了) CHARACTER INPUT s$ !次のキーを入力する LOOP END |
└SECONDさん、山中和義さんどうもありがとう... 樫木 2006/11/11 00:43:43 ツリーへ
Re: 主処理の部分でキー入力を行い、PICTURE文の... |
返事を書く |
樫木 2006/11/11 00:43:43 | |
SECONDさん、山中和義さん どうもありがとうございました。
よくわかりました。また、今まで、絵を動かすのに、 ”書く、消す”を繰り返していたのですが、clearを使うと 簡単に動かすことができるのですね。勉強になりました。 てんとう虫が、葉っぱの上を動く作品を作りましたので 載せさせていただきます。 REM てんとう虫の移動(背景付き) SET WINDOW -200,200,-200,200 !xの初期値を-200とする。 LET x=-200 LET y=25 LET s$="" DO WHILE s$<>CHR$(13) !enterが押されるまで IF s$="s" THEN LET x=x+1 !sを押すと前へ移動 IF s$="w" THEN LET y=y+1 !wを押すと上へ移動 IF s$="z" THEN LET y=y-1 !zを押すと下へ移動 IF s$="a" THEN LET x=x-1 !aを押すと後ろへ移動 SET DRAW mode hidden !ちらつき防止(開始) CLEAR OPTION ANGLE DEGREES DRAW grid(20,20) SET TEXT COLOR 4 PLOT TEXT ,AT -190,180:"s,a,w,zを押すと、てんとう虫が葉っぱの前後上下に動きます。" PLOT TEXT ,AT -190,160:"enterを押すと終了します。" !tentoumusiという絵の使用を宣言 DECLARE EXTERNAL PICTURE tentoumusi DECLARE EXTERNAL PICTURE haikei !てんとう虫を移動させる。 DRAW haikei SET LINE WIDTH 1 !線の太さを元の太さに戻す。 DRAW tentoumusi WITH SCALE(0.15)*ROTATE(-90)*SHIFT(x,y) WAIT DELAY 0.01 SET DRAW mode explicit CHARACTER INPUT s$ LOOP END !色付きてんとう虫を定義する EXTERNAL PICTURE tentoumusi SET AREA COLOR 1 !色は黒色 DRAW disk WITH SCALE(80)*SHIFT(0,100) DRAW disk WITH SCALE(10)*SHIFT(-40,170) DRAW disk WITH SCALE(10)*SHIFT(40,170) SET AREA COLOR 4 !色は赤色 DRAW disk WITH SCALE(140) SET AREA COLOR 1 !色は黒色 DRAW disk WITH SCALE(30)*SHIFT(-60,60) DRAW disk WITH SCALE(30)*SHIFT(60,60) DRAW disk WITH SCALE(30)*SHIFT(-60,-60) DRAW disk WITH SCALE(30)*SHIFT(60,-60) SET LINE COLOR 1 !色は黒色 SET LINE WIDTH 3 PLOT LINES : 0,-140;0,140 END PICTURE !背景 EXTERNAL PICTURE haikei OPTION ANGLE DEGREES SET AREA COLOR 49 !塗りつぶしの色は葉っぱ色 FOR a=0 TO 360 PLOT LINES :250*COS(a),150*SIN(a); !楕円を描く NEXT a paint 0,0 !中を塗りつぶす SET LINE COLOR 224 !色は緑色 SET LINE WIDTH 10 PLOT LINES : -200,0;200,0 PLOT LINES PLOT LINES : 100,0;160,80 PLOT LINES PLOT LINES : 100,0;160,-80 PLOT LINES PLOT LINES : 0,0;100,120 PLOT LINES PLOT LINES : 0,0;100,-120 PLOT LINES PLOT LINES : -100,0;0,140 PLOT LINES PLOT LINES : -100,0;0,-140 PLOT LINES PLOT LINES : -200,0;-100,120 PLOT LINES PLOT LINES : -200,0;-100,-120 END PICTURE |
└改良しよう! 山中和義 2006/11/11 09:22:29 ツリーへ
Re: SECONDさん、山中和義さんどうもありがとう... |
返事を書く |
山中和義 2006/11/11 09:22:29 | |
改良しよう!
●移動処理で、移動後の位置=現在の位置+移動量とする。 この移動量で方向が計算できます。(三角関数など) プログラム前半のみ REM てんとう虫の移動(背景付き) !tentoumusiという絵の使用を宣言 DECLARE EXTERNAL PICTURE tentoumusi DECLARE EXTERNAL PICTURE haikei OPTION ANGLE DEGREES SET WINDOW -200,200,-200,200 !xの初期値を-200とする。 LET x=-200 LET y=25 LET s$="" DO WHILE s$<>CHR$(13) !enterが押されるまで LET dx=0 !移動量をクリア LET dy=0 IF s$="s" OR s$="S" THEN LET dx=1 !sを押すと前へ IF s$="w" OR s$="W" THEN LET dy=1 !wを押すと上へ IF s$="z" OR s$="Z" THEN LET dy=-1 !zを押すと下へ IF s$="a" OR s$="A" THEN LET dx=-1 !aを押すと後ろへ LET x=x+dx !移動量を加えて移動させる LET y=y+dy SET DRAW mode hidden !ちらつき防止(開始) CLEAR DRAW grid(20,20) SET TEXT COLOR 4 PLOT TEXT ,AT -190,180:"s,a,w,zを押すと、てんとう虫が葉っぱの前後上下に動きます。" PLOT TEXT ,AT -190,160:"enterを押すと終了します。" !てんとう虫を移動させる。 DRAW haikei SET LINE WIDTH 1 !線の太さを元の太さに戻す。 IF dx<>0 OR dy<>0 THEN LET r=ANGLE(dx,dy)-90 !移動方向に向ける DRAW tentoumusi WITH SCALE(0.15)*ROTATE(r)*SHIFT(x,y) SET DRAW mode explicit !ちらつき防止(終了) CHARACTER INPUT s$ LOOP END また、角度はX軸を基準に計るので、てんとう虫の元絵は右向きの方がいいと思います。 そのときは、角度計算は、 IF dx<>0 OR dy<>0 THEN LET r=ANGLE(dx,dy) !移動方向に向ける となります。 ●前のPLOT LINESがセミコロンで終わっていないため、続くPLOT LINESのみ行は必要なし。 SET LINE COLOR 224 !色は緑色 SET LINE WIDTH 10 PLOT LINES : -200,0;200,0 PLOT LINES : 100,0;160,80 PLOT LINES : 100,0;160,-80 PLOT LINES : 0,0;100,120 PLOT LINES : 0,0;100,-120 PLOT LINES : -100,0;0,140 PLOT LINES : -100,0;0,-140 PLOT LINES : -200,0;-100,120 PLOT LINES : -200,0;-100,-120 END PICTURE |
└マウスで誘導! 山中和義 2006/11/11 10:53:39 ツリーへ
Re: 改良しよう! |
返事を書く |
山中和義 2006/11/11 10:53:39 | |
マウスで誘導!
※てんとう虫は右向きにしています。 REM てんとう虫の移動(背景付き) !tentoumusiという絵の使用を宣言 DECLARE EXTERNAL PICTURE tentoumusi DECLARE EXTERNAL PICTURE haikei OPTION ANGLE DEGREES SET WINDOW -200,200,-200,200 !xの初期値を-200とする。 LET x=-200 LET y=25 DO WHILE mrb<>1 !右ボタンが押されるまで MOUSE POLL mx,my,mlb,mrb !マウスの状態を取得する IF mx<>x OR my<>y THEN LET r=ANGLE(mx-x,my-y) !移動方向に向ける LET x=x+2*COS(r) !移動量を加えて移動させる LET y=y+2*SIN(r) SET DRAW mode hidden !ちらつき防止(開始) CLEAR DRAW grid(20,20) SET TEXT COLOR 4 PLOT TEXT ,AT -190,180:"マウス移動でてんとう虫を誘導しよう。" PLOT TEXT ,AT -190,160:"右ボタンを押すと終了します。" !てんとう虫を移動させる。 DRAW haikei SET LINE WIDTH 1 !線の太さを元の太さに戻す。 DRAW tentoumusi WITH SCALE(0.15)*ROTATE(r)*SHIFT(x,y) SET DRAW mode explicit !ちらつき防止(終了) LOOP END !色付きてんとう虫を定義する EXTERNAL PICTURE tentoumusi SET AREA COLOR 1 !色は黒色 DRAW disk WITH SCALE(80)*SHIFT(100,0) DRAW disk WITH SCALE(10)*SHIFT(170,-40) DRAW disk WITH SCALE(10)*SHIFT(170,40) SET AREA COLOR 4 !色は赤色 DRAW disk WITH SCALE(140) SET AREA COLOR 1 !色は黒色 DRAW disk WITH SCALE(30)*SHIFT(-60,60) DRAW disk WITH SCALE(30)*SHIFT(60,60) DRAW disk WITH SCALE(30)*SHIFT(-60,-60) DRAW disk WITH SCALE(30)*SHIFT(60,-60) SET LINE COLOR 1 !色は黒色 SET LINE WIDTH 3 PLOT LINES : -140,0;140,0 END PICTURE !背景 EXTERNAL PICTURE haikei OPTION ANGLE DEGREES SET AREA COLOR 49 !塗りつぶしの色は葉っぱ色 FOR a=0 TO 360 PLOT LINES :250*COS(a),150*SIN(a); !楕円を描く NEXT a paint 0,0 !中を塗りつぶす SET LINE COLOR 224 !色は緑色 SET LINE WIDTH 10 PLOT LINES : -200,0;200,0 PLOT LINES : 100,0;160,80 PLOT LINES : 100,0;160,-80 PLOT LINES : 0,0;100,120 PLOT LINES : 0,0;100,-120 PLOT LINES : -100,0;0,140 PLOT LINES : -100,0;0,-140 PLOT LINES : -200,0;-100,120 PLOT LINES : -200,0;-100,-120 END PICTURE |
├改良第3弾、ライントレース(線沿う虫) 山中和義 2006/11/11 17:22:30 ツリーへ
Re: マウスで誘導! |
返事を書く |
山中和義 2006/11/11 17:22:30 | |
改良第3弾、ライントレース(線沿う虫)
移動量と線幅(葉の筋)との調整が難しいかな。 REM てんとう虫の移動(背景付き) !絵の使用を宣言する DECLARE EXTERNAL PICTURE tentoumusi DECLARE EXTERNAL PICTURE haikei OPTION ANGLE DEGREES !角度の単位は度 SET WINDOW -200,200,-200,200 !xの初期値を-200とする。 LET x=-200 LET y=25 DO WHILE mrb<>1 !右ボタンが押されるまで MOUSE POLL mx,my,mlb,mrb !マウスの状態を取得する SET DRAW mode hidden !ちらつき防止(開始) CLEAR DRAW grid(20,20) SET TEXT COLOR 4 PLOT TEXT ,AT -190,180:"右ボタンを押すと終了します。" DRAW leaf !葉を描く !てんとう虫を移動させる。 LET si=SIN(r) LET co=COS(r) ASK PIXEL VALUE (x+20*co,y+20*si) pc !目の位置の色は? IF pc=224 THEN !葉の筋のうす茶色なら LET r=r+1 !反時計まわり ELSE LET r=r-1 END IF LET x=x+0.2*co !移動量を加えて移動させる LET y=y+0.2*si DRAW tentoumusi(x,y) WITH SCALE(0.15)*ROTATE(r)*SHIFT(x,y) !てんとう虫を描く SET DRAW mode explicit !ちらつき防止(終了) !WAIT DELAY 0.1 LOOP END !てんとう虫 EXTERNAL PICTURE tentoumusi(x,y) SET AREA COLOR 1 !黒色 DRAW disk WITH SCALE(80)*SHIFT(100,0) DRAW disk WITH SCALE(10)*SHIFT(170,-40) DRAW disk WITH SCALE(10)*SHIFT(170,40) SET AREA COLOR 4 !赤色 DRAW disk WITH SCALE(140) SET AREA COLOR 1 !黒色 DRAW disk WITH SCALE(30)*SHIFT(-60,60) DRAW disk WITH SCALE(30)*SHIFT(60,60) DRAW disk WITH SCALE(30)*SHIFT(-60,-60) DRAW disk WITH SCALE(30)*SHIFT(60,-60) SET LINE COLOR 1 !黒色 SET LINE WIDTH 3 PLOT LINES: -140,0; 140,0 SET LINE WIDTH 1 END PICTURE !葉 EXTERNAL PICTURE leaf SET AREA COLOR 1 !縁は黒 DRAW disk WITH SCALE(250,150) SET AREA COLOR 49 !緑色 DRAW disk WITH SCALE(245,145) SET LINE COLOR 224 !うす茶色 SET LINE WIDTH 30 PLOT LINES: -200,0; 200,0 PLOT LINES: 100,0; 160,50 PLOT LINES: 100,0; 160,-50 PLOT LINES: 0,0; 100,80 PLOT LINES: 0,0; 100,-80 PLOT LINES: -100,0; 0,100 PLOT LINES: -100,0; 0,-100 PLOT LINES: -200,0; -100,80 PLOT LINES: -200,0; -100,-80 SET LINE WIDTH 1 END PICTURE |
└!比例制御を付けました。 SECOND 2006/11/11 23:48:34 ツリーへ
Re: マウスで誘導! |
返事を書く |
SECOND 2006/11/11 23:48:34 | |
!比例制御を付けました。
!メイン部のみ。 DO WHILE mrb<>1 !右ボタンが押されるまで MOUSE POLL mx,my,mlb,mrb !マウスの状態を取得する LET dx=mx-x LET dy=my-y LET a=SQR(dx^2+dy^2) !差分の絶対値。 IF a>0.1 THEN !不感帯の設定と、ANGLE()の保護 IF 10<a THEN LET a=10 !移動速度に上限を付ける。 LET r=ANGLE(dx,dy) !移動方向に向ける。 LET x=x+a*COS(r) !移動量を差分に比例させ、ハンチングさせない。 LET y=y+a*SIN(r) !----- SET DRAW mode hidden !ちらつき防止(開始) CLEAR DRAW grid(20,20) SET TEXT COLOR 4 PLOT TEXT ,AT -190,180:"マウス移動でてんとう虫を誘導しよう。" PLOT TEXT ,AT -190,160:"右ボタンを押すと終了します。" !てんとう虫を移動させる。 DRAW haikei SET LINE WIDTH 1 !線の太さを元の太さに戻す。 DRAW tentoumusi WITH SCALE(0.15)*ROTATE(r)*SHIFT(x,y) SET DRAW mode explicit !ちらつき防止(終了) !----- END IF WAIT DELAY 0.02 !20ms クロックアップを押える。 LOOP END |
└驚きの連続でした。いろんなことができるの... 樫木 2006/11/12 23:17:41 ツリーへ
Re: !比例制御を付けました。 |
返事を書く |
樫木 2006/11/12 23:17:41 | |
驚きの連続でした。いろんなことができるのですね。
今後に生かしたいと思います。 ほんとうに、ありがとうございました。 「赤オニと青オニ」というのもあるのですが、 何か改良を加えることができるでしょうか。 もし可能であれば、お教えください。 (プログラムの書き方を含めて) よろしくお願いします。 REM 赤オニと青オニ SET WINDOW -200,200,-200,200 OPTION ANGLE DEGREES DECLARE EXTERNAL PICTURE 青オニ DECLARE EXTERNAL PICTURE 赤オニ LET s$="" DO SET TEXT COLOR 4 PLOT TEXT ,AT -190,180:"aを押すとオニが、動き始めます。enterキーで止まります。" CHARACTER INPUT s$ IF s$="a"THEN GOTO 100 IF s$=CHR$(13) THEN EXIT DO 100 FOR x=0 TO 8 STEP 0.01 SET DRAW mode hidden CLEAR DRAW 赤オニ WITH SCALE(0.1+x/5)*ROTATE((15*x)*(15*x)) SET DRAW mode explicit NEXT x FOR x=8 TO 0 STEP -0.01 SET DRAW mode hidden clear DRAW 青オニ WITH SCALE(0.1+x/5)*ROTATE((15*x)*(15*x)) SET DRAW mode explicit NEXT x LOOP END EXTERNAL PICTURE 青オニ SET AREA COLOR 6 PLOT AREA :-170,100;-190,190;-100,170 PLOT AREA :170,100;190,190;100,170 SET LINE COLOR 1 SET LINE WIDTH 3 PLOT LINES :-175,125;-130,175 PLOT LINES :175,125;130,175 PLOT LINES :-182,140;-145,180 PLOT LINES :182,140;145,180 SET LINE WIDTH 1 SET AREA COLOR 234 DRAW disk WITH SCALE (200)*SHIFT (0,0) SET AREA COLOR 0 DRAW disk WITH SCALE (150)*SHIFT (0,-50) DRAW disk WITH SCALE (50)*SHIFT (50,88) DRAW disk WITH SCALE (50)*SHIFT (-50,88) SET LINE COLOR 1 DRAW circle WITH SCALE (50)*SHIFT (50,88) DRAW circle WITH SCALE (50)*SHIFT (-50,88) SET AREA COLOR 1 DRAW disk WITH SCALE (20)*SHIFT (40,80) DRAW disk WITH SCALE (20)*SHIFT (-40,80) SET AREA COLOR 0 DRAW disk WITH SCALE (6)*SHIFT (45,88) DRAW disk WITH SCALE (6)*SHIFT (-35,88) SET LINE COLOR 1 SET LINE WIDTH 2 PLOT LINES :0,-110;0,0 SET AREA COLOR 4 DRAW disk WITH SCALE (40)*SHIFT (0,11) SET LINE COLOR 1 SET LINE WIDTH 1 PLOT LINES :80,-40;140,-20 PLOT LINES :80,-60;140,-60 PLOT LINES :80,-80;140,-100 PLOT LINES :-80,-40;-140,-20 PLOT LINES :-80,-60;-140,-60 PLOT LINES :-80,-80;-140,-100 SET AREA COLOR 234 DRAW disk WITH SCALE (50)*SHIFT (0,120) SET AREA COLOR 4 DRAW disk WITH SCALE (50)*SHIFT (0,-120) SET AREA COLOR 0 DRAW disk WITH SCALE (10)*SHIFT (10,36) END PICTURE EXTERNAL PICTURE 赤オニ !青オニの COLOR 234 を COLOR 4 に変更。他は同じ END PICTURE |
└!オニの顔は2つも要らない。 SECOND 2006/11/13 04:01:42 ツリーへ
Re: 驚きの連続でした。いろんなことができるの... |
返事を書く |
SECOND 2006/11/13 04:01:42 | |
!オニの顔は2つも要らない。
REM 赤オニと青オニ SET WINDOW -200,200,-200,200 OPTION ANGLE DEGREES DECLARE EXTERNAL PICTURE オニ DO SET TEXT COLOR 4 PLOT TEXT ,AT -190,180:"aを押すとオニが、動き始めます。enterキーで止まります。" !---- DO CHARACTER INPUT s$ IF s$=CHR$(13) THEN STOP LOOP UNTIL s$="a" OR s$="A" !---- FOR x=0 TO 8 STEP 0.01 DRAW オニ(4) WITH SCALE(0.1+x/5)*ROTATE((15*x)*(15*x)) !赤オニ NEXT x FOR x=8 TO 0 STEP -0.01 DRAW オニ(234) WITH SCALE(0.1+x/5)*ROTATE((15*x)*(15*x)) !青オニ NEXT x LOOP END EXTERNAL PICTURE オニ(青234赤4) SET DRAW mode hidden CLEAR !---- SET AREA COLOR 6 PLOT AREA :-170,100;-190,190;-100,170 PLOT AREA :170,100;190,190;100,170 SET LINE COLOR 1 SET LINE WIDTH 3 PLOT LINES :-175,125;-130,175 PLOT LINES :175,125;130,175 PLOT LINES :-182,140;-145,180 PLOT LINES :182,140;145,180 SET LINE WIDTH 1 SET AREA COLOR 青234赤4 DRAW disk WITH SCALE (200)*SHIFT (0,0) SET AREA COLOR 0 DRAW disk WITH SCALE (150)*SHIFT (0,-50) DRAW disk WITH SCALE (50)*SHIFT (50,88) DRAW disk WITH SCALE (50)*SHIFT (-50,88) SET LINE COLOR 1 DRAW circle WITH SCALE (50)*SHIFT (50,88) DRAW circle WITH SCALE (50)*SHIFT (-50,88) SET AREA COLOR 1 DRAW disk WITH SCALE (20)*SHIFT (40,80) DRAW disk WITH SCALE (20)*SHIFT (-40,80) SET AREA COLOR 0 DRAW disk WITH SCALE (6)*SHIFT (45,88) DRAW disk WITH SCALE (6)*SHIFT (-35,88) SET LINE COLOR 1 SET LINE WIDTH 2 PLOT LINES :0,-110;0,0 SET AREA COLOR 4 DRAW disk WITH SCALE (40)*SHIFT (0,11) SET LINE COLOR 1 SET LINE WIDTH 1 PLOT LINES :80,-40;140,-20 PLOT LINES :80,-60;140,-60 PLOT LINES :80,-80;140,-100 PLOT LINES :-80,-40;-140,-20 PLOT LINES :-80,-60;-140,-60 PLOT LINES :-80,-80;-140,-100 SET AREA COLOR 青234赤4 DRAW disk WITH SCALE (50)*SHIFT (0,120) SET AREA COLOR 4 DRAW disk WITH SCALE (50)*SHIFT (0,-120) SET AREA COLOR 0 DRAW disk WITH SCALE (10)*SHIFT (10,36) !---- SET DRAW mode explicit END PICTURE |