新しく発言する EXIT インデックスへ
格子状に並べたい

  格子状に並べたい 樫木 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


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