Skip to content

Instantly share code, notes, and snippets.

@espdev
Created July 31, 2017 22:23
Show Gist options
  • Save espdev/152ef76d9d4acad70d760864b07e0494 to your computer and use it in GitHub Desktop.
Save espdev/152ef76d9d4acad70d760864b07e0494 to your computer and use it in GitHub Desktop.
Vectorized scanlines calculation
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"X: [1, 2, 3, 4]\n",
"Y: [5, 6, 7, 8]\n",
"Model: [-2 -1 0 1 2]\n"
]
},
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x1d85fe7a748>]"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x1d85fdda710>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Наша кривая\n",
"x = [1, 2, 3, 4]\n",
"y = [5, 6, 7, 8]\n",
"\n",
"# Модель сканстроки\n",
"model = np.arange(-2, 3)\n",
"\n",
"print('X:', x)\n",
"print('Y:', y)\n",
"print('Model:', model)\n",
"plt.plot(x, y, 'o-')"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"UX: [ 0.70710678 0.70710678 0.70710678 0.70710678]\n",
"UY: [-0.70710678 -0.70710678 -0.70710678 -0.70710678]\n"
]
}
],
"source": [
"# Вычислим нормали к нашей кривой в каждой точке\n",
"# Нормали задаются нормированными (единичными) векторами направления\n",
"dx = np.gradient(x)\n",
"dy = np.gradient(y)\n",
"dl = np.sqrt(dx*dx + dy*dy)\n",
"\n",
"ux = dx / dl\n",
"uy = dy / dl\n",
"\n",
"ux, uy = uy, -ux\n",
"\n",
"print('UX:', ux)\n",
"print('UY:', uy)"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x1d85ddd54a8>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Нарисуем на графике нашу кривую и нормали в каждой точке\n",
"plt.plot(x, y, 'o-')\n",
"plt.quiver(x, y, ux, uy, color='r')\n",
"plt.axis('equal');"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x1d85fe89b38>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Вычислим сканстроку для одной точки кривой\n",
"# Тут уже используется векторизация через numpy но пока для одной точки\n",
"sx = x[0] + np.asarray(model) * ux[0]\n",
"sy = y[0] + np.asarray(model) * uy[0]\n",
"\n",
"plt.plot(x, y, 'o-', sx, sy, '.-')\n",
"plt.quiver(x, y, ux, uy, color='r')\n",
"plt.axis('equal');"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Чтобы сделать то же самое для всех точек кривой мы могли бы написать цикл, но зачем если у нас есть NumPy?\n",
"Приведём наши данные к такой форме, чтобы вычислить сканстроки для всех точек кривой без циклов, используя NumPy"
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
" [[-2 -1 0 1 2]\n",
" [-2 -1 0 1 2]\n",
" [-2 -1 0 1 2]\n",
" [-2 -1 0 1 2]]\n",
"\n",
" [[1 1 1 1 1]\n",
" [2 2 2 2 2]\n",
" [3 3 3 3 3]\n",
" [4 4 4 4 4]]\n",
"\n",
" [[5 5 5 5 5]\n",
" [6 6 6 6 6]\n",
" [7 7 7 7 7]\n",
" [8 8 8 8 8]]\n"
]
}
],
"source": [
"# Приведём наши данные к удобной форме с размерностью 2\n",
"# Переход к размерности N+1 позволит векторизовано работать с данными из разных пространств \n",
"# (пространство кривой и пространство модели)\n",
"x2 = np.array(x, ndmin=2)\n",
"y2 = np.array(y, ndmin=2)\n",
"ux2 = np.array(ux, ndmin=2)\n",
"uy2 = np.array(uy, ndmin=2)\n",
"model2 = np.array(model, ndmin=2)\n",
"\n",
"# Далее клонируем модель для соответствия длине кривой\n",
"v_model = model2.repeat(len(x), axis=0)\n",
"\n",
"print('\\n', v_model)\n",
"\n",
"# Далее клонируем координаты точек кривой и векторы направления для соответствия длине модели\n",
"# Мы транспонируем данные для соответсвия длине модели\n",
"len_model = len(model)\n",
"v_x = x2.T.repeat(len_model, axis=1)\n",
"v_y = y2.T.repeat(len_model, axis=1)\n",
"\n",
"v_ux = ux2.T.repeat(len_model, axis=1)\n",
"v_uy = uy2.T.repeat(len_model, axis=1)\n",
"\n",
"print('\\n', v_x)\n",
"print('\\n', v_y)"
]
},
{
"cell_type": "code",
"execution_count": 57,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[-0.41421356 0.29289322 1. 1.70710678 2.41421356]\n",
" [ 0.58578644 1.29289322 2. 2.70710678 3.41421356]\n",
" [ 1.58578644 2.29289322 3. 3.70710678 4.41421356]\n",
" [ 2.58578644 3.29289322 4. 4.70710678 5.41421356]]\n",
"\n",
" [[ 6.41421356 5.70710678 5. 4.29289322 3.58578644]\n",
" [ 7.41421356 6.70710678 6. 5.29289322 4.58578644]\n",
" [ 8.41421356 7.70710678 7. 6.29289322 5.58578644]\n",
" [ 9.41421356 8.70710678 8. 7.29289322 6.58578644]]\n"
]
},
{
"data": {
"image/png": "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\nYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x1d85ea12e80>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Теперь можно считать сканстроки для всех точек кривой\n",
"sx = v_x + v_model * v_ux\n",
"sy = v_y + v_model * v_uy\n",
"\n",
"print(sx)\n",
"print('\\n', sy)\n",
"\n",
"# Построим график. Тут всё же с циклом :)\n",
"\n",
"plt.plot(x, y, 'o-')\n",
"\n",
"for sx_, sy_ in zip(sx, sy):\n",
" plt.plot(sx_, sy_, '.-')\n",
"\n",
"plt.axis('equal');\n"
]
}
],
"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.0"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment