着弾点の予想と目標距離まで飛ばすための発射角の計算

;
;
;
;
;
#include "hspmath.as" ; asin使
;
#const BULLET_FRAME 50
groundTop = 400.0 ;
gravity = -1.0 ;
velocity = 20.0 ;
;
bulletPosX = 50.0 ;
bulletPosY = 0.0 ;
firingAngle = 45.0 * M_PI / 180.0 ; [rad]
setHikyori = 200.0 ;
flgShot = 0 ;
vx = 0.0
vy = 0.0
ddim courseOfBullet, BULLET_FRAME, 2 ;
;-----------------------------------------------------------
;
;
;
*main
redraw 1 : await 16 : redraw 0 : color 255, 255, 255 : boxf : color 0,0,0 : pos 0,0
stick key, 1|2|4|8|128
; --------------
;
; --------------
if key&128 : end
; --------------
;
; --------------
if key&2 : firingAngle += 1.0 * M_PI / 180.0
if key&8 : firingAngle -= 1.0 * M_PI / 180.0
; --------------
;
; --------------
if key&16 : flgShot = 1
; --------------
;
; --------------
;
if int(bulletPosY) > 0 {
vy += gravity
} else {
vx = 0.0
vy = 0.0
}
;
if flgShot = 1 {
;
vx = velocity * cos(firingAngle)
vy = velocity * sin(firingAngle) + gravity / 2.0
;調1/21/2
;
flgShot = 0
}
;
px = bulletPosX
py = bulletPosY
px += vx
py += vy
;
if py < 0.0 {
;
bulletPosX += vx * bulletPosY/-vy
bulletPosY = 0.0
} else {
bulletPosX += vx
bulletPosY += vy
}
;
gosub *CalcDandou
;
gosub *CalcHikyori
; --------------
;
; --------------
line 0, groundTop, ginfo_winx, groundTop
gosub *PlotDandou
gosub *PlotBullet
pos 0, 0 : color 0,0,0
mes "" + bulletPosX + ", " + bulletPosY
mes "" + yosouHikyoriX
mes " " + (bulletPosX + yosouHikyoriX) + ", 0.0"
mes "( " + setHikyori + ")" + rad2deg(yosouKaku) + " [deg] or " + (90.0-rad2deg(yosouKaku)) + " [deg]"
goto *main
;-----------------------------------------------------------
;
;
;
*PlotDandou
; --------------
;
; --------------
color 200, 200, 200
x = courseOfBullet(0, 0)
y = courseOfBullet(0, 1) * -1 + groundTop
pos x, y
repeat BULLET_FRAME-1, 1
x = courseOfBullet(cnt, 0)
y = courseOfBullet(cnt, 1) * -1 + groundTop
line x, y
loop
return
;-----------------------------------------------------------
;
;
;
*PlotBullet
; --------------
;
; --------------
x = bulletPosX
y = -bulletPosY + groundTop
r = 30.0
dx = r * cos(firingAngle) + x
dy = -r * sin(firingAngle) + y
color 0,0,255
line x, y, dx, dy
mes strf("%.2f", (firingAngle*180.0/M_PI) ) + " [deg]"
mes "Up:↑Down:↓"
; --------------
;
; --------------
x = bulletPosX
y = -bulletPosY + groundTop
r = 5
color 0,0,0
circle x-r, y-r, x+r, y+r
return
;-----------------------------------------------------------
;
;
;
*CalcDandou
cvx = velocity * cos(firingAngle)
cvy = velocity * sin(firingAngle) + gravity/2.0
;0
courseOfBullet(0, 0) = bulletPosX
courseOfBullet(0, 1) = bulletPosY
;1
repeat BULLET_FRAME-1, 1
courseOfBullet(cnt, 0) = courseOfBullet(cnt-1, 0) + cvx
courseOfBullet(cnt, 1) = courseOfBullet(cnt-1, 1) + cvy + gravity * (cnt-1)
loop
return
;-----------------------------------------------------------
;
;
;
*CalcHikyori
;g
;tx,y
;
;g g<0
;0
;
;tx,y
;
; x = vx0 * t
; y = 1/2*g*t^2 + vy0 * t
;
;0 y = 0 t
;0y=
;
; 0 = 1/2*g*t^2 + vy0 * t
; = t(1/2*g*t + vy0)
;
; (1/2*g*t + vy0) = 0
; 1/2*g*t = -vy0
; t = -vy0 * 2/g
;
;y = 0t
; t = 0
; t = -vy0 * 2/g
;t = 0t = -vy0 * 2/g
;x
;
; x = vx0 * t
; = vx0 * -vy0 * 2/g
;
;r
; vx0 = v0 * cos(r)
; vy0 = v0 * sin(r)
;
;x
;
; x = -v0^2 * cos(r) * sin(r) * 2/g
;
;x
yosouHikyoriX = -1.0 * velocity * velocity * cos(firingAngle) * sin(firingAngle) * 2.0 / gravity
;
;xr
; x = -v0^2 * cos(r) * sin(r) * 2/g
; cos(r) * sin(r) = x / (-v0^2) * g/2
;
;
; sin(x+y) = sin(x) * cos(y) + cos(x) * sin(y)
; y=x
; sin(2*x) = 2 * sin(x) * cos(x)
; 1/2 * sin(2*x) = sin(x) * cos(x)
;
;
; cos(r) * sin(r) = x / (-v0^2) * g/2
; 1/2 * sin(2*r) = x / (-v0^2) * g/2
; sin(2*r) = x / (-v0^2) * g
; 2 * r = asin( x / (-v0^2) * g )
; r = 1/2 * asin( x / (-v0^2) * g )
;r
;
yosouKaku = asin( setHikyori / (-velocity * velocity) * gravity ) / 2.0
return
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX