Skip to content

Instantly share code, notes, and snippets.

@QuLogic
Last active October 12, 2018 09:05
Show Gist options
  • Save QuLogic/598a97b6cc0fedef8b17e4ff53aebb11 to your computer and use it in GitHub Desktop.
Save QuLogic/598a97b6cc0fedef8b17e4ff53aebb11 to your computer and use it in GitHub Desktop.
Cartopy straightAndDomain Calculations
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"These are calculations done in the Cartopy `straightAndDomain` function to determine if a line segment is sufficiently bisected on a projected domain.\n",
"\n",
"We have a projected start point `p_start` denoted by $(x_0, y_0)$, a projected end point `p_end` denoted by $(x_1, y_1)$, and a projected mid point `p_mid` denoted by $(x, y)$. The geometry looks like the following:\n",
"\n",
"![drawing](project.svg)"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"from sympy import *\n",
"init_printing()"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"x, y = symbols('x y')\n",
"x0, y0 = symbols('x0 y0')\n",
"x1, y1 = symbols('x1 y1')"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAQoAAAAUBAMAAACHTm6lAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAImYQu82Z3XZU70SJqzJu81j5AAAACXBIWXMAAA7EAAAOxAGVKw4bAAACSElEQVRIDcWWP2gTYRjGn9wFL+fFGDoo6nIIxfUGhQyWVnGVprMgRahd/BMUsU4eFEKGlAodumasuOjUbgkIpZvt1rGDuKZQBEUU3/d7U3rf+32u3kFyd+/ze597vj/5A1RSlHvETXr+zXIz0NMP6LVQeopbQLBYeop6johXpdwjHOByuQnM0x+gS+fW2rV+rtKE3RxXM1X0gQbx0qyEvYOdPeXidOziLpGjYCVqK7SeDLCuahOw31d1QGiPcBs38lfA1390NOZYmMYbssjqJ4neHlfOtXFP9QoYjOJ9JcDQPuEzvmSf8G1ZN0hH43GHhU18oLlAdc6hsvM5fqiqgNFHnCgBhvYKMpRt3SAdSEyKMacALuYOhWHW+ONUGZw9wntHYNoryFDcFOJ/moJWBBgfObZYQm3gVBkcN/HCEZj2CjIUTwrjLym2eXfG2TpqmTa+j6pefgHHGVY0DKZ9wkbtGKuAJ4XxlxTT2AWG7+YxhfC7bf0Uw1TVBKQhb3lpI8y2izbJz+pxJTUplBfYf7IvnnDKmV7rEZGv7emY6T1vqpqAtPy/vLQRopfFFOHhavc6FXgufP4yFw8L3+CxnQK0M2ixip5yLR8FR1mCCBtuh6TwdMhchJ3Cr1ndar/QDmnEdk2A2mK8rxVDizCybCY3m3S2vcQ/7rCQA3cmIFqnF+YcpdWcvtvNtXrr015SitAshNTlHJfeHno7Ksu/Cadf9rN/OanVnPSe0b1dKwK2IjTrQRGyrlPr7qzDzEPFVi30v9wETfwF47WinrJ+3jsAAAAASUVORK5CYII=\n",
"text/latex": [
"$$\\left ( x, \\quad y, \\quad x_{0}, \\quad y_{0}, \\quad x_{1}, \\quad y_{1}\\right )$$"
],
"text/plain": [
"(x, y, x₀, y₀, x₁, y₁)"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x, y, x0, y0, x1, y1"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Normalized distance along line segment\n",
"\n",
"The angle θ between the two lines can be found using `atan2`:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAd4AAAAUBAMAAADRtEGWAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEM0yVHaJ3SKZq+9Eu2a4wQv0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAE0klEQVRYCaVXTWhcVRT+nvOXMTOTZyAuCiXDc6Goi1F04UKSghJQpFNhAqOLToVIu6qKRcVSZyGIP9gxtQqCdigEihuj2I0oDkhRcJFuiqFgOypU3EhiVIKI9Zxz73nvzfuZZDoX8u653/nO+c559707L8CuxkR/V7RUUrad6oo7xhWLZ7RItp3qijj2RtYjL8+NEDG2WKpWQhW9RPIdiegI4HQit5eIji2WmJXBeBVOJ4lcSUSTmGlYvm48WTvLamSxh9PSJ+EDUoagVQT05M4K7YBxY5azauIGihhZbNx+tYqgh/2JO/laQLhR6+6EfkcWG7df2CqklmxjCZUzL70LNjJ3nWqs+L01AadZx5uuj7AxcxoTn/qI0zh3YclfiTHzxFuL+vweMS7d3+FimiYqavsdFFYywnIEqlS4MFuFhCy0i10UaH+NcQkn28h/+A77rgD50ioOCs+/tL5HbiO31DLArfi1/pzvY8NpVY4Vqlhc5MXPfAmKGC5muCpqEjBm+xVhPKgsOw/IEab92sKEbquQiEdrpU3pV4zyKqb6OIyz7HseeLVYxY/C08vE/DLKF6/hEQMcwlH3O/XJnHfzm6V2pZXt0nLBuLSI4WKGa0VtAsZMv0b4gfeVZecBOcJUyhRm6AuY9njcxjH3H9mWfsUoVzFVx4uYa5PnS8CdrOMvMh3hezWycJ4oxzFlnnLX3o4woXwRKPSwSXFz9Jf3vNs/87wumcPFNIeI2gR4yvNe9rw7VRjfchoaSnbo7vtyISlbmNC5Ch3T6xnTrxgUS/0ex8ke+alfrLmZLaWamR6HuXu2MDlvYb4dg4MyYLaGzwm1SnrTdxDTNCxqEzBkn2cWrvn9KhdcsMoRqFKQfTL0cL8/ILPtFjo5iGH6Bfa7FErPM5aRWw1Ss0VP+JN8i/pk04jeDoKoKn5ATpBpd0OL2EGM8/FgUZuAl7ZfFvYzMm5HSI4QlbKFSQH6THDA38huf3NTt2gM7fcYu+i8wmWUu2wHg9aXM/TK012lsS+3gQOBk6ysexA5d84F54icVzuIaR4WtQkYsv2ycLzfATkia7+2MGk1fF59hfzWT8VqEWLYfvMd1uFj/AOs9dkORrFb+o/2d7Lu/AGU/ixvRD701+av4m3e3/MU856J0yJ2EFMRFrUJGNL9JWHT72xVmfTCheUItlJamPRrq5CgN04feryPjw+DjV8++ee+q18Av4mLuXsaZ9qy8C/OSnPb2cJUDy+4cFYONH/3XWLsacx81OcX6l9ayonoFyEaQ8Q0EYvaBAzZflnY9Ft4VplcYEiOYNuvFib92iqCoIhVapXoFYT5nlyOOOUNlvM568ZcPmCOV+cZA+j++u6QMSCm+LIe8AzYfkXYnAj7lKeznuZ+v+rgfrUKxWLzvQ89xq3Qh+7NVYe3KTzOYraHJv/+5sNwxM51sl1i1A3sDLkzgZimEFGTQKBbjEOEzS96S6k6B+yI1AIxtAolx+avr18XbB2FftmW7JNO4BKQe7pDX5Y+lmAs8tsf/08szgzE1GdEJYFCPIvw66+s0IZFawJibBMp9N1UIfS9KDVOmcDgeqFZs4t+AKZY6yl4Ehz8v58gygGBcCUpPh3bdRWRkzc9Y4qn0k5xJMHjiiXlFIyq+B/pHI1H28k1KgAAAABJRU5ErkJggg==\n",
"text/latex": [
"$$- \\operatorname{atan_{2}}{\\left (y - y_{0},x - x_{0} \\right )} + \\operatorname{atan_{2}}{\\left (- y_{0} + y_{1},- x_{0} + x_{1} \\right )}$$"
],
"text/plain": [
"-atan2(y - y₀, x - x₀) + atan2(-y₀ + y₁, -x₀ + x₁)"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"theta = atan2(y1 - y0, x1 - x0) - atan2(y - y0, x - x0)\n",
"theta"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"and the distance along the line segment with `cos`:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAs8AAAAmBAMAAADJiGvnAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAiRDdVJmrRDIiu3Zmze8cCasWAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAILklEQVRoBe1ZbYhUVRh+586487U7OwYSssWORf5QbLcoZNNyUgnSyDUzK1vafgSKCBMhFUI7FBVkOkMfGCG1BAlmH7PC+mc1N8ofQdEkYR+0KqIUFLRsfqK0vR/n3Dn3Y+7Mqrs/mj0we855zvOe532fO3vv3bMAuo1PbhvVOg3fdza8A1NjQKR7anQaXqUp1/AWTI0B4amRmVbZMm3B1DiwbmpkplXqfOkIPf7QFXg166PMFUT9L0NivfWVNRs210c0WaFiU9mcN/I4lK2v+i4oFOtjGqxwMXbRmDb0sN6XjoXwwcTfA8O5+PmGdtco/j1jHDxclQle912NjPnCDQgeqLvmRXUzDWK4ZEwaengEq48PB1twPy2Hut2k4LAI39JnuYN4HhwJu3yD6gZFuV76VYpVleEs2DmmWGXs5lVly0ITeXbYQ6oRthEDmj1Xh3cJjrT6PVITA0i53nbVYlWFKAt2jhnNJex+qUqWBboa0XQ076LVCFuA9GfgeVcQT3Vk1G8RWui6Xk0jZW+bJDGvkEIoC/4e8zyBRVX52hk7tAFsX74iI8hKtVArLFSC2I/LPzS20UM78haNOHrv745jufYElX3aRMV0nT5b+UBeNmeBzkkj28M1v0G3Avw9Pq5C9Ja1wqwTkBofH1VRZmdH+lvaZXKvZIzKPm2iYrpOn618IC+bs0DnpN2L3Vt6UrVvyRlLesuaYT8ZQY6hjoycdcBqEu/0QyeE+SlPWEzXWZ+yD5uyIOe+ph024GcQP9bQxq3215wWAObv3zlQkqHjjUNviWHWYAnezwhHfpqI/cZxy8yHwWobyMG2Bw4SjQRX4t6H/1mb5cH209v2KymAZDdqr4f4SdlR/XQhRnKKYFZgK6u1YDGt45JQdZoVaSb2phzBmm34SFmgc9FztN6Jn0/wMwe+Kt1NgN2sdPOicBkGBhBpLtuwvSWFhaIn4JCxpBEOgu/USvwU7Ci+XIS9+ITnP0QxMtIFjwDcqQd3leIXAeQIKjEMkH4RkqOOjRlJtqUFVMmZDKlAGFpZrdcQ07s4JbR1UmOsX7NUb8oRpIxWPr5OEGWBzu06hn2EEr8DP9dBe+YF7CstlAmNRYvN6Ugv0joruN6Swt6eUYaPjSWFSBAsUystZXgwfxtA4bWTkCQMIyN/QF+GjebBZwCXQR1BhbMQz/ZAol+FcyfIl3CfgJKcSVAVCEMrK0KwmN7FJaHr5Bpja00HKEIMsxPSbIFfWUMUygKdy7fn8T0PP/A7fjLKsAUj1H5GxOJSwznAP6Jjowhwu3Fk5J6RkaM0xrBMqgSXcFiJYkSCoMARAB3duMMZgNb0kr1FFQmxgSeLZLQMPgXcRx1BpXKo/Se0ljAHzmYkT9kQshBaM7SBSs4kqAqEwcqVpILFdPYOiUqdUmO0k3UrpYphKiGDLT4+S2zKgpwrYCX8m0xGU6HuRqV25OGUaTRy1C8JX5++TOyCM4wQCbKNJqHIeTS6f87xs8RGQevXIp4GotEywF8LNFqOoNBoiI5BIe/YmJCXLkAqq1BKztWwAksY+hIrQg0xvY1LQtfJNdpGazIbpuQI02zx0WF0qgywhTh06wC3YQhRqejGYqy7kyiq6S0prAeSJzQuPSESBKyGqP2NfiwD36OLJJjohMKbaHRJBmw0Xg46gsJbB+At6QscGo0QPHMNDyuMknM2qkAxtLIi1BDT27gkdJ1co8MBDjDkaK7Z4iMnQD8orgmrWkccfDbBUnz27KOJ3SKZQ5DMFDKwqPrDEHZDoteO4AEhEmQ/DFvwimZP40V7rgRNw8hCwdY0rNqZPwrdMlBGh0u4mkAK7robh0YjJDYGzMArwskZy6oCxXA9DGuI6W2cErZ1XKPHaDaskpBmKx/ZaPUwhAjeNtFvfNij8WcSo/Fhrch9X/ZzPN0pFPHmCDPSxpK+dhiGbw59w8aSQiQIVquV+F/4nNuRhx+iJyFRRBAjU/3Q/kamB7ploIymLfn0akZv9LKKVh0h+H1NlaCjDCDJmQypQBi2siLUENPbVCQY0XVyjWQ0CevmkCNQ2NpHNprqJ+escxDrJQ6i1qZ9g9/SuNLmDs1/Ypju0Xh3bclXcH3t+M4wdwgfaY5GiAQBPVK5zV0/G+KrZ+WiNxy4ngAUjD89MP83aHqqyINXxzes+LdXnQVQTdamQXzdMxsheEtszUH4dgBJzrlOFQijoiyMGmJ6m4oEI2IdaWGNlBQJ6yaGKTkCha19ZKOpfnbuGISyxLH/IqaJq8kLxM0mqhOQsB5zicc9+FSjVxULc/Nv1QTVEVQXReEN09UQkYf8UteCOWVGdWWDaopp2JYgQNdJTyJ5SnmF1VuHg02xZDRnwc6151sIDDxUSnZHegHamKd+3KR6PBpqKlv4fTcbIxLkf7RDZIz0a/oICg8lNkNHzklhZJDfo9POFceMGdWVK1xDTIOGBEGqTqmR/5LwCktCBlvttQz7yqFSIa3+j7VHLft1A3jftMp+K7AH3wESJeeSIBQEC5wr5sxfUB9B4X18Mew1+ThmJDmzG7NxSTqIzAhQtsmGmMYqEhqhniuKrzlX8hNmOZMt43eWbJL6xblU+YDg87xUB8JPMAfCk3kQHXrUBRuIv5sq0hXmmFr9sHUw74DAQJpdK95pgLKHjGK6eUVppVJRbWG9E/eUhTjXNHZEVlzvGw46Tb7xIAwEhzUX/aMIDY682n9lBSl7c5qsf2VxFuJc5FLZqzuNXHsHrPGgu92112vcHY8H/HY3riuTUPnBSdhzeksfB971waaha+zAf9iwC2IwO//XAAAAAElFTkSuQmCC\n",
"text/latex": [
"$$\\sqrt{\\left(x - x_{0}\\right)^{2} + \\left(y - y_{0}\\right)^{2}} \\cos{\\left (\\operatorname{atan_{2}}{\\left (y - y_{0},x - x_{0} \\right )} - \\operatorname{atan_{2}}{\\left (- y_{0} + y_{1},- x_{0} + x_{1} \\right )} \\right )}$$"
],
"text/plain": [
" _______________________ \n",
" ╱ 2 2 \n",
"╲╱ (x - x₀) + (y - y₀) ⋅cos(atan2(y - y₀, x - x₀) - atan2(-y₀ + y₁, -x₀ + x\n",
"\n",
" \n",
" \n",
"₁))"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dist = cos(theta) * sqrt((x - x0)**2 + (y - y0)**2)\n",
"dist"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"then normalized by the length of the line segment:"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/latex": [
"$$\\frac{\\sqrt{\\left(x - x_{0}\\right)^{2} + \\left(y - y_{0}\\right)^{2}}}{\\sqrt{\\left(- x_{0} + x_{1}\\right)^{2} + \\left(- y_{0} + y_{1}\\right)^{2}}} \\cos{\\left (\\operatorname{atan_{2}}{\\left (y - y_{0},x - x_{0} \\right )} - \\operatorname{atan_{2}}{\\left (- y_{0} + y_{1},- x_{0} + x_{1} \\right )} \\right )}$$"
],
"text/plain": [
" _______________________ \n",
" ╱ 2 2 \n",
"╲╱ (x - x₀) + (y - y₀) ⋅cos(atan2(y - y₀, x - x₀) - atan2(-y₀ + y₁, -x₀ + x\n",
"──────────────────────────────────────────────────────────────────────────────\n",
" ___________________________ \n",
" ╱ 2 2 \n",
" ╲╱ (-x₀ + x₁) + (-y₀ + y₁) \n",
"\n",
" \n",
" \n",
"₁))\n",
"───\n",
" \n",
" \n",
" "
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"norm_dist = dist / sqrt((x1 - x0)**2 + (y1 - y0)**2)\n",
"norm_dist"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/latex": [
"$$\\frac{- x x_{0} + x x_{1} + x_{0}^{2} - x_{0} x_{1} - y y_{0} + y y_{1} + y_{0}^{2} - y_{0} y_{1}}{x_{0}^{2} - 2 x_{0} x_{1} + x_{1}^{2} + y_{0}^{2} - 2 y_{0} y_{1} + y_{1}^{2}}$$"
],
"text/plain": [
" 2 2 \n",
"-x⋅x₀ + x⋅x₁ + x₀ - x₀⋅x₁ - y⋅y₀ + y⋅y₁ + y₀ - y₀⋅y₁\n",
"──────────────────────────────────────────────────────\n",
" 2 2 2 2 \n",
" x₀ - 2⋅x₀⋅x₁ + x₁ + y₀ - 2⋅y₀⋅y₁ + y₁ "
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"norm_dist = norm_dist.expand().simplify()\n",
"norm_dist"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In order to simplify the calculation, we define a few shortcuts (it also avoids multiplying two large numbers together, which can cause precision issues):"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAX0AAAAUBAMAAACT2/BEAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAImYQu82Z3XZU70SJMqtHo0JKAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADTklEQVRIDdVXQWgTQRR9yaZN0iRt8KCol9WLFw8LKgaRVqUHTzUeFk9KEIpe1FIRqx5cKIQgwVZ60JMURKh4qSeLlwZE6UEwoHhtPAg9tgahUgL+mdnJn91sWgUPzRymf97/7/3X3ZnpFojZ6NXxRBg/3qvugcE8eb/Yu/6tIhAvdfWf9rqmtk882z79/7IrQFK8g+ix+/2fAvZFexfo7vfft4iy4b/w+GDV47X2b1W+L9Gb6j6ssocDDuf9/VO4jtgLRjmKEAy15tpOEQPJlnCOS61afCpZRLXqQ9r/aRzx7gBfuTIUZTPzmGEefP+1d0itR9F8QUMl3JpTSoTXgERSKzXC4kXc41TWyTYz+Xgt3VCY9v8en503+HaNK0PR/v4iRpnn+4/NjiNxJoqmBE2RcOt2Tom0lxQo5CieU5yewGvAcuWoW9SODvQimpTKuu6ll67boNDBKM14K6bA0ERnwMOmz8MH173vuldIFgsY8iJoWhAnZN/LpBlobfbwRcC1CnmAIdqwuXXhnwe1w0gdrxSinz+wKYBO/6qM5mUn12Ke3j+ZJlbr0TQp2KaLINiaU0qE14BAvrQwMCv9G/sHoh1W85hU5W3/uZYAtvE/jtQ887R/2lWPomlK0DQVas0pJcJrQCC5DSRt+lUmzPObdmaQclYdTKly7X+OTuF0tBFfdwyJBvO0/0QDY5E0X9AwFW7NKSXCa1ArjOWaSHry/H7k1PLsBewRz39BYb7/zO/EesyWRqxfXG1GN7FsM0/7729kfir/I0WzWgsamNE6WAslYpRKhJ4/nTn018xdMVwpXLXF/t9S5b5/a226fJgQsX/uOioVmocrt/LM0/6ttfKGoiVvmwQtaGBG62AtlIhRKhGrhaFFoK/e+f2g75GOv7/CfzraPzCu7y3Ryb//5VZVD2jONNA1Vq3DtbTfQ4MQdf+cjPh+S5X0/W8FzT4llWxISS0Hi9YWmIdjCv6BEXpGgoaaQnaYlUSwVomYRImU5f0vvgrOmjkRV40jYeT2PlwDCgbAYdJOeBG8SZwHJM2i9N8M0TpUK0UCXImkPpWoVLyZf/r/xQ4o6UWmckOH5s+lct1fxk14hzhUyyKax0giT1jMpqk3xyHgDwJ9C6KjagWnAAAAAElFTkSuQmCC\n",
"text/latex": [
"$$\\left ( - x_{0} + x_{1}, \\quad - y_{0} + y_{1}, \\quad x - x_{0}, \\quad y - y_{0}\\right )$$"
],
"text/plain": [
"(-x₀ + x₁, -y₀ + y₁, x - x₀, y - y₀)"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Deltas for the line segment\n",
"seg_dx = x1 - x0\n",
"seg_dy = y1 - y0\n",
"# Deltas for the mid-point\n",
"mid_dx = x - x0\n",
"mid_dy = y - y0\n",
"\n",
"seg_dx, seg_dy, mid_dx, mid_dy"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"and write the equation like so:"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/latex": [
"$$\\frac{\\left(x - x_{0}\\right) \\left(- x_{0} + x_{1}\\right) + \\left(y - y_{0}\\right) \\left(- y_{0} + y_{1}\\right)}{\\left(- x_{0} + x_{1}\\right)^{2} + \\left(- y_{0} + y_{1}\\right)^{2}}$$"
],
"text/plain": [
"(x - x₀)⋅(-x₀ + x₁) + (y - y₀)⋅(-y₀ + y₁)\n",
"─────────────────────────────────────────\n",
" 2 2 \n",
" (-x₀ + x₁) + (-y₀ + y₁) "
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"along = (seg_dx*mid_dx + seg_dy*mid_dy) / (seg_dx*seg_dx + seg_dy*seg_dy)\n",
"along"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"which we can see is equivalent to the expanded form `norm_dist` above:"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/latex": [
"$$\\frac{- x x_{0} + x x_{1} + x_{0}^{2} - x_{0} x_{1} - y y_{0} + y y_{1} + y_{0}^{2} - y_{0} y_{1}}{x_{0}^{2} - 2 x_{0} x_{1} + x_{1}^{2} + y_{0}^{2} - 2 y_{0} y_{1} + y_{1}^{2}}$$"
],
"text/plain": [
" 2 2 \n",
"-x⋅x₀ + x⋅x₁ + x₀ - x₀⋅x₁ - y⋅y₀ + y⋅y₁ + y₀ - y₀⋅y₁\n",
"──────────────────────────────────────────────────────\n",
" 2 2 2 2 \n",
" x₀ - 2⋅x₀⋅x₁ + x₁ + y₀ - 2⋅y₀⋅y₁ + y₁ "
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"along_simp = along.expand().simplify()\n",
"along_simp"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAOBAMAAADkjZCYAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAiXZmMs1UEN0i77urRJlR0qN3AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAUUlEQVQIHWNgYFQWYWBgCGOomMDAvICBMYCB+wAD23cG/gMMvN8Y6h8w8H5imC/AwAIkHzCwfISKAGXZvjFwb2Bg/g7VxdDGUOXAwFCodIQBAG3HFgUteuAKAAAAAElFTkSuQmCC\n",
"text/latex": [
"$$0$$"
],
"text/plain": [
"0"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"(along_simp - norm_dist).simplify()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Perpendicular distance of point away from line\n",
"\n",
"Using the same geometry above, we can calulate this distance using `sin` instead:"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/latex": [
"$$- \\sqrt{\\left(x - x_{0}\\right)^{2} + \\left(y - y_{0}\\right)^{2}} \\sin{\\left (\\operatorname{atan_{2}}{\\left (y - y_{0},x - x_{0} \\right )} - \\operatorname{atan_{2}}{\\left (- y_{0} + y_{1},- x_{0} + x_{1} \\right )} \\right )}$$"
],
"text/plain": [
" _______________________ \n",
" ╱ 2 2 \n",
"-╲╱ (x - x₀) + (y - y₀) ⋅sin(atan2(y - y₀, x - x₀) - atan2(-y₀ + y₁, -x₀ + \n",
"\n",
" \n",
" \n",
"x₁))"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sep = sin(theta) * sqrt((x - x0)**2 + (y - y0)**2)\n",
"sep"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/latex": [
"$$\\frac{- x y_{0} + x y_{1} + x_{0} y - x_{0} y_{1} - x_{1} y + x_{1} y_{0}}{\\sqrt{x_{0}^{2} - 2 x_{0} x_{1} + x_{1}^{2} + y_{0}^{2} - 2 y_{0} y_{1} + y_{1}^{2}}}$$"
],
"text/plain": [
" -x⋅y₀ + x⋅y₁ + x₀⋅y - x₀⋅y₁ - x₁⋅y + x₁⋅y₀ \n",
"──────────────────────────────────────────────\n",
" ___________________________________________\n",
" ╱ 2 2 2 2 \n",
"╲╱ x₀ - 2⋅x₀⋅x₁ + x₁ + y₀ - 2⋅y₀⋅y₁ + y₁ "
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sep = sep.expand().simplify()\n",
"sep"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"and applying the same shortcuts above:"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/latex": [
"$$\\frac{\\left(x - x_{0}\\right) \\left(- y_{0} + y_{1}\\right) - \\left(- x_{0} + x_{1}\\right) \\left(y - y_{0}\\right)}{\\sqrt{\\left(- x_{0} + x_{1}\\right)^{2} + \\left(- y_{0} + y_{1}\\right)^{2}}}$$"
],
"text/plain": [
"(x - x₀)⋅(-y₀ + y₁) - (-x₀ + x₁)⋅(y - y₀)\n",
"─────────────────────────────────────────\n",
" ___________________________ \n",
" ╱ 2 2 \n",
" ╲╱ (-x₀ + x₁) + (-y₀ + y₁) "
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sep_simp = (mid_dx*seg_dy - mid_dy*seg_dx) / sqrt(seg_dx*seg_dx + seg_dy*seg_dy)\n",
"sep_simp"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"which we can see is equivalent to `sep` above:"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/latex": [
"$$\\frac{- x y_{0} + x y_{1} + x_{0} y - x_{0} y_{1} - x_{1} y + x_{1} y_{0}}{\\sqrt{x_{0}^{2} - 2 x_{0} x_{1} + x_{1}^{2} + y_{0}^{2} - 2 y_{0} y_{1} + y_{1}^{2}}}$$"
],
"text/plain": [
" -x⋅y₀ + x⋅y₁ + x₀⋅y - x₀⋅y₁ - x₁⋅y + x₁⋅y₀ \n",
"──────────────────────────────────────────────\n",
" ___________________________________________\n",
" ╱ 2 2 2 2 \n",
"╲╱ x₀ - 2⋅x₀⋅x₁ + x₁ + y₀ - 2⋅y₀⋅y₁ + y₁ "
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sep_simp.expand().simplify()"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAOBAMAAADkjZCYAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAiXZmMs1UEN0i77urRJlR0qN3AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAUUlEQVQIHWNgYFQWYWBgCGOomMDAvICBMYCB+wAD23cG/gMMvN8Y6h8w8H5imC/AwAIkHzCwfISKAGXZvjFwb2Bg/g7VxdDGUOXAwFCodIQBAG3HFgUteuAKAAAAAElFTkSuQmCC\n",
"text/latex": [
"$$0$$"
],
"text/plain": [
"0"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"(sep_simp - sep).simplify()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"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.6"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment