Skip to content

Instantly share code, notes, and snippets.

@ochaochaocha3
Last active February 14, 2020 16:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ochaochaocha3/ce00f48590fe9b8f7ef18c1916ba5f3b to your computer and use it in GitHub Desktop.
Save ochaochaocha3/ce00f48590fe9b8f7ef18c1916ba5f3b to your computer and use it in GitHub Desktop.
2点を通る対称な形の放物線の求め方
.ipynb_checkpoints
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 2点を通る対称な形の放物線\n",
"\n",
"2020-02-15 ocha\n",
"\n",
"射出角度が $\\theta$ であり、点A$(0, 0)$と点B$(u, v)$を通る、対称な形の放物線を求めてみます。ここでは単純に考えるために、$u > 0$、$v > 0$ であり、求める放物線は2点A、Bを結ぶ直線より上側にあると仮定します。例えば、以下のような放物線です($u = 40$、$v = 20$、$\\theta = 60^\\circ$):\n",
"![2点を通る対称な形の放物線の例](./curve2_start_end.png)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 方針\n",
"\n",
"線分ABの長さを $l = \\sqrt{u^2 + v^2}$(三平方の定理)とおき、また線分ABとx軸との間の角度を $\\phi$ とおきます。このとき、求める放物線は、(1)射出角度が $\\theta - \\phi$で、x軸上の2点A'$(0, 0)$ とB'$(l, 0)$ を通る対称な形の放物線を、(2)原点の周りに反時計回りに $\\phi$ だけ回転したものです。最初から斜めになった放物線を求めるのは難しいので、(1)、(2)の2段階に分けて求めます。\n",
"\n",
"なお、$\\phi$ について、$\\displaystyle \\tan \\phi = \\frac{v}{u}$ が成り立ちますが、$\\phi$ は一般にコンピュータを使わないと求められません。Pythonでは `math.atan2(v, u)`(ラジアン単位)で求めることができます。"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"26.56505117707799\n"
]
}
],
"source": [
"import math\n",
"\n",
"# 例:u = 40、v = 20のとき\n",
"u = 40\n",
"v = 20\n",
"phi = math.atan2(v, u)\n",
"\n",
"# 度単位に直して出力する\n",
"print(math.degrees(phi))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## (1)x軸上の2点を通る対称な形の放物線\n",
"\n",
"x軸上の2点A'$(0, 0)$ とB'$(l, 0)$ を通る放物線の式は、係数 $a$ を使って \\\\[ y = ax(x - l) = ax^2 - alx \\\\] と書けます。\n",
"\n",
"射出角度が $\\theta - \\phi$ であるという条件から、この放物線の $x = 0$ における接線の傾きは $\\tan (\\theta - \\phi)$ です。接線の傾きを求めるには、$y$ を $x$ で微分します。 \\\\[ y' = 2ax - al \\\\] $x = 0$、$y' = \\tan (\\theta - \\phi)$ を代入すると \\\\[ \\tan (\\theta - \\phi) = 2a \\cdot 0 -al = -al \\quad \\therefore \\ a = -\\frac{\\tan (\\theta - \\phi)}{l} \\\\] となります。\n",
"\n",
"したがって、放物線の式は \\\\[ y = -\\frac{\\tan (\\theta - \\phi)}{l} x(x - l) \\\\] です。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 例(1-1)\n",
"\n",
"$u = 40$、$v = 20$、$\\displaystyle \\theta = 60^\\circ$ の場合、$l = \\sqrt{40^2 + 20^2} = 20 \\sqrt{5} \\ (\\approx 44.7)$ であり、放物線の式は \\\\[ y = -\\frac{\\tan (60^\\circ - \\phi)}{20 \\sqrt{5}} x(x - 20 \\sqrt{5}) \\\\] です。グラフを描くと、以下のようになります。"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline\n",
"\n",
"# 点B(u, v)の座標\n",
"u = 40\n",
"v = 20\n",
"# 射出角度(ラジアン単位)\n",
"theta = math.radians(60)\n",
"\n",
"# 線分ABの長さ\n",
"l = math.sqrt(u**2 + v**2)\n",
"# 線分ABとx軸との間の角度\n",
"phi = math.atan2(v, u)\n",
"\n",
"# 放物線の点のy座標を求める関数\n",
"def parabola(x, l, theta, phi):\n",
" return -math.tan(theta - phi) * x * (x - l) / l\n",
"\n",
"# x軸上の点を細かく(0からlまで、0.1ずつ)とる\n",
"x = np.arange(0, l, 0.1)\n",
"# 放物線の点のy座標\n",
"y = parabola(x, l, theta, phi)\n",
"\n",
"# 点A'と点B'\n",
"plt.scatter([0, l], [0, 0], marker = \"o\")\n",
"# 2点A'B'を結ぶ線分\n",
"plt.plot([0, l], [0, 0], linestyle = \"dashed\")\n",
"# 放物線\n",
"plt.plot(x, y)\n",
"\n",
"# x軸の範囲\n",
"x_range = (-1, 46)\n",
"plt.xlim(x_range)\n",
"# y軸の範囲\n",
"y_range = (-1, 30)\n",
"plt.ylim(y_range)\n",
"\n",
"# 軸ラベル\n",
"plt.xlabel(\"x\")\n",
"plt.ylabel(\"y\")\n",
"\n",
"# x軸の目盛り\n",
"x_ticks = np.arange(0, 50, 5)\n",
"plt.xticks(x_ticks)\n",
"# y軸の目盛り\n",
"y_ticks = np.arange(0, 35, 5)\n",
"plt.yticks(y_ticks)\n",
"\n",
"plt.grid()\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"この対称な形の放物線の場合、放物線上の点をx軸方向に等速度で動かすと、自然な動きになります。点のx座標は0から $l$ まで動きます。この区間を等間隔で $N$ 個に分けてみると、$i = 0, 1, \\dots, N$($N + 1$ 個)として、x座標 $x_i$ は $x_i = \\displaystyle \\frac{il}{N}$ と書けます。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 例(1-2)\n",
"\n",
"上記の例($u = 40$、$v = 20$、$\\displaystyle \\theta = 60^\\circ$)で、区間の数 $N$ を20とすると、以下のように放物線上の点をとることになります。"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# 区間数\n",
"n = 20\n",
"# x軸方向に等間隔な放物線上の点のx座標(n + 1個)\n",
"x_p = np.linspace(0, l, n + 1)\n",
"# x軸方向に等間隔な放物線上の点のy座標\n",
"y_p = parabola(x_p, l, theta, phi)\n",
"\n",
"# x軸方向に等間隔な放物線上の点\n",
"plt.scatter(x_p, y_p, marker = \"o\")\n",
"# 2点A'B'を結ぶ線分\n",
"plt.plot([0, l], [0, 0], linestyle = \"dashed\")\n",
"# 放物線\n",
"plt.plot(x, y)\n",
"\n",
"plt.xlim(x_range)\n",
"plt.ylim(y_range)\n",
"plt.xlabel(\"x\")\n",
"plt.ylabel(\"y\")\n",
"\n",
"plt.xticks(x_ticks)\n",
"plt.yticks(y_ticks)\n",
"plt.grid()\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## (2)放物線の回転\n",
"\n",
"(1)で求めた放物線上の点を反時計回りに $\\phi$ だけ回転させることで、斜めに傾いた放物線を求めることができます。\n",
"\n",
"ある点 $(x, y)$ を反時計回りに $\\phi$ だけ回転させると、その座標が $(X, Y) = [(\\cos \\phi) x - (\\sin \\phi) y, (\\sin \\phi) x + (\\cos \\phi) y]$ になることが知られています(この関係は、複素数平面または行列の単元で導出されます)。この関係を使って、先ほど求めた放物線上の点を回転させてみましょう。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 例(2-1)\n",
"\n",
"上記の例($u = 40$、$v = 20$、$\\displaystyle \\theta = 60^\\circ$)で、座標を計算した点(放物線、および放物線上の21個の点)を、反時計回りに $\\phi$ だけ回転させてみます。"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# 点を反時計回りにphi(ラジアン単位)だけ回転させて得られた点の座標を返す関数\n",
"def rotate_point(x, y, phi):\n",
" x_rotated = math.cos(phi) * x - math.sin(phi) * y\n",
" y_rotated = math.sin(phi) * x + math.cos(phi) * y\n",
" \n",
" return x_rotated, y_rotated\n",
"\n",
"# 放物線を回転させる\n",
"x_rotated, y_rotated = rotate_point(x, y, phi)\n",
"# 放物線上に等間隔にとった点を回転させる\n",
"x_p_rotated, y_p_rotated = rotate_point(x_p, y_p, phi)\n",
"\n",
"# 点A→点B方向に等間隔な放物線上の点\n",
"plt.scatter(x_p_rotated, y_p_rotated, marker = \"o\")\n",
"# 2点ABを結ぶ線分\n",
"plt.plot([0, u], [0, v], linestyle = \"dashed\")\n",
"# 放物線\n",
"plt.plot(x_rotated, y_rotated)\n",
"\n",
"plt.xlim(x_range)\n",
"plt.ylim(y_range)\n",
"plt.xlabel(\"x\")\n",
"plt.ylabel(\"y\")\n",
"\n",
"plt.xticks(x_ticks)\n",
"plt.yticks(y_ticks)\n",
"plt.grid()\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"これが、冒頭の図で示した、点A$(0, 0)$ と点B$(40, 20)$ を通る対称な形の放物線です。"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.7.6"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment