• 締切済み

十進BASICでの衝突プログラミング

十進ベーシック超初心者です。二次元の箱の中に円を置き、そこで衝突を繰り返すプログラムをつくりたいのですが行き詰っています。 箱の中だけでの衝突は、以下のようにプログラムできたのですが、円にぶつかるときどのようにプログラムをくんで跳ね返させればいいかわかりません。どなたか教えて下さい。 SET WINDOW -20,20,-20,20 DRAW GRID(2,2) PLOT LINES: -10,-10 ;10,-10;10,10;-10,10;-10,-10 DRAW CIRCLE WITH SCALE (2) LET X=-10 LET Y=-10 LET T=0 LET V=4.53574748 LET A=56.654968 LET VX=COS(A) LET VY=SIN(A) 100 PLOT LINES:X,Y ; IF VX>0 THEN LET LX=20-(10+X) END IF IF VX<0 THEN LET LX=20-(10-X) END IF IF VY>0 THEN LET LY=20-(10+Y) END IF IF VY<0 THEN LET LY=20-(10-Y) END IF LET T=MIN(LX/ABS(VX),LY/ABS(VY)) LET X=VX*T+X LET Y=VY*T+Y IF T=LX/ABS(VX) THEN LET VX=-VX END IF IF T=LY/ABS(VY) THEN LET VY=-VY END IF GOTO 100 END

みんなの回答

noname#194317
noname#194317
回答No.1

円の大きさがわかっているなら、中心の座標が今どこにあるかを見張ることで、接触したかどうかの判定はできますけど、そういう問題ではないですか?座標系が100x100で中の円が直径20なら、円の中心座標がX>90またはX<10のとき、左右の壁に当たっていることになります。

gendoh
質問者

補足

回答ありがとうございます。 問題は、座標系が100x100の箱の中に、原点に直径20の固定された円(座標系、円の直径はこの値でなくてもいい)を置き、その箱の中で直径を考えない物体(レーザーのようなもの)を衝突させ続け、レーザーが通った後は黒く表示され、箱の中が真っ黒になっていく様子を見たいのです。直径20の円の中にはレーザーは入らず、円の中は真っ白なままです。ちょっと意味がわからないかもしれないですが、私がつくったプログラムをコピーして実行していただけたら、何がしたいかわかると思います。 私は、箱の中でレーザーを跳ね返させ続けるプログラムをつくることはできたのですが、原点に円を置き、そこにレーザーを跳ね返させるのに苦労しています。 レーザーが円にぶつかる時刻、ぶつかった後のレーザーの進む方向など、どうプログラムをくめばいいかわかりません。

関連するQ&A

  • Basicのプログラミングについて… (game)

    箱の上から自然に落ちるようにするにはどうすればよいのでしょうか? SET bitmap SIZE 500,500 SET WINDOW 0,10000,10000,0 LET x=5000 LET y=5000 LET jsw=0 DO UNTIL getkeystate(13)<0 PLOT LINES:0,5000+110;10000,5000+110 PLOT LINES:6000,4000;7000,4000 PLOT LINES:6000,4000;6000,5000+110 PLOT LINES:7000,4000;7000,5000+110 SET AREA COLOR "white" DRAW disk WITH SCALE(100)*SHIFT(x,y) IF getkeystate(37)<0 THEN LET x=x-50 IF getkeystate(39)<0 THEN LET x=x+50 IF x<0 THEN LET x=0 IF x>10000 THEN LET x=10000 IF getkeystate(38)<0 AND jsw=0 THEN LET jsw=1 LET i=-SQR(2500) END IF IF jsw=1 THEN LET y=i^2+2500 LET i=i+1 IF i>SQR(2500) THEN LET jsw=0 end if if i>0 then if 6000<x and x<7000 then if 4000-140<=y THEN LET jsw=0 end if end if end if if i>0 then if 6000>x then LET y=i^2+2400 IF i>SQR(2500) THEN LET jsw=0 end if end if SET AREA COLOR "black" DRAW disk WITH SCALE(100)*SHIFT(x,y) WAIT DELAY 0.01 LOOP END

  • 十進BASICでのsin(x)の近似のグラフ化について

    十進BASICを使っています。 sin(x)=x-x^3/3!+x^5/5!-... について、グラフで確かめようと思いプログラミングしてみたんですが、3行目でt=36以上にするとグラフが描かれなくなってしまいます。 どこを直せばt>35でもグラフが描かれるようになるのか教えていただけないでしょうか。よろしくおねがいします。 LET w=30 LET s=0.1 LET t=30 DIM p1(t) DIM p2(t) SET WINDOW -w,w,-w,w SET POINT STYLE 1 DRAW AXES0 FOR n= 1 TO t LET p1(n)=(-1)^(n+1) LET p2(n)=2*n-1 NEXT n SET LINE COLOR 15 FOR x= -w TO w STEP s LET y=SIN(x) PLOT LINES: x,y; NEXT x PLOT LINES SET LINE COLOR 1 FOR x= -w TO w STEP s WHEN EXCEPTION IN LET y=0 FOR n= 1 TO t LET y=y+p1(n)*x^p2(n)/FACT(p2(n)) NEXT n PLOT LINES: x,y; USE PLOT LINES END WHEN NEXT x END

  • 十進BASICのグラフィック表示についてなのですが・・・

    グラフィック画面にy=sqr(1-x^2)のグラフとy=-sqr(1-x^2)のグラフを描くプログラムを作りなさい。ただし、 set window -1.5,1.5,-1.5,1.5 としなさい という問題で 私が書いたプログラムは SET WINDOW -1.5,1.5,-1.5,1.5 DRAW axes DEF f(x)=SQR(1-x^2) DEF g(x)=-SQR(1-x^2) LET h=0.01 SET LINE COLOR 9 FOR x=-1 TO 1 STEP h PLOT LINES:x,f(x);x+h,f(x) NEXT x SET LINE COLOR 10 FOR x=-1 TO 1 STEP h PLOT LINES:x,g(x);x+h,g(x+h) NEXT x END なのですが、 DEF g(x)=-SQR(1-x^2) のところでエラーが出ます。 どうすれば、改善されるか思いつかないで教えてください。 よろしくおねがいします。

  • 十進BASICのプログラムについて

    十進BASICのプログラムについて 小町算のプログラムですが、 100 DIM s(9) 110 FOR i=1 TO 9 120 LET s(i)=-1 130 NEXT i 140 DO 150 LET sum=0 160 LET num=0 170 LET sign=1 180 FOR i=1 TO 9 190 IF s(i)<>0 THEN 200 LET sum=sum+sign*num 210 LET sign=s(i) 220 LET num=i 230 ELSE 240 LET num=10*num+i 250 END IF 260 NEXT i 270 LET sum=sum+sign*num 280 IF sum=100 THEN 290 FOR i=1 TO 9 300 IF s(i)= +1 THEN PRINT " + "; 310 IF s(i)= -1 THEN PRINT " - "; 320 PRINT i; 330 NEXT i 340 PRINT " = 100" 350 END IF 360 LET i=9 370 LET sign=s(i)+1 380 DO WHILE ( sign > 1 ) 390 LET s(i)=-1 400 LET i=i-1 410 LET sign=s(i)+1 420 LOOP 430 LET s(i)=sign 440 LOOP WHILE ( s(1) < 1) 450 END というものですが、このプログラム中にあるsum、num、signとはどういう意味があるのでしょうか?

  • プログラミング(c言語)

    以下のプログラムでオイラー法を用いた2階微分方程式を解きたいのですが、xとvyの値が変化しません。どこが間違っているのか教えて欲しいです 写真は問題文です #define _USE_MATH_DEFINES #include<stdio.h> #include<math.h> int main(){ int i; double x,x0,y,y0,vx,vx0,vy,vy0,r,dt,t=0.0; double G=6.674/pow(10.0,11.0),M=1.988*pow(10.0,30.0); x0=1.496*pow(10.0,11.0),y0=0.0,vx0=0.0,vy0=2.978*pow(10.0,4.0); dt=M_PI/100; for(i=1;i<=2000;i++){ x=x0+dt*vx0; y=y0+dt*vy0; r=sqrt(x0*x0+y0*y0); vx=vx0-dt*(G*M*x0/(r*r*r));vy=vy0-dt*(G*M*y0/(r*r*r)); t=dt*i; printf("x(%f)=%e y(%f)=%e vx(%f)=%e vy(%f)=%e\n",t,x,t,y,t,vx,t,vy); x0=x; y0=y; vx0=vx; vy0=vy; } return(0); }

  • 二次元の完全弾性衝突

    二次元での完全弾性衝突について 今、二次元空間内に半径rの剛体円盤1、2があります。 時刻t=0でのそれぞれの位置が(X1,Y1)、(X2,Y2)、速度が(Vx1,Vy1)、(Vx2,Vy2) で与えられています。 この二つが衝突する条件を求めよという問題で衝突直前t=t0の値として (X1',Y1')、(X2',Y2')、(Vx1,Vy1)、(Vx2,Vy2)という値も与えられているのですが どうしたらいいのでしょうか。 また衝突するとき、衝突後の速度V1'、V2'を衝突時の座標(X1,Y1)、(X2,Y2)、 速度V1、V2を使ってあらわすにはどうすればいいのでしょうか。 よろしくお願いします。

  • プログラミングの問題です

    このプログラムは何をするものか詳しく説明しなさい。 100 FOR x=1 TO 100 110 FOR y=x TO 100 120 LET a=x 130 LET b=y 140 DO 150 LET r=MOD(a,b) 160 IF r=0 THEN EXIT DO 170 LET a=b 180 LET b=r 190 LOOP 200 IF b=1 THEN 210 LET z=SQR(x^2+y^2) 220 IF INT(z)=z THEN PRINT x,y,z 230 END IF 240 NEXT y 250 NEXT x プログラムに関して初心者で、120~230(ほとんどですが…)の部分で何をしようとしているのかが分かりません。何か参考になるHPや考え方だけでも教えていただけないでしょうか。

  • 衝突判定について

    お世話になります。 現在、ある領域内で、球体を動かす処理をしています。 球体は複数ありそれぞれB1・B2・B3としています。 領域の境界を上がL1下がL2右がL3左がL4という具合に それぞれムービークリップを配置してます。 そこで問題なのですが、球体同士がぶつかったら、お互い 別方向に弾けるという処理をしているのですが、3回に一回 位の割合で、別方向に弾けないことがあります。 例えばB1とB2がぶつかった場合、B1は弾けるがB2は変化無く 動いてしまいます。何か良い方法は無いでしょうか? 下記にコードを記載します。よろしくお願いいたします。 onClipEvent(load) //初期値 { vx = 5; vy = 5; a = 1; b = 1; } onClipEvent(enterFrame){ //境界に達した時の処理 for (i=1;i<=4;i++){ kyokai = this.hitTest(_root[ "L" + i ]); if (kyokai==true && i == 1) {vy = 5; b = 1;} if (kyokai==true && i == 2) {vy = -5; b = -1;} if (kyokai==true && i == 3) {vx = -5; a = -1; } if (kyokai==true && i == 4) {vx = 5; a = 1; } } this._x += vx; this._y += vy; //他の球体を監視し、自分の領域に来たら //進行方向を逆にする for (i=1;i<=3;i++){ if(i!=1){ hantei = this.hitTest(_root[ "B" + i ]);} if (hantei==true){ if(a==-1) {vx=5; this._x = this._x+20;} if (b==-1) {vy=5; this._y = this._y+20;} if(a==1) {vx=-5; this._x = this._x-20;} if (b==1) vy=-5; this._y = this._y-20;} } }

  • BASICでモンテカルロ法

    モンテカルロ法で円周率の推定値を計算することを最近習ったのですが、定積分でもそれが可能なのを知り、どうやってプログラムを組めばいいのか分からず、困っています。 例えば、定積分∫[0→1]x^2dx=1/3~0.333([0→1]というのは、積分範囲です。)をモンテカルロ法で計算すると、どういうプログラムを組めばいいのでしょうか? わかる範囲で書いてみたのですが…積分の範囲をどうやってプログラミングすればいいのか、いまいち分かりませんでした。 教えていただけると、助かります。よろしくお願いします。 RANDOMIZE INPUT n SET WINDOW -0.1,1.1, -0.1,1.1 DRAW GRID SET POINT STYLE 1 LET sumin=0 FOR i=0 TO n LET x=RND LET y=RND SET POINT STYLE 2 IF y<x*x THEN SET POINT COLOR 4 LET sumin=sumin+1 END IF ! PRINT USING "(%.####, %.####)": x,y PLOT POINTS: x,y NEXT i PRINT 1*1*sumin/n END

  • 08年センター試験本試数学Bコンピュータ

    以下はユークリッドの互除法という自然数x,yの最大公約数を求めるためのプログラムです。 センター試験の問題では、130~150行目が空欄になっていて、その部分に当てはまるものは何か問うていました。 私は勉強不足で、高校で学ぶコンピュータプログラミングを知りません。 ユークリッドの互除法といえば、130~150行目は 130 LET Z=X 140 LET X=Y 150 LET Y=Z と、即答できねばいけないものなのでしょうか。 それともこの部分は考えて求められるものなのでしょうか。 もし後者であれば、その考える道筋を解説していただきたいです。 100 INPUT "x=";X 110 INPUT "y=";Y 120 IF X<Y THEN 130 LET Z=X 140 LET X=Y 150 LET Y=Z 160 END IF 170 IF Y=0 THEN 180 PRINT X 190 GOTO 270 200 END IF 210 LET R=X 220 LET R=R-Y 230 IF R>=Y THEN GOTO 220 240 LET X=Y 250 LET Y=R 260 GOTO 170 270 END

専門家に質問してみよう