Skip to content

Instantly share code, notes, and snippets.

@Hasenpfote
Created January 22, 2018 01:24
Show Gist options
  • Save Hasenpfote/3e6b5605e56c4788d7ef46d2173ca20a to your computer and use it in GitHub Desktop.
Save Hasenpfote/3e6b5605e56c4788d7ef46d2173ca20a to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"** 曲線の接線、法線ベクトル **\n",
"Tangent: $T=\\frac{\\dot{r}}{\\|\\dot{r}\\|}$ \n",
"Normal: $N=\\frac{\\dot{T}}{\\|\\dot{T}\\|}$ \n",
"Binormal: $T\\times N$ \n",
"Curvature: $k=\\|\\dot{r}\\|$ \n",
"Torsion $t=-\\dot{B}\\cdot N$ \n",
"\n",
"see also: [Frenet–Serret formulas](https://ja.wikipedia.org/wiki/%E3%83%95%E3%83%AC%E3%83%8D%E3%83%BB%E3%82%BB%E3%83%AC%E3%81%AE%E5%85%AC%E5%BC%8F)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import numpy as np\n",
"import sympy as sym\n",
"import matplotlib.pyplot as plt\n",
"\n",
"sym.init_printing()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
" ** その1 **"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"t = sym.symbols('t')\n",
"\n",
"# r\n",
"rx = t\n",
"ry = sym.cos(t)\n",
"\n",
"# r'\n",
"p_rx = rx.diff(t)\n",
"p_ry = ry.diff(t)\n",
"# |r'|\n",
"p_rl = sym.sqrt(p_rx**2 + p_ry**2)\n",
"\n",
"# t = r' / |r'|\n",
"tx = p_rx / p_rl\n",
"ty = p_ry / p_rl\n",
"\n",
"# t'\n",
"p_tx = tx.diff(t)\n",
"p_ty = ty.diff(t)\n",
"# |t'|\n",
"p_tl = sym.sqrt(p_tx**2 + p_ty**2) \n",
"\n",
"# n = t' / |t'|\n",
"nx = p_tx / p_tl\n",
"ny = p_ty / p_tl\n",
"\n",
"np_r = sym.lambdify(t, [rx, ry], modules='numpy')\n",
"np_tangent = sym.lambdify(t, [tx, ty], modules='numpy')\n",
"np_normal = sym.lambdify(t, [nx, ny], modules='numpy')"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYAAAACNCAYAAAC+Lq3VAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XlcVFX/wPHPGXYUdwHFBdxwS81wyzX33cxdy6UnzTXT\nLNNKfVL7VS6VZW6Zmfq45JJGLrnhliYoiisuuGO4ILIIM8Cc3x8zIgioMDMMA+f9evFy5t4793xH\n9HzvPfcsQkqJoiiKkv9orB2AoiiKYh0qASiKouRTKgEoiqLkUyoBKIqi5FMqASiKouRTKgEoiqLk\nUyoBKIqi5FMqASiKouRTKgEoiqLkU/bWDuBZSpQoIb29va0dhqIois04duzYPSllyRc5NlcnAG9v\nb4KCgsx3Qp0O/vc/aNcOSpUy33kVRVFyCSHEtRc91ixNQEKIn4UQd4QQpzPZL4QQ84QQl4QQIUKI\nuuYoNyMREas4fNibgAANhw97ExGx6slOR0fYvx9Kl4Z69eDzz+H4cVDzISmKkg8Jc0wGJ4RoBsQC\nv0opa2awvyMwBugINAC+k1I2eN55/fz8ZFbuACIiVhEaOgy9/lHKNo1wwddrLh5Feho2XL4MjRql\nrfS9vKBzZ+jSBVq2BBeXFy5TURTlmeLi4Nw5OHsWzpyBatVg0CAQwiLFCSGOSSn9XuhYc80GKoTw\nBvwzSQCLgAAp5Wrj+1CghZTy9rPOmdUEcPiwN1pt+ruf5H8huR/UAdyfdxIXF2jTxpAMOnVSTUWK\noryY2Fg4f95QyT+u7M+cgatXnxzz9tuwaBHSzo7k5GTs7e2Jiopix44dPHjwgKioKB48eMBHH31E\n8eLFsxVGVhJATj0D8AJupHp/07gtXQIQQgwDhgGUK1cuS4Votdcz3C7coR2wDugFHAM+BV5O9VMB\nY3tYfDz8+SdER0NMDLzzDri5ZSkORVHykSVL4Isv0lb0qeiBS0Bw584ElyhBcKdOBAcHM3XqVEaN\nGkV4eDh9+/ZNOd7R0ZFBgwZlOwFkRa57CCylXAwsBsMdQFY+6+RULsM7AHttIQ6+N5gq7u6g0RA1\neTLhwC4gyXhMcSHY3a4dtQcOhPbtoWhRE7+Joij5wjvvwMOH8PHHkJwMQBxwB/Axvq4qBNLfH4cd\nO6hZsyZdunShWrVqAFSsWJEzZ85QtGhRihQpgksONkHnVAK4BZRN9b6McZtZVagwk9PnhmBHYso2\njcYV37o/4tFhgGHDN9/QCjgJJFSqxJmGDQn29ORgRAS+ixeDszNffvklgYGBvP7663Tu3JmiKhko\nipKZu3fh7l3uOTjwR3Iym4CdQBNgpxC4LVzImiJFqFKlCtWrV8fR0THNx52cnKhevbo1Is+xBLAF\nGC2EWIPhIfDD57X/Z4eHxwD+CP2Dgo/W4u4Ezs5lqVjh//DwMFb+Oh0EBsKcOdC5M85VqvAK8Arw\nTqrzaDQajhw5wsaNG3FwcKBPnz6MHTsWP78XalZTFCUPiohYRVjYJ2i113FyKkeFoh/isfgyLFzI\nx/HxzAaSgXIY2rB72NkZup337k1v64aeKXP1AloNtABKABHAVMABQEq5UAghgB+A9sAjYIiU8rlP\nd7P6EBjg60NfM3HXRABiJsVQ0LFglj7/mF6vJygoiJUrV7Js2TJatmzJ5s2bU/ZpNGoQtaLkFxn1\nMNQnQMXZUH43LAdCSpVigLs7L588iXB1hY0bDWOOcliOPwSWUvZ7zn4JjDJHWTlFo9FQv3596tev\nz/Tp04mKigLg8uXLtGrViuHDhzNixAgKFy5s5UgVRbG0sLBP0lT+ABpnuPgOlE9sxqApUwxdyEeM\ngGvXYOtWQ3fzXC7PXMZ+d+Q77sTdSbc94GoAOy/vNOnchQsXpnz58gDExcVRqVIlJk2aRMWKFZk3\nbx46nc6k8yuKkrtl1sPQ3kPAvn3QqpWhX7+np2GwqQ1U/pCHEsC5e+fw+c6HVaeejPxtu6Itry1/\nDc+CnmYrp1atWuzatYugoCBq167N2LFjqV27Njqd7tmjkBVFsVlOTmUz3u78VFf1zz6Dl17KgYjM\nI88kgC5VuvAo8REhESEp2w7fPEz5wuWp6Z5ubJrJXnnlFXbt2sW2bdsYNmwYDx78RmjoMGM3VIlW\ne43Q0GEqCSiKDZJSsn37dpo0aUJERAQVKnyBRpO2e6ZOr6FChZlpP2hnl4NRmi7PJICWPi1xsU/f\nf7ZLlS4Iyw25pn379owbNy7DNkK9/hFhYZ882ZCUZBgWrihKrnX9+nU6d+5Mhw4dCA8P5/r163h4\nDMDXdwlOTuWREv5NgK/P6wnTVbB2uCbJMwnAxcGFNhXbpNvexbdLjpSfWRuhNuEaJCQY3ty7Bz17\nQmJihscqimI9Ukp+/PFHatSoQUBAAHPmzOH8+fPUq1cPMHQzb9ToKpXqXmdgoAO778L0/dMBiNHG\nsCtslzXDz5Y8kwAAOlfunOZ9QceCNC/fPEfKjk12zXB7dARQs6ahV8D9+7B9OwwZAnp9jsSlKMqL\nEUJw6NAhGjVqxJkzZxg/fny6QVsAZQuX5e2X3wZg26VtBN4KZOgfQ9l8fnNOh2yyvJUAqqRNAG0r\ntsXJ3sni5R68fpBvQ+NISE67Xa8F3U/A5cvITp1I7t/fsGPVKhg/Xk1DrShWlpiYyJdffsmpU6cA\n+Omnn9ixYwfPW4jq4yYfY68x9KJ/fe3rrD2zlrP3zlo6XLPLUwmglFsp/Eo/Gf/QpYrlmn+WHFtC\nsj6ZJH0So7aOYvdd+PaiHXYOpQGBk1N5atRcTs9Oc8HNjZ+A5iEhpDQUffcdfPmlxeJTFOXZLl26\nRKNGjZg0aRK//fYbAC4uLs98ZhgRG8G0gGmsOLmCcoUNPYDCY8IBOHPnjOWDNrNcNxmcqbpU6UJQ\neBACQcfKHS1Wztd/f02sLhZ7jX1Kz6OGVT+laeNpaQ8cB/TpQ+GXXybkzh3qAD8DrwNMngwlSxom\nk1IUJcesXr2ad999F3t7e9avX0+PHj1e6HMeBT1w0Djw6d5P0+2LiIvg/qP7FHe1/Cye5pKn7gDg\nSTNQgzINcC/w3Nn/s+Vm9E0uRV7i072fpvxD8Cniw8TGE9MfHBoKffvS+84dgjFMO90deA/QArz7\nLmzaZJE4FUVJb82aNfTv359atWpx4sSJF678H5vcdDLjG47PcN/Zu7bVDJTnEsDLni/j5eZl0eaf\ngKsBADxKfES0NhqAN6q9wbl757jx8Ebag6OjoW1baNmSis7OHALexzAx0kEwPAzu188wmlBRFMvQ\n60k6dAiA7t27M2/ePAICArK85ggYHhbPbjubwXUGp9t35q5tNQPluQQghKBzlc4WTQB7r+xNt23O\n4Tk0+KlBSnJIUa8efPop7N4NUVE47dvHN9OmcdrPj1bGHgahWi107QonTlgsZkXJl5KTYfVqlpYt\nS50+fYiKisLJyYkxY8Zgb5/9FnAhBEu6LOH1qq+n2a7uAHKBkfVGWmT072MB1wLSbXOxd2Fz3828\nVfutzD/o5ATNmsHUqVQPDISoKIIXLaKmRsMHbm4kde1qWLNYURTT6HTw88/ofH0Z3r8/74SHU6pa\nNbPO22WvsWd1j9W85v1ayjZ1B5AL1PKoZbHRv9cfXifsQViabUWdi7J74O6sP3R2caHmkCGMGDWK\nubdu0dnXN2XWUUVRsiE+HubPh0qVuPuf/9Dm8mUWAR+//Tbbt2/H3d28zwWd7Z3Z3HdzSu9DdQeQ\nxz3d/OPl5sWBIQdoVDZ7s/85ODgwb948Fi9ezJ59+2jQvz+hoaHmCFVR8o/YWJg9G3x8YPRouHGD\nscBRYFW7dvzf0qXYWWieHjcnN7YN2EbVElX5N/ZfIuMjLVKOJZglAQgh2gshQoUQl4QQH2ewv4UQ\n4qEQ4oTxZ4o5yrWG1M0/VYpX4dDbh6jhXsPk8w4dOpTdu3cTGRnJxo0bTT6fouQLDx7A559D+fLw\n4YcQEZGyzve3wIGiRem/Zo3FwyjhWoK/3vyLsoXK2tRdgMnjAIQQdsB8oA1wEwgUQmyRUj79t3BA\nStk53QlszOM7AL/Sfmztv5WSBUqa7dxNmzbl1KlTKbep169fp2zZshZrzlIUm3fmDJw+DTEx6IHp\nGHrXbQXcAfdvvoEiRXIklLKFy7LzrZ02lQDMcQdQH7gkpQyTUuqANUA3M5w317ny4ArXHl6jdYXW\n7Bm4x6yV/2Oenp5oNBpu375N3bp1GT58OElJSc//oKLkR02awJo16Pr0YSAwDSgN6AFefRXeekan\nDAvwLeFLt6q2U/2ZIwF4Aak7v980bnvaq0KIECHENiFEpm0mQohhQoggIUTQ3bt3zRCe+QRcDaB3\njd749/PHzcnNomV5enoybNgwFi9eTPfu3YlT00grSno6HQ979qTDypWsAmYAvwBOGo3hYbAV1u7W\nCNt5tJpTkR4HykkpawHfA79ndqCUcrGU0k9K6VeypPmvsE1RqVgl/vfG/3JkgjkhBF988QU//vgj\nW7dupWXLlty5k37JS0XJt2JjoXNn+m3axH5gealSfPL55wgwrM1bp46VA8z9zJEAbgGp10srY9yW\nQkoZLaWMNb7eCjgIIUqYoewc1bR8U+w0Obviz4gRI9i4cSMhISFMnz49R8tWlNwmzbKrO4sTod/J\nl8BWX18GhoTA0KHg7g7q/8oLMcdkcIFAZSGED4aKvy/QP/UBQghPIEJKKYUQ9TEknvtmKDtf6Nat\nG4cOHaJq1aqAYeEK9WBYyW8iIlYRGjosZeU9bVEdoRPA96Wa1Jp+GAoWNBz4++9QtKgVI7UdJt8B\nSCmTgNHADuAcsE5KeUYIMVwIMdx4WE/gtBDiJDAP6Culmgw/K+rWrYurqysPHz6kcePGbN261doh\nKUqOynDZVWcI6x39pPIHaJS9MTn5kVmmgzY262x9atvCVK9/wDD/mWIirVaLVqulW7durFy5kj59\n+lg7JEXJEZkuu6q9keF25fls53G1AoC7uzt79uyhUaNG9OvXjyVLllg7JEXJETpdxv35kzVp599X\njQsvTiUAG1S4cGG2b99O+/btGTZsGEuXLrV2SIpicTrdIBIT03bCSEiGWWcfsOfKHgCuRV3jlxO/\nWCE626QSgI1ydXXl999/Z+zYsbRt2zZt74jD3kRErLJ2iIpiMr1eT1BQEACdO39DrVrLcXIqDwj0\ndu7MvSjYEZFMtzXdOBZ+jOUnlzPzwEyS9Grw5IsQufl2yc/PTz7+5SuZe7p3BIBG44qv72I8PAZY\nMTJFyb6kpCSGDh3KihUrOHHiBDVrpp/i/X+n/seAjYZ/4yVdS+Jo58itmFusemMV/V/qn+74/EAI\ncUxK6ff8I9UdQJ6QYe8I/SPCwj6xUkSKYhqdTke/fv345ZdfmDJlCjVqZDx5QP+X+vNd++8AuPvo\nLrdiDEOQvjjwBXqpz7F4bZVKAHlAgvZahtsz6zWhKLmZVqulV69erF+/nrlz5zJlypQMx73oknXs\nubKHGw9v4Orgmmbfmbtn2Hx+c06FbLNUArAxcbo44hPjU95/d+Q7IhIyPtYpofCTNxcuQKTtzFOu\n5F+rV69my5YtzJ8/n3HjxmV6XJwujg1nNzD3yFweJT5Kt3/mgZmqR9BzqARgY+YHzsf/gj8AS44t\n4f0d7/NTmKE3RGoJCaCZHQXTpoGUsHq1Gh6v2IRBgwZx+PBhRo4c+czjiroUZX6n+QQNDaJRmfSD\nv47dPsZfl/+yVJh5gkoANiRGG8PXh75m1alVrAxZybv+7wIQGF2Iwl7TU3pHOGlKUX5hARrsBv77\nX/QffmgYHv/DD4Y7AUXJZWJiYujVqxfnzp1DCEHDhg1f+LMvl3qZg28fZFm3ZZR0TTuB5IwDM8wd\nap6iegHZkBn7Z/DZ3s+w19gjpSRZJlPAoQB/vfUXr5Z9Ne3B589Dq1YsDg9nPYbpV10BunaFzapt\nVMk9oqOj6dChA//88w9r166lR48e2T5XVEIUU/ZOYX7g/JSHwPsG76NZ+WbmCjfXU72A8qCohCjm\nHJ4DQJI+iWSZjJOdE3/0+yN95Q9QtSoEBODs7MxuoBMQB7BlC+zZk4ORK0rmoqKiaNOmDUePHjW5\n8gco4lyEeR3mcXzYcZqUawIYLpyUjKkEYCPmHp5LVEJUmm3aZC0f7vyQ6fumcycu1VoBMTEwfjw0\nbcrAhARWAvuBjkAsGPYlP/XQQFFyWFRUFG3btiU4OJgNGzaYXPmnVtuzNvsH7+fX138lJCKEwFuB\nZjt3XqISgA24/+g+3x75NsN99x7do0rxKmnbPt3cYMgQw5J4QD9gFYa1UjsCiSdPwi+/WDhqRXk2\nBwcHihUrxoYNG+jatavZzy+E4K3abxE6OjTdxZNioJ4B2ICPd33MV4e+SrOtoGNBJjeZzPsN38fF\nwSXzDx8/DlOngr8/azGs3TkBwMMDLl40JAtFyUEPHjzAzs6OQoUKqbUtLEA9A8hDImIj+P7o9ynv\nBYJ3Xn6Hi2MuMqnppGdX/gB168Iff8CRI/Rp29ZQ+QMnIiKI+e9/LRe4omQgMjKS1q1b061bN1X5\n5wJmSQBCiPZCiFAhxCUhxMcZ7BdCiHnG/SFCiLrmKDc/+OrQVymDXFr5tCL43WCWdF2CZ0HPrJ2o\nQQPYsQP27ye6SRNaA+3nziX69GnzB60oGXhc+Z8+fZoPP/xQVf65gMkJQAhhB8wHOgDVgX5CiOpP\nHdYBqGz8GQYsMLXc/CA8JpwFQQuoUrwKW/puYedbO6ntWdu0kzZtSqEDB1g0dSpHgfYtWhAdHW2W\neBXbte7MOo7eOmqx80dGRtK6eXPOnjnD5s2b6dixo8XKUl6cOe4A6gOXpJRhUkodsAbo9tQx3YBf\npcERoIgQopQZys7TFgYt5MtWX3JqxCm6+HYx6xVTj2nTWPvbbwRGRdG+dWuVBPK5ZuWb0XJ5S/pv\n6M/VqKvmPfn9+wyuX5+zZ87w+7p1tG/f3rznV7LNHAnAC8OzxcduGrdl9RjlKRMbT2Rsw7E42jla\n5Pxv9OjB2nXrCAwOZvbs2RYpQ7ENngU9GVN/DKtPr8b3B18+2vmR6T1noqPh88+hQgXmXr6M/8SJ\ntO/29LWhYk257iGwEGKYECJICBF09+5da4djVQUcC1i8jDfeeIOAgAA+/fRTi5el5G4fNv6QQk6F\n0CXrmPX3LCrOq8i8f+ahS9Zl7UTx8TBnDve9vfl66lRkdDSVXnmF1jNnWiZwJdvMkQBuAWVTvS9j\n3JbVYwCQUi6WUvpJKf1KliyZ0SGKmTVu3BhHR0fu3LnD22+/rZqD8qliLsX48NUPU95HxkcydvtY\navxYg43nNj5/Zs3ERFi4ECpV4v6ECbR68IApwFmA2bNBk+uuN/M9c/xGAoHKQggfIYQj0BfY8tQx\nW4CBxt5ADYGHUsrbZihbMaPg4GBWrFhBu3btciQJJCRlMo+1YjVjG4xNN6HapchL9FjXg6bLmvLP\nzX/Sfyg5GVasMEw/MmIE98PDaQWcBzYDNbp2hRYtciB6JatMTgBSyiRgNLADOAesk1KeEUIMF0IM\nNx62FQgDLgFLgGfP86pYRbt27Vi3bh1BQUG0a9eOhw8fWqScGG0Mk3dPZselHRY5v5J9bk5uTGoy\nKcN9h24cYvifwzkWfuzJRr0epkyB//wHwsK4B2kq/3Z2dvDVVxmeT7E+NRJYSWfTpk307t2bunXr\nsmPHDooUKWKW8+qlnpUhK/l418cUdSlKyPAQ7DR2Zjm3Yj4JSQlU/r4yN6Nvptn+c9efGfLykIw/\nFBkJrVuzJziY7sA6oB3AqFGGaciVHKNGAism6d69O+vXryc+Pp74+Pjnf+AFHL11lFeXvsqg3wdx\nO/Y2U5pNUZV/LuVs78yUZlPSbR+zbQx/3/g7/Qf0ehI/+QSCg2kJXMVY+bu5GaYhUXItlQCUDHXr\n1o3jx49TqlQpkpKSiIrKXpfA2zG3Gfz7YBr81IB/bhnaj6uVqEbP6j3NGa5iZoPrDKZi0Yo4aBz4\npt03CARxiXF0WNUh7cyaej3/DhzIKwsXshrA25uinToZ9k2eDKojR65mb+0AlNzL3t7wz2Po0KGc\nOHGCnTt3UqJEiRf6rDZJy7dHvmXGgRnE6mLT7JvSXF3953YOdg58/trnrDm9hvcbvk8BhwIM8x9G\ntDaa6dua80HVIsikf7GPdmHxv48IA0p7ecH+/XDqFISEwNix1v4aynOoBKA8V9++fVm9ejUtW7Zk\n9+7dPKt7rpSSPy78wfgd47n84HK6/VVLVKVX9V6WDFcxk741+1K5WGUAhr4ylER9IhsDRzHSJx6Z\nZGgaTCr0iP4T4D/Fi9H8m6NQujS4u8O8eeDynIkKFatTTUDKc7Vr1w5/f38uXrzIa6+9RkRERKbH\nhkSEsPjYYm7FZDjMQ7X92xCN0FDPq17K+5H1RvJR9aI4P/Xrc3YGxzGuhsofwMkJXn89ByNVsksl\nAOWFtG7dmj///JOwsDC6dOmS6aCg2p618e/vz6+v/5puX9USVeldo7elQ1UsyJGMnwVpkzJO+Eru\nppqAlBfWsmVLduzY8dx53Pdd3cfA3wcChvULJIZk8Vmzz9TVv43TaEqh14en2+7kVM4K0SimUncA\nSpY0bdqUZs2aAbBkyRIuXLiQZn9QeBBdVnchISkBjdCwrtc6vNy88C3uS58afawRsmImISEhfPtt\nDFpt2uSv0bhSoYKa58cWqTsAJVuioqL49NNPEULg7z+OxMQFaLXXuaMV1C+sZ/ddw8ChntV7EhQe\nxEvuL6mrfxsWFBRE27ZtcXUtxGefTSEh4Qe02us4OZWjQoWZeHgMsHaISjaokcBKtp07d44pU17l\nP/+Jwtn5yfaEZLjj/BYDGxueA9yKvoVnQU+VAGzUwYMH6dixI8WLF2fPnj34+PhYOyTlGdRIYCVH\nVKtWjffec01T+QM420Flzf6U916FvFTlb8O+/fZbSpUqxYEDB1Tln8eoJiDFJMnJGU/qqtVez+FI\nFHNLSkrC3t6eFStWEBMTg7u7u7VDUsxM3QEoJsms94eTXaoVP3U6w5TBis1YtGgRr776KtHR0bi4\nuKjKP49SCUAxSYUKM9FoXNNsS0iA0K/uw8mThg179sCyZVaITskqKSXTp09n+PDhuLu7p0wHouRN\nKgEoJvHwGICv72KcnMoDAsf4QuybDUP+1DK5QQPkoUPg72+YGMxC6wso5qHX63nvvfeYMmUKAwcO\nZNOmTbi6uj7/g4rNMim9CyGKAWsBbwyzwPaWUj7I4LirQAyQDCS96BNqxTZ4eAxI0w2wQchXPNj9\nMf+n1XKneXMWFi6MfWSkYYHwOXOsGKnt0Es9GpGz12eTJ0/mhx9+4IMPPuDrr79Go5ZwzPNM/Q1/\nDOyWUlYGdhvfZ+Y1KWUdVfnnfXYTJ7Jg0SI+A5YmJ7M4MtKwY948CA21amy2Ysb+GcTp4nK0zBEj\nRvD9998ze/ZsVfnnE6b+lrsBy42vlwNqBigFoqIQwOelS7MFGGbcLJOSYNw4KwZmO3TJOpoua8qt\naMvOsXPt2jUmTZqEXq+nfPnyjB492qLlKbmLqQnAI9Xi7v8CHpkcJ4FdQohjQohhmRyj5AWJiTBj\nBowZA+HhdMHQzvgv0AwI2bYNtm7N8bD0Up/jZZqiU+VOBP8bTP2f6nP89nGLlBEYGEiDBg1YsGAB\nly5dskgZSu723AQghNglhDidwU+31MdJw5DizIYVN5FS1gE6AKOEEM2eUd4wIUSQECLo7t27Wfku\nSm7g4ACzZ8Ply4b1YB0dAbgHhAFNgG3Dhhm6huaQxOREvjpoWwuT1/eqT3GX4oTHhNN0WVM2n99s\n1vNv2LCB5s2b4+rqyuHDh6lSpYpZz6/YhucmACllayllzQx+NgMRQohSAMY/72RyjlvGP+8Am4D6\nzyhvsZTST0rp96yFR5RcrkwZw2Lgly/D6NHUdHTkKFAJ6HzrFj/27ZsjYeiSdfRZ34frD21rYJqd\nxo72ldoD8CjxEd3XdmfO33MynYY7K3744Qd69uxJnTp1OHLkCNWqVTP5nIptMrUJaAswyPh6EJDu\nMkUIUUAI4fb4NdAWOG1iuYqtKFMGvv8ewsLwGjOG/Y6OdAJGbdrEwq+/tmjRumQdvX/rzabzm6jv\nlek1R67VqXKnlNcSyYSdE3jX/10SkxNNOm+t6tV5q00bdn/xhRrglc+ZmgC+BNoIIS4CrY3vEUKU\nFkI8buj1AA4KIU4CR4E/pZTbTSxXsTVeXjBvHgXDwtg0ahQz7ezofeqUxYrTJmnpsa4Hm0MN1yS2\nmADaVWqXrivokuNL6LCqAw/i0/W2fqZbwcEsHTIEevakWffu/BoXh0vDhuYMV7FBajZQxTrCw2HW\nLHSDBjFg5kw++OADGpqpQkpISqDHuh5svWi4BinoWJCoiVE2OSFdk5+bcOjGoXTbq5aoin8/fyoW\nq5jxB/V6CAyErVvZt2YNvS9cIB64CHj4+MA//4BqYs2T1GygSu5XujR88w233Nw4duwYzZo1Y8GC\nBSa3cSckJdB9bfeUyh/Ar7SfRSr/f2P/Nbk55nlSNwM91qRcEzpW6sjhm4fT/n1FRcHatTBoEHh6\nIhs2ZM7nn9PqwgWKAkcAj0KFDCOzVeWvoBKAYmU+FSsSFBRE69atGTlyJIMHD+bRo0fZOld8Yjxd\nV3dl+6W0LYz1S1um+eevy3+lK8vcOlbumG6bg8aB2W1n82atN9MuzXniBEyfDr/+irx7l4HABAyD\nc44C1e3sYP16qF7dojErtkMlAMXqihUrhr+/P9OmTWPFihUMHjw4y+d4lPiIrmu6sjNsZ7p9lmr/\nP3T9EMtPLn/+gSao5VGLMoXKUK1ENQbXGQzA3qt7WRq8NP3BLVoYmn38/BBAU2AW8BtQCGD+fGjT\nxqLxKrZFTfWn5AoajYapU6dSr149ypcvD4BWq8XR0fGZC9ADxOni6LqmK3uu7Mlwv6USwMEbB7kU\neYnI+EiKuRSzSBlCCDpW6kjP6j2p51WPHZd2cDv2Nh/89QEdKnXAq5BXyrH6Y8f4tmtXSoWH048n\nI7ABGD+saHhZAAALRUlEQVQe3n3XIjEqtkvdASi5SseOHalRowZgmJumU6dO3L6d8aIzjwkhWNx5\nMSHDQ6haomqafZ4FPSlTqIzZ44yMj+Ts3bPoknWsOb3G7OdPbWqLqbSp2IYizkVY0GkBANHaaEZu\nHWl4BhAfz/WRI2nl58cH4eFsB6iY6uFw165g4S63im1SCUDJlaSUvPLKK+zdu5eXXnqJjRs3Znqs\nq4MrFYtV5Eb0Dc7fOw88ueqv71X/uXcQ2XH4xuGU15ZuBirtVjrldbeq3ehdozetSkK/IlsICNCw\ny78goy4sIAhYKgS/TJoEp0+DqyvUqQOrVoGd7fWAUixPJQAlVxJCMGrUKIKDg/Hx8aFHjx4MHjyY\nh5msKZCsT2birokAuDm64d/Pn8F1BlvsAfDB6wdTXh+9dTQl8eSE6fWaM8EXPJ1BCLAvqWfMBDg0\nsDRvHz+O+OILcHaGhg3hjz+gYMEci02xLSoBKLla1apV+fvvv/nss8/YvHkzcXEZT5H868lfOX3H\nMMB8YuOJlCxQku/af0cX3y4WievpvvnLT1j2LiC1++Ff4fzUBb2jM8QNtzdc8T/222+GkdiKkgk1\nEEyxGZGRkRQrVgwpJePHj2fw4MF4ep7mctgktAk3iNDChttFWP7mLVwdLLeSlS5ZR+EvC5OQlJCy\nzcvNi2vvX7P4YLOjR48SF9eAjFu1BC1a2Nasp4r5qYFgSp5UrJihp82VK1dYuXIlEybU4dSpwei0\nNxDC0CQywucRMZGbLBrH8dvH01T+ALdibmXaC8kc7t27x9ChQ2nYsCH37mX839bJqZzFylfyJpUA\nFJtToUIFQkNDef/9gtjbJ6XZp0FHWNgnaT+QaN7Ruqnb/1Oz1MPg2NhYatSowbJlyxg3bhx+fovQ\naNLe4Wg0rlSoMNMi5St5l0oAik0qVqwYBQpk/DxAm3AdUjdtDhgAMTFmK/tx+39BR8PDVVcHVyoV\nq8TGcxuJ1kabpYz4+Hh+++03QzkFCzJjxgxOnjzJnDlz8PF5B1/fxTg5lQcETk7l8fVdnGZdZkV5\nESoBKDYrsyaPBxGS7ytWJH6PsUlm1y7o2BFiY00uU0pJjDaGPQP3MOAlQ4XrYu9C6OhQNvTewNWo\nqyadPy4uzljJ+9C7d29OnjwJwNChQ1PGRwB4eAygUaOrtGihp1Gjq6ryV7JFJQDFZlWoMDNdU4hI\ngF0/wXtXrlChVStm1azJnZgYOHjQLElAItn+5nZe83mNIs5FAIhKiEIg6FC5A7U8amXrvLGxscyc\nORNvb28mTJhAzZo1CQgIoHbt2ibFqyjPohKAYrM8PAakawqpWnkR81+eQIC9PdWBj86cwSspifMA\nBw5A586QSVfSF6ERGuw1hhlUHieAZJlMrO6pxJKUBNHPbg5KSEggNDQUADs7O2bNmoWfnx+HDh1i\n165dNG/ePNtxKsqLMGkuICFEL2AaUA2oL6XMsM+mEKI98B1gB/wkpfzSlHIV5TEPjwHpmz9mQfNR\no9g9bhxnf/+dzYCvcdcn+/YRW7UqA9esoe6rr5o0Srioc9GU11EJUbg5uT3ZaWcHvXrBnTvQuLHh\np0kT9F5eBAYGsnz5clavXo2Hhwfnzp3DxcWFy5cvU7x48WzHoyhZZepkcKeBN4BFmR0ghLAD5gNt\ngJtAoBBii5TyrIllK0rmLl6EwECqA6knP74LLL95k3lNmlCyZElatGhBr1696NWrV5aL8OQ0qxuA\nuxNcOdUAx8qzniQjIWDuXGStWnDiBGL+fH4Apmk03NfrcXZwoEebNgwaMyblfKryV3KaSQlASnkO\neN5VVH3gkpQyzHjsGqAboBKAYhnh4bB6NRQubHidqkfQYgzrlm4G9trbs/fvv3F3d6dXr14kJyfz\nzjvvULFiRXx8fPD29sbHxwdPT080mrStpRERqygUt4TCzob3+qTbnD89hPMLFnD9oDNX7tzh9N27\nBEjJAQx3IF5AF72elkDXxEQKb91qaJZq2NBwhzBwIPj45MhfkaJAzkwH7QXcSPX+JtAgB8pV8qvS\npeHnnw2vo6Ph2DE4ejTlp9jNmwwBhty+jWzXDu2MGQDcuHGDXbt28csvv6Q53axZs5gwYQIXLlzg\nzTffBGDSpJMULapLc5y0S+TfqocY+F/D+/JAe+Bx+ulu/EnDyQmqVYMuXcDb2yxfX1Fe1HMTgBBi\nF+CZwa5PpJSbzR2QEGIYxqnMy5VTIxsVExUqBK+9Zvh5LDw8JRmIo0dxHjkSli3D29ubGzduEB8f\nz7Vr17hy5QpXrlyhSZMmgOFBbYkSJQAoUkSXUWl4uEOomxvlihbFuXhxuHXL8BwgNQcHw8PoQYOg\nQwdwdLTIV1eU5zHLXEBCiABgQkYPgYUQjYBpUsp2xveTAKSU//e886q5gJQcodcbeu1koSI+fNgb\nrfZauu1OTuVo1Mi4PTkZKleGK1cM7/38DJV+375gTCSKYm65bS6gQKCyEMJHCOEI9AW25EC5ivJi\nNJosX4VnNAbBMB3DF082bNsGWi189JFhfv7AQBg9WlX+Sq5hajfQ7sD3QEngTyHECSllOyFEaQzd\nPTtKKZOEEKOBHRi6gf4spTxjcuSKYkWPe/uEhX2CVnsdJ6dyVKgwM22X1Nq14fp1tRiLkmup6aAV\nRVHykKw0AeXqBCCEuAukb2h9MSWAe2YMJ6fZevxg+9/B1uMH2/8OKv6sKy+lLPkiB+bqBGAKIUTQ\ni2bB3MjW4wfb/w62Hj/Y/ndQ8VuWmgtIURQln1IJQFEUJZ/KywlgsbUDMJGtxw+2/x1sPX6w/e+g\n4regPPsMQFEURXm2vHwHoCiKojxDnksAQoj2QohQIcQlIcTH1o4nq4QQPwsh7gghTls7luwQQpQV\nQuwVQpwVQpwRQoy1dkxZJYRwFkIcFUKcNH6H/1o7puwQQtgJIYKFEP7WjiU7hBBXhRCnhBAnhBA2\nNyBICFFECLFeCHFeCHHOOC1OrpKnmoCMaw9cINXaA0A/W1p7QAjRDIgFfpVS1rR2PFklhCgFlJJS\nHhdCuAHHgNdt7HcggAJSylghhANwEBgrpTxi5dCyRAgxHvADCkkpO1s7nqwSQlwF/KSUNjkOQAix\nHDggpfzJOA2Oq5QyytpxpZbX7gBS1h6QUuqAx2sP2Awp5X4g0tpxZJeU8raU8rjxdQxwDsOU4DZD\nGjxe49HB+GNTV0pCiDJAJ+Ana8eSHwkhCgPNgKUAUkpdbqv8Ie8lgIzWHrCpyicvEUJ4Ay8D/1g3\nkqwzNp+cAO4AO6WUtvYdvgU+AvTWDsQEEtglhDhmnCbelvhgWIBumbEZ7ichRAFrB/W0vJYAlFxC\nCFEQ2AC8L6V89urouZCUMllKWQcoA9QXQthMc5wQojNwR0p5zNqxmKiJ8XfQARhlbB61FfZAXWCB\nlPJlIA7Idc8k81oCuAWUTfW+jHGbkoOM7eYbgFVSyo3WjscUxtv2vRgW97IVjYGuxjb0NUBLIcRK\n64aUdVLKW8Y/7wCbMDTx2oqbwM1Ud47rMSSEXCWvJQC19oCVGR+gLgXOSSnnWjue7BBClBRCFDG+\ndsHQqeC8daN6cVLKSVLKMlJKbwz/B/ZIKd+0clhZIoQoYOxEgLHppC1gMz3jpJT/AjeEEL7GTa3I\nheug58SawDkmL6w9IIRYDbQASgghbgJTpZRLrRtVljQG3gJOGdvQASZLKbdaMaasKgUsN/Yq0wDr\npJQ22ZXShnkAmwzXE9gD/5NSbrduSFk2BlhlvBgNA4ZYOZ508lQ3UEVRFOXF5bUmIEVRFOUFqQSg\nKIqST6kEoCiKkk+pBKAoipJPqQSgKIqST6kEoCiKkk+pBKAoipJPqQSgKIqST/0/+AhgFXeIvTwA\nAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x1c6976cab70>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# numpy\n",
"theta = np.pi / 4\n",
"\n",
"T = np.linspace(0, 2 * np.pi)\n",
"T2= T[::5]\n",
"\n",
"pv = np_r(T)\n",
"rv = np_r(T2)\n",
"\n",
"tv = np.array([np_tangent(t) for t in T2]).transpose()\n",
"#temp = np.array([np_tangent(t) for t in T2])\n",
"#tv = np.concatenate([temp[:, i:i+1] for i in range(temp.shape[1])], axis=0)\n",
"#tv = tv.reshape((temp.shape[1], temp.shape[0]))\n",
"\n",
"nv = np.array([np_normal(t) for t in T2]).transpose()\n",
"#temp = np.array([np_normal(t) for t in T2])\n",
"#nv = np.concatenate([temp[:, i:i+1] for i in range(temp.shape[1])], axis=0)\n",
"#nv = nv.reshape((temp.shape[1], temp.shape[0]))\n",
"\n",
"# plot\n",
"fig = plt.figure()\n",
"ax = fig.add_subplot(1, 1, 1)\n",
"ax.plot(pv[0], pv[1], color='k', linestyle='dashed')\n",
"ax.plot(rv[0], rv[1], 'o', color='y')\n",
"ax.quiver(rv[0], rv[1], tv[0], tv[1], color='r')\n",
"ax.quiver(rv[0], rv[1], nv[0], nv[1], color='g')\n",
"ax.set_aspect('equal', adjustable='box')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
" ** その2 **"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def frenet(x, y, z=0, *, symbol):\n",
" def norm(v):\n",
" return sym.sqrt(sum([c**2 for c in v]))\n",
" # Position\n",
" r = np.array([x, y, z])\n",
" # Tangent = r' / |r'|\n",
" dr = np.array([sym.diff(c, symbol) for c in r])\n",
" tangent = dr / norm(dr)\n",
" # Normal = T' / |T'|\n",
" dt = np.array([sym.diff(c, symbol) for c in tangent])\n",
" normal = dt / norm(dt) \n",
" # Binormal = T x N \n",
" binormal = np.cross(tangent, normal)\n",
" # Curvature = |T'|\n",
" curvature = norm(dt)\n",
" # Torsion = dot(-B', N) \n",
" db = np.array([sym.diff(c, symbol) for c in binormal])\n",
" torsion = np.dot(-db, normal)\n",
"\n",
" return (tangent, normal, binormal, curvature, torsion)"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"t = sym.symbols('t')\n",
"directrix = (t, sym.cos(t), 0)\n",
"tangent, normal, _, _, _ = frenet(directrix[0], directrix[1], symbol=t)\n",
"\n",
"np_position = sym.lambdify(t, [c for c in directrix], modules='numpy')\n",
"np_tangent = sym.lambdify(t, [c for c in tangent], modules='numpy')\n",
"np_normal = sym.lambdify(t, [c for c in normal], modules='numpy')\n",
"#np_binormal = sym.lambdify(t, [c for c in binormal], modules='numpy')\n",
"#np_curvature = sym.lambdify(t, curvature, modules='numpy')\n",
"#np_torsion = sym.lambdify(t, torsion, modules='numpy')"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\nAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x1c6975e3cf8>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# plot\n",
"T = np.linspace(0, 2.0 * np.pi)\n",
"skip = 5\n",
"T2= T[::skip]\n",
"\n",
"pv = np.array([np_position(t) for t in T]).transpose()\n",
"rv = pv[:, ::skip]\n",
"tv = np.array([np_tangent(t) for t in T2]).transpose()\n",
"nv = np.array([np_normal(t) for t in T2]).transpose()\n",
"\n",
"fig = plt.figure()\n",
"ax = fig.add_subplot(1, 1, 1)\n",
"ax.plot(pv[0], pv[1], color='k', linestyle='dashed')\n",
"ax.plot(rv[0], rv[1], 'o', color='y')\n",
"ax.quiver(rv[0], rv[1], tv[0], tv[1], color='r')\n",
"ax.quiver(rv[0], rv[1], nv[0], nv[1], color='g')\n",
"ax.set_aspect('equal', adjustable='box')\n",
"plt.show()"
]
}
],
"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.6.1"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment