鞋拋網頁製作

鞋拋網頁製作

Sat Jun 24 2023
878 words · 6 minutes
Daily No tags assigned

Github連結

Part 1. 不考慮空氣阻力

初始物理量

  • 重力加速度 (g)(g)
  • 初速度 (v0v_0)
  • 投擲角度 (θ\theta)
  • 起始位置 (x0x_0, y0y_0)

公式

  1. 水平方向速度: vxv_x 0_0 =v0=v_0 cosθ\cos\theta
  2. 垂直方向速度: vyv_y 0_0 =v0=v_0 sinθ\sin\theta
  3. 飛行時間: 2vy0g\frac{2 vy_0}{g} == 2v0sinθg\frac{2 v_0\sin\theta}{g}
  4. 水平位置隨時間的變化: x\ x == x0+vxx_0+v_x 0_0 ×\times tt
  5. 鉛直位置隨時間的變化:
  • 當投擲角度介於0~90度時: y\ y == y0y_0 +vy+v_y 0×t_0 \times t - 12\cfrac{1}{2} gt2gt^2
  • 當投擲角度介於0~-90度時: y\ y == y0y_0 +vy+v_y 0×t_0 \times t ++ 12\cfrac{1}{2} gt2gt^2

HTML & Javascript 雛形

HTML

輸入值:

  • 重力加速度 (g)(g)
<div>
<label for="Gravity">Gravity :</label>
<input type="number" id="Gravity" step="9.8" min="0">
</div>
<div>
  • 初速度 (v0v_0)
<div>
<label for="initial-velocity">Initial Velocity: <select id="velocity-unit">
<option value="m/s"> m/s</option>
<option value="km/h"> km/h</option>
<option value="mph"> mph</option></label>//便於切換單位
<input type="number" id="initial-velocity" step="0.1" min="0">
</div>
  • 投擲角度 (θ\theta)
<div>
<label for="launch-angle">Launch Angle (deg):</label>
<input type="number" id="launch-angle" step="1" min="0" max="360">
</div>
  • 起始位置 (x0x_0, y0y_0)
<div>
<label for="initial-position">Initial Position (x0):</label>
<input type="number" id="initial-position" step="0.1" min="0">
</div>
<div>
<label for="initial-height">Initial Height (y0):</label>
<input type="number" id="initial-height" step="0.1" min="0">
</div>

目前效果:

Javacript

  • 尋找元素值 (getElementById),與背景計算設定
document.getElementById('plot-button').addEventListener('click', function() {
var v0 = parseFloat(document.getElementById('initial-velocity').value);
const gravity = parseFloat(document.getElementById('Gravity').value);//因為重力所以用const
var pi = 3.14159265359;//問就是js內建是用rad
...等等等等~
  • deg轉rad
var ?? = ?? * Math.cos(theta * pi / 180.0);~~~
...等等等等~
  • 帶入物理公式~~~
  • 推入每個時間點~~~

plotly.js

  • 我覺得很像 python的matplotlib as plt??
  • 推入資料
var x_data = [];
var y_data = [];
x_data.push(x);
y_data.push(y);
//帶入導完後的物理公式。要push對東西
//其實中間省略一大堆ㄡ

目前效果:

CSS美化後

Poltly.js vs Python Matplotlib

參數值:

  • initial_velocity = 50
  • velocity_unit = ‘m/s’
  • launch_angle = 39
  • gravity = 9.8
  • initial_position = 20
  • initial_height = 10

1. Plotly.js 2. Python Matplotlib

Part 2. 考慮空氣阻力,但不探究物體旋轉

初始物理量

  • 重力加速度(g)(g)
  • 初速度 (v0v_0)
  • 投擲角度 (θ\theta)
  • 起始位置 (x0x_0, y0y_0)
  • 質量 (kg)(kg)
  • 受阻面積 (m2)(m^2)
  • 空氣密度 (kgm3)(\frac{kg}{m^3})
  • 阻力係數 (Cd,Cx)(C_d,C_x)

公式

  1. 水平方向速度: vxv_x 0_0 =v0=v_0 cosθ\cos\theta
  2. 垂直方向速度: vyv_y 0_0 =v0=v_0 sinθ\sin\theta
  3. 飛行時間: 2vy0g\frac{2 vy_0}{g} == 2v0sinθg\frac{2 v_0\sin\theta}{g} ,, 2vy0+4vy02+8gy02g\frac{2 \cdot vy_0 + \sqrt{4 \cdot vy_0^2 + 8 \cdot g \cdot y_0}}{2 \cdot g}
  4. 水平位置隨時間的變化:Δx\Delta x == x0+vxx_0+v_x 0_0 ×\times tt
  5. 鉛直位置隨時間的變化:
  • 當投擲角度介於0~90度時:Δy\Delta y == y0y_0 +vy+v_y 0×t_0 \times t - 12\cfrac{1}{2} gt2gt^2
  • 當投擲角度介於0~-90度時:Δy\Delta y == y0y_0 +vy+v_y 0×t_0 \times t ++ 12\cfrac{1}{2} gt2gt^2
  1. 阻力公式:FD=F_D= 12\frac{1}{2} pv2CdApv^2C_dA
  • p:p: 空氣密度(kgm3\frac{kg}{m^3})
  • A:A: 接觸面積(m2m^2)
  • Cd:C_d: 阻力係數
  1. 水平方向阻力:Fx=FDvx0vx02+vy02Fx = \frac{F_D v_x0}{\sqrt{vx0^2 + vy0^2}}
  2. 垂直方向阻力:Fy=FDvy0vx02+vy02Fy = \frac{F_D v_y0}{\sqrt{vx0^2 + vy0^2}}
  3. 水平方向阻力加速度:ax=a_x= Fxm\frac{F_x}{m} == FDvx0vx02+vy02m\frac{\frac{F_D v_x0}{\sqrt{vx0^2 + vy0^2}}}{m}
  4. 垂直方向阻力加速度:ay=a_y= Fymg\frac{F_y}{m}-g == FDvy0vx02+vy02mg\frac{\frac{F_D v_y0}{\sqrt{vx0^2 + vy0^2}}}{m}-g

HTML & Javascript 雛形

HTML

輸入值:

  • 重力加速度(g)(g)
<div>
<label for="Gravity">Gravity :</label>
<input type="number" id="Gravity" step="9.8" min="0">
</div>
<div>
  • 初速度 (v0v_0)
<div>
<label for="initial-velocity">Initial Velocity: <select id="velocity-unit">
<option value="m/s"> m/s</option>
<option value="km/h"> km/h</option>
<option value="mph"> mph</option></label>//便於切換單位
<input type="number" id="initial-velocity" step="0.1" min="0">
</div>
  • 投擲角度 (θ\theta)
<div>
<label for="launch-angle">Launch Angle (deg):</label>
<input type="number" id="launch-angle" step="1" min="0" max="360">
</div>
  • 起始位置 (x0x_0, y0y_0)
<div>
<label for="initial-position">Initial Position (x0):</label>
<input type="number" id="initial-position" step="0.1" min="0">
</div>
<div>
<label for="initial-height">Initial Height (y0):</label>
<input type="number" id="initial-height" step="0.1" min="0">
</div>
  • 質量 (kg)(kg)
<div>
<label for="mass">Object Mass (kg):</label>
<input type="number" id="mass" step="0.1" min="0">
</div>
  • 受阻面積 (m2)(m^2)
<div>
<label for="cross-sectional-area">Contact area (m^2):</label>
<input type="number" id="cross-sectional-area" step="0.01" min="0">
</div>
  • 空氣密度 (kgm3)(\frac{kg}{m^3})
<div>
<label for="air-density">Air Density (kg/m^3):</label>
<input type="number" id="air-density" step="0.001" min="0">
</div>
  • 阻力係數 (Cd,Cx)(C_d,C_x)
<div>
<label for="drag-coefficient">Drag Coefficient (Cd):</label>
<input type="number" id="drag-coefficient" step="0.01" min="0">
</div>

目前效果:

Javacript

  • 尋找元素值 (getElementById),與背景計算設定
document.getElementById('plot-button').addEventListener('click', function() {
var v0 = parseFloat(document.getElementById('initial-velocity').value);
const gravity = parseFloat(document.getElementById('Gravity').value);//因為重力所以用const
var pi = 3.14159265359;//問就是js內建是用rad
...等等等等~
  • deg轉rad
var ?? = ?? * Math.cos(theta * pi / 180.0);~~~
...等等等等~
  • 帶入更多物理公式~~~
  • 推入每個時間點~~~

其他都跟上面的一樣~~~~


Thanks for reading!

鞋拋網頁製作

Sat Jun 24 2023
878 words · 6 minutes
Daily No tags assigned

© I-Hung Wu | CC BY-NC-SA 4.0