質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

0回答

1820閲覧

javascript物理シミュレーション ボールの跳ね返り

pakarmy

総合スコア6

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2018/08/28 18:36

前提・実現したいこと

 中学校の卒業論文でチャレンジしているjavascriptにおけるボールの投擲と跳ね返り
空気抵抗、反発係数を加味したい。

発生している問題・エラーメッセージ

 1.跳ね返り係数を1にしても、元の高さまで行かない。
2.空気抵抗を加味すると NaNになってしまう。

エラーメッセージ ```NaN ### 該当のソースコード javascript ソースコード
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>decay</title> <style> *{ margin: 0px; padding: 0px; } #canvas { background-color: #000; } </style> <script> //var textForm1 = number(document.getElementById("textForm1").value); //var textForm2 = parseInt(textForm1, 10) * 1 ; function draw(){ var t = 0 var x = 10; var y = 10; //ボールの初期位置 var Hh = 0; var Pp = 0; var dx; var dy; var Rex; var Rey; var Cdx; var Cdy; var Fdx; var Fdy; //var vx =10; //x軸方向の初期速度 // var vy =0; //y軸方向の初期速度 //var R = 10; //ボールの半径 var grav = 9.8; //重力 var restitution = Number(document.getElementById("反発係数").value); //跳ね返り係数 var dt = Number(document.getElementById("時間増分").value); //時間増分 // var tt = Number(document.getElementById("描画間隔").value); //描画間隔   var vx = Number(document.getElementById("x方向初期速度").value); //x軸方向の初期速度 var vy = Number(document.getElementById("y方向初期速度").value); //y軸方向の初期速度 var R = Number(document.getElementById("ボールの半径").value);   var T = Number(document.getElementById("気温").value); var P = Number(document.getElementById("圧力").value); var M = Number(document.getElementById("湿度").value); var count = -1;   var canvas = document.getElementById('canvas'); var ctx = canvas.getContext('2d');5   //var ys = Number(document.getElementById("ボールの初期高度(MAX500)").value);//落下させる高さ var num = 0; function loop() { ctx.clearRect(0 ,0, canvas.width, canvas.height); //キャンバス上の図形をクリアにする Hh = 1.487 * ( 10 ** -6 ) * ( ( T ** 1.5 ) / ( T + 117 ) ); Pp1 = 0.0034856447 * P / ( T + 272.48 ); Pp2 = 1 - M * 0.378 * 6.1078 * 10 ** ( 7.5 * T / ( T + 237.3)) / P; Pp = Pp1 * Pp2; console.log("Pp1:",Pp1); console.log("Pp2:",Pp2); console.log("Pp:",Pp); console.log(vx); Rex = ( vx * Pp * 2 * R ) / Hh; Rey = ( vy * Pp * 2 * R ) / Hh; Cdx = 24 / Rex + ( 2.6 * Rex / 5.0 ) / ( 1 + ( Rex / 5.0 ) ** 1.52 ) + ( 0.411 * ( Rex / 263000 ) ** -7.94 ) / ( 1 + ( Rex / 263000) ** -8.00 ) + ( Rex ** 0.80 ) / 461000; Cdy = 24 / Rey + ( 2.6 * ( Rey / 5.0 ) ) / ( 1 + ( ( Rey / 5.0 ) ** 1.52 ) ) + ( 0.411 * ( ( Rey / 263000 ) ** -7.94 ) ) / ( 1 + ( ( Rey / 263000) ** -8.00 ) ) + ( ( Rey ** 0.80 ) / 461000); Fdx = 6 * Math.PI * R * Hh * vx + 0.5 * Cdx * P * Math.PI * ( R ** 2 ) * ( vx ** 2 ); Fdy = 6 * Math.PI * R * Hh * vy + 0.5 * Cdy * P * Math.PI * ( R ** 2 ) * ( vy ** 2 ); count = count + 1; vx = vx - ( Fdx ) * dt dx = vx * dt; vy = vy + ( grav - Fdy ) * dt; //重力による速度の変化 dy = vy * dt; console.log("Pp:",Pp); console.log("Hh:",Hh); console.log("Rex:",Rex); console.log("Cdx:",Cdx); console.log("Fdx:",Fdx); console.log(num); console.log("aa",24 / Rex); console.log(T ** 1.5); console.log(( 2.6 * Rex / 5.0 ) / ( 1 + ( Rex / 5.0 ) ** 1.52 )); console.log(( 0.411 * ( ( Rey / 263000 ) ** -7.94 ) ) / ( 1 + ( ( Rey / 263000) ** -8.00 ) ) ); console.log( ( Rex ** 0.80 ) / 461000); if(canvas.height - R <= y + dy){ //地面に到達したら dy = vy * dt * (canvas.height - R - y) / dy; vy = -1 * vy * restitution; //速度を反転し減速 //y = canvas.height-R; //座標を画面内に戻す // if (Math.abs(vy) < 0) { //速度がある程度小さくなったら強制的に0にする // vy = 0; // } } // tt = tt + dt x = x + dx y = y + dy; //if(count % 10 == 0){ ctx.beginPath(); ctx.fillStyle = 'red'; ctx.arc(x, y, R, 0, Math.PI*2.0, true); ctx.fill(); num++; // } requestAnimationFrame(loop); } loop(); } </script> </head> <body> <form> <label for="反発係数"> 反発係数</label> <input type="text" value="1" id="反発係数">

<label for="時間増分"> 時間増分</label>
<input type="text" value="0.01" id="時間増分">

<label for="x方向初期速度"> x方向初期速度</label>
<input type="text" value="10" id="x方向初期速度">

<label for="y方向初期速度"> y方向初期速度</label>
<input type="text" value="10" id="y方向初期速度">

<label for="ボールの半径"> ボールの半径</label>
<input type="text" value="10" id="ボールの半径">

<label for="気温"> 気温</label>
<input type="text" value="10" id="気温">

<label for="圧力"> 圧力</label>
<input type="text" value="101300" id="圧力">

<label for="湿度"> 湿度</label>
<input type="text" value="0.60" id="湿度">

<input type="button" value="実行" onclick="draw()"/> </form>

<canvas id="canvas" width="1500 " height="500">
ブラウザが対応しておりません。
</canvas>

</body> </html>

試したこと

ここに問題に対して試したことを記載してください。
当たった瞬間の判定をするためにif文を用いたら誤差は減ったがうまくいかず、
時間増分の値を小さくすると誤差は減った。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/08/29 00:06

プログラムコード(およびエラーメッセージ)は質問内容としては最も重要な部分であるため、見やすくしていただけると助かります。<code>ボタン押下→「コード」部分にコードを貼り付け→「ここに言語を入力」に対象言語名記入(エラーメッセージの場合は不要)の手順で「コードハイライト化」してください。(質問編集画面ではリアルタイムでプレビューが表示されるので見ながら調整してください)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問