{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from math import sin, cos, radians\n", "from matplotlib import pyplot as plt\n", "%matplotlib inline\n", "\n", "def interaction(x,y,vx,vy,ax,ay,dt): # ぶつかる処理など\n", " return (False,x,y,vx,vy) # (後で書くので、今は何もしない)\n", "# ボールを投げて、軌跡=位置(x,y)配列、ゴールしたかを返す\n", "def throw(x,y,v0,angle,repeatNum,dt):#位置,初速度,角度,計算回数,計算ステップ\n", " isSuccess = False # ボールがゴールに入ったか\n", " xarray = []; yarray = [] # 水平=x方向と鉛直=y方向の位置格納配列\n", " vx = v0*cos( radians(angle) ) # ボールの速度(水平=x方向)\n", " vy = v0*sin( radians(angle) ) # ボールの速度(鉛直=y方向)\n", " ax = 0.0 # 水平=x方向に働く加速度はゼロ\n", " ay = -9.8 # 鉛直=x方向に働く加速度=重力加速度\n", " for i in range(repeatNum): # 時間を細かく進めながら、計算していく\n", " vx = vx + ax*dt # 水平=x方向加速度で、水平方向速度が変化\n", " vy = vy + ay*dt # 鉛直=x方向加速度で、鉛直方向速度が変化\n", " x = x + (vx-ax*dt/2)*dt # 水平(x)方向速度で、水平位置が変化\n", " y = y + (vy-ay*dt/2)*dt # 鉛直(x)方向速度で、鉛直位置が変化\n", " isPassing,x,y,vx,vy = interaction(x,y,vx,vy,ax,ay,dt) \n", " if isPassing:\n", " isSuccess = True\n", " xarray.append(x) # 水平(x)位置を、水平位置を格納する配列に追加\n", " yarray.append(y) # 鉛直(x)位置を、鉛直位置を格納する配列に追加\n", " return (xarray,yarray,isSuccess)\n", "# 描画関数\n", "def prepareFigureArea():\n", " plt.figure(figsize=(5,5)) # グラフの大きさを設定\n", " plt.xlim([0,5]); plt.ylim([0,5]) # 描くXY領域(各0から5まで)を設定\n", " plt.xlabel('X - Axis (m)');plt.ylabel('Y - Axis (m)') # 軸説明 \n", " return\n", "# ボールを投げ、軌跡・結果を得る。引数:スタート位置,初速度,角度,計算回数,計算ステップ\n", "x1,y1,isSuccess = throw(0,0,6,35,500,0.01)\n", "x2,y2,isSuccess2 = throw(0,0,6,45,500,0.01)\n", "x3,y3,isSuccess3 = throw(0,0,6,55,500,0.01)\n", "# 描画する\n", "prepareFigureArea()\n", "plt.plot(x1, y1, 'bo-', x2, y2, 'ro-',x3, y3, 'ko-')\n", "plt.legend(['35 deg.','45 deg.','55 deg.'])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy\n", "nx = 50 # 10cm刻みでX,Yに50分割し、10cm×50=5m\n", "ny = 50 # の領域を確保する\n", "xa = numpy.linspace(0, 5, nx)\n", "ya = numpy.linspace(0, 5, ny)\n", "X, Y = numpy.meshgrid(xa, ya) # x,yの「平面座標メッシュ」を作る\n", "# xyの位置で表される空間に何があるかを、配列として格納しておく\n", "obj = numpy.zeros((ny, nx)) # 最初は「空気=0」で埋める\n", "obj[0:1,0:49] = 1 # 床は、フラグ値1とする\n", "obj[28:42,45:46] = 2 # ゴール板は、フラグ値2とする\n", "obj[30:31,42-2:42+2] = 3 #ゴール領域は、フラグ値3とする\n", "\n", "# ゴールや壁や床を描くよう、描画関数を変更する\n", "def prepareFigureArea():\n", " plt.figure(figsize=(5,5))\n", " plt.xlim([0,5]); plt.ylim([0,5]) \n", " plt.xlabel('X - Axis (m)'); plt.ylabel('Y - Axis (m)') \n", " plt.contourf(X, Y, obj, alpha=0.2) # フラグ値を表示する\n", " plt.tick_params()\n", " return\n", "\n", "x,y,isSuccess = throw(0.2,2,8,65,1500,0.01)\n", "x2,y2,isSuccess2 = throw(0.2,2,12,34,1500,0.01)\n", "prepareFigureArea()\n", "plt.plot(x, y, 'bo-', x2, y2, 'ro-')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "r = 1.0 # 反射する時の「跳ね返り(反発)係数」\n", "\n", "def interaction(x,y,vx,vy,ax,ay,dt):\n", " isPassing = False # ぶつかったか?フラグを「ぶつかってない」にしておく\n", " # ボールの位置が計算領域外なら、ぶつかり・ゴール処理はしない\n", " if y < 0 or 4.9 < y or x < 0.1 or 4.9 < x: \n", " return (isPassing,x,y,vx,vy)\n", " # ボールが移動する次位置(領域)に「何があるか」を調べる\n", " objAtNextPos = obj[round(y*10), round(x*10)] \n", " if 1 == objAtNextPos or 2 == objAtNextPos: # 床・ゴール板なら\n", " x = x-(vx-ax*dt/2)*dt # 板や床にめりこんだ状態にならないように\n", " y = y-(vy-ay*dt/2)*dt # 位置を「前の瞬間」の位置に戻す\n", " if 1 == objAtNextPos: # 床なら\n", " vy = -vy*r # 鉛直方向で跳ね返らせる(方向を反転させる)\n", " elif 2 == objAtNextPos: # ゴール板なら\n", " vx = -vx*r # 水平方向で跳ね返らせる(方向を反転させる)\n", " elif 3 == objAtNextPos and vy < 0: # ゴールに下向き突入していたら\n", " isPassing = True # ゴール追加のフラグをTrueとする\n", " return (isPassing,x,y,vx,vy)\n", "\n", "x,y,isSuccess = throw(0.2,2,8,65,1500,0.01)\n", "x2,y2,isSuccess2 = throw(0.2,2,12,34,1500,0.01)\n", "prepareFigureArea()\n", "plt.plot(x, y, 'bo-', x2, y2, 'ro-')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "r = 0.8\n", "x,y,isSuccess = throw(0.2,2,8,65,1500,0.01)\n", "x2,y2,isSuccess2 = throw(0.2,2,12,34,1500,0.01)\n", "prepareFigureArea()\n", "plt.plot(x, y, 'bo-', x2, y2, 'ro-')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "r = 0.8\n", "angleRange = numpy.linspace(30, 70, 400) #角度振り条件\n", "velocityRange = numpy.linspace(5, 15, 400) #速度振り条件\n", "Xa,Yv = numpy.meshgrid(angleRange,velocityRange)\n", "areSuccess = [] # 角度・速度の各条件で成功するか格納する2次元配列\n", "for v in velocityRange: # 角度条件ループ\n", " a = []; for angle in angleRange:# 速度条件ループ\n", " x,y,isSuccess = throw(0.2,2,v,angle,500,0.01)#投げる\n", " a.append( isSuccess ) \n", " areSuccess.append(a) # 上行と合わせ、成功したかを2次元的に格納\n", "fig = plt.figure(figsize=(5,5)) # 結果を描く\n", "plt.contourf(Xa,Yv,areSuccess,alpha=1.0) \n", "plt.xlabel('Throw Angle(deg)'); plt.ylabel('Throw velocity(m/s)');" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "angleRange = numpy.linspace(30, 70, 20) # 角度振り条件\n", "velocityRange = numpy.linspace(5, 15, 30) # 速度振り条件\n", "Xa,Yv = numpy.meshgrid(angleRange,velocityRange)\n", "prepareFigureArea() \n", "for v in velocityRange: # 速度ループ\n", " for angle in angleRange: # 角度ループ\n", " x,y,isSuccess = throw(0.2,2,v,angle,500,0.01)\n", " if isSuccess:# 上行でボールを投げて、成功したら描く\n", " plt.plot(x, y, 'b-')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "r = 0.8\n", "angleRange = numpy.linspace(30, 70, 400) #角度\n", "velocityRange = numpy.linspace(5, 15, 400) #速度\n", "Xa,Yv = numpy.meshgrid(angleRange,velocityRange)\n", "areSuccess = [] # 各条件で成功するかどうかを格納する\n", "for v in velocityRange: # 角度条件ループ\n", " a = []\n", " for angle in angleRange: # 速度条件ループ\n", " x,y,isSuccess = throw(0.2,1.5,v,angle,500,0.01)\n", " a.append( isSuccess ) \n", " areSuccess.append(a) # 上行と合わせ、成功したかを2次元的に格納する\n", "fig = plt.figure(figsize=(5,5)) # 結果を描く\n", "plt.contourf(Xa,Yv,areSuccess,alpha=1.0) \n", "plt.xlabel('Throw Angle(deg)'); plt.ylabel('Throw velocity(m/s)');" ] } ], "metadata": { "kernelspec": { "display_name": "Python [default]", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.2" } }, "nbformat": 4, "nbformat_minor": 0 }