Skip to content

Instantly share code, notes, and snippets.

@espdev
Created November 29, 2017 09:55
Show Gist options
  • Save espdev/b456f657345a8adac4e5269fd06b5f93 to your computer and use it in GitHub Desktop.
Save espdev/b456f657345a8adac4e5269fd06b5f93 to your computer and use it in GitHub Desktop.
Отражение точки относительно заданного отрезка
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Отражение точки относительно заданного отрезка"
]
},
{
"cell_type": "code",
"execution_count": 156,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"\n",
"# Задаём отрезок координатами точек начала и конца\n",
"x1, y1 = 10.5, 11.0\n",
"x2, y2 = 20.4, 15.6\n",
"\n",
"# Задаём точку\n",
"px = 17.1\n",
"py = 11.2\n",
"# px = 12.5\n",
"# py = 14.5"
]
},
{
"cell_type": "code",
"execution_count": 157,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The line equation: -0.4x + 0.9y + -5.6 = 0\n",
"The perpendicular line equation: -0.9x + -0.4y + 20.2 = 0\n"
]
}
],
"source": [
"def segment_line_equation(px, py, qx, qy):\n",
" \"\"\"Вычисляет общее уравнение прямой Ax + By + C = 0 для отрезка\n",
" \"\"\"\n",
" A = py - qy\n",
" B = qx - px\n",
" C = -A * px - B * py\n",
"\n",
" # Нормализация для точности вычислений\n",
" z = np.sqrt(A*A + B*B)\n",
" A, B, C = [cf / z for cf in (A, B, C)]\n",
"\n",
" return A, B, C\n",
"\n",
"\n",
"# Определяем уравнение прямой для заданного отрезка\n",
"A, B, C = segment_line_equation(x1, y1, x2, y2)\n",
"\n",
"# Определим уравнение прямой, проходящей через заданную точку и перпендикулярной к прямой заданного отрезка\n",
"Ap, Bp, Cp = segment_line_equation(px, py, (px + A), (py + B))\n",
"\n",
"print(f'The line equation: {A:.1f}x + {B:.1f}y + {C:.1f} = 0')\n",
"print(f'The perpendicular line equation: {Ap:.1f}x + {Bp:.1f}y + {Cp:.1f} = 0')\n",
"\n",
"# Проверка\n",
"# cx = 14.1\n",
"# cy = (A * cx + C) / -B\n",
"\n",
"# cpx = 15.5\n",
"# cpy = (Ap * cpx + Cp) / -Bp"
]
},
{
"cell_type": "code",
"execution_count": 158,
"metadata": {},
"outputs": [],
"source": [
"# Определяем проекцию точки на отрезок (точка пересечения прямых)\n",
"d = (A * Bp - Ap * B)\n",
"ix = -(C * Bp - Cp * B) / d\n",
"iy = -(A * Cp - Ap * C) / d"
]
},
{
"cell_type": "code",
"execution_count": 159,
"metadata": {},
"outputs": [],
"source": [
"# Определяем точку отражения от отрезка (точку, симметричную заданной относительно отрезка)\n",
"\n",
"# Вычисляем вектор направления от заданной точки до спроецированной точки на отрезке (точки пересечения)\n",
"dist = np.sqrt((ix - px)**2 + (iy - py)**2) * 2\n",
"\n",
"theta = np.arctan2((iy - py), (ix - px))\n",
"ux = dist * np.cos(theta)\n",
"uy = dist * np.sin(theta)\n",
"\n",
"mx = px + ux\n",
"my = py + uy"
]
},
{
"cell_type": "code",
"execution_count": 160,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x15865024c88>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%matplotlib inline\n",
"from matplotlib import pyplot as plt\n",
"\n",
"plt.plot([x1, x2], [y1, y2], 'o-')\n",
"plt.plot([px, mx], [py, my], ':b')\n",
"plt.plot(px, py, 'or')\n",
"plt.plot(mx, my, 'og')\n",
"plt.plot(ix, iy, '.m')\n",
"plt.axis('equal');"
]
}
],
"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.2"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment