{ "cells": [ { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Dijkstra and Fast Marching Algorithms\n", "=====================================\n", "$\\newcommand{\\dotp}[2]{\\langle #1, #2 \\rangle}$\n", "$\\newcommand{\\enscond}[2]{\\lbrace #1, #2 \\rbrace}$\n", "$\\newcommand{\\pd}[2]{ \\frac{ \\partial #1}{\\partial #2} }$\n", "$\\newcommand{\\umin}[1]{\\underset{#1}{\\min}\\;}$\n", "$\\newcommand{\\umax}[1]{\\underset{#1}{\\max}\\;}$\n", "$\\newcommand{\\umin}[1]{\\underset{#1}{\\min}\\;}$\n", "$\\newcommand{\\uargmin}[1]{\\underset{#1}{argmin}\\;}$\n", "$\\newcommand{\\norm}[1]{\\|#1\\|}$\n", "$\\newcommand{\\abs}[1]{\\left|#1\\right|}$\n", "$\\newcommand{\\choice}[1]{ \\left\\{ \\begin{array}{l} #1 \\end{array} \\right. }$\n", "$\\newcommand{\\pa}[1]{\\left(#1\\right)}$\n", "$\\newcommand{\\diag}[1]{{diag}\\left( #1 \\right)}$\n", "$\\newcommand{\\qandq}{\\quad\\text{and}\\quad}$\n", "$\\newcommand{\\qwhereq}{\\quad\\text{where}\\quad}$\n", "$\\newcommand{\\qifq}{ \\quad \\text{if} \\quad }$\n", "$\\newcommand{\\qarrq}{ \\quad \\Longrightarrow \\quad }$\n", "$\\newcommand{\\ZZ}{\\mathbb{Z}}$\n", "$\\newcommand{\\CC}{\\mathbb{C}}$\n", "$\\newcommand{\\RR}{\\mathbb{R}}$\n", "$\\newcommand{\\EE}{\\mathbb{E}}$\n", "$\\newcommand{\\Zz}{\\mathcal{Z}}$\n", "$\\newcommand{\\Ww}{\\mathcal{W}}$\n", "$\\newcommand{\\Vv}{\\mathcal{V}}$\n", "$\\newcommand{\\Nn}{\\mathcal{N}}$\n", "$\\newcommand{\\NN}{\\mathcal{N}}$\n", "$\\newcommand{\\Hh}{\\mathcal{H}}$\n", "$\\newcommand{\\Bb}{\\mathcal{B}}$\n", "$\\newcommand{\\Ee}{\\mathcal{E}}$\n", "$\\newcommand{\\Cc}{\\mathcal{C}}$\n", "$\\newcommand{\\Gg}{\\mathcal{G}}$\n", "$\\newcommand{\\Ss}{\\mathcal{S}}$\n", "$\\newcommand{\\Pp}{\\mathcal{P}}$\n", "$\\newcommand{\\Ff}{\\mathcal{F}}$\n", "$\\newcommand{\\Xx}{\\mathcal{X}}$\n", "$\\newcommand{\\Mm}{\\mathcal{M}}$\n", "$\\newcommand{\\Ii}{\\mathcal{I}}$\n", "$\\newcommand{\\Dd}{\\mathcal{D}}$\n", "$\\newcommand{\\Ll}{\\mathcal{L}}$\n", "$\\newcommand{\\Tt}{\\mathcal{T}}$\n", "$\\newcommand{\\si}{\\sigma}$\n", "$\\newcommand{\\al}{\\alpha}$\n", "$\\newcommand{\\la}{\\lambda}$\n", "$\\newcommand{\\ga}{\\gamma}$\n", "$\\newcommand{\\Ga}{\\Gamma}$\n", "$\\newcommand{\\La}{\\Lambda}$\n", "$\\newcommand{\\si}{\\sigma}$\n", "$\\newcommand{\\Si}{\\Sigma}$\n", "$\\newcommand{\\be}{\\beta}$\n", "$\\newcommand{\\de}{\\delta}$\n", "$\\newcommand{\\De}{\\Delta}$\n", "$\\newcommand{\\phi}{\\varphi}$\n", "$\\newcommand{\\th}{\\theta}$\n", "$\\newcommand{\\om}{\\omega}$\n", "$\\newcommand{\\Om}{\\Omega}$\n" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "This numerical tours details the implementations\n", "of Dijkstra and Fast Marching algorithms in 2-D.\n", "\n", "\n", "The implementation are performed in Matlab, and are hence quite slow." ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "options(warn=-1) # turns off warnings, to turn on: \"options(warn=0)\"\n", "\n", "\n", "library(imager)\n", "library(png)\n", "\n", "for (f in list.files(path=\"nt_toolbox/toolbox_general/\", pattern=\"*.R\")) {\n", " source(paste(\"nt_toolbox/toolbox_general/\", f, sep=\"\"))\n", "}\n", "\n", "for (f in list.files(path=\"nt_toolbox/toolbox_signal/\", pattern=\"*.R\")) {\n", " source(paste(\"nt_toolbox/toolbox_signal/\", f, sep=\"\"))\n", "}\n", "\n", "source(\"nt_toolbox/toolbox_wavelet_meshes/meshgrid.R\")\n", "\n", "source(\"nt_toolbox/toolbox_graph/perform_dijstra_fm.R\")\n", "\n", "options(repr.plot.width=3.5, repr.plot.height=3.5)" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Installation\n", "------------\n", "*Important:* Please read the [installation page](http://gpeyre.github.io/numerical-tours/installation_python/) for details about how to install the toolboxes." ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Navigating on the Grid\n", "----------------------\n", "We use a cartesian grid of size $n \\times n$, and defines operators to navigate in the grid.\n", "\n", "\n", "We use a singe index $i \\in \\{1,\\ldots,n^2\\}$ to index a position on\n", "the 2-D grid.\n", "\n", "\n", "Size of the grid." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "n <- 40" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "The four displacement vector to go to the four neightbors." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "neigh <- array(c(1, 0, -1, 0, 0, 1, 0, -1), c(2,4))" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "For simplicity of implementation, we use periodic boundary conditions." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "boundary <- function(x){ mod(x,n) }" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "For a given grid index |k|, and a given neighboring index k in ${1,2,3,4}$,\n", "|Neigh(k,i)| gives the corresponding grid neighboring index." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "ind2sub1 <- function(k){ c(as.integer( (k-1-mod(k-1,n))/n + 1 ), mod(k-1,n) + 1) }\n", "sub2ind1 <- function(u){ as.integer( (u[1]-1)*n + (u[2]-1) + 1 ) }\n", "Neigh <- function(k,i){ sub2ind1(boundary(ind2sub1(k) + neigh[,i])) }" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Check that these functions are indeed bijections." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1] 13 27\n", "[1] 134\n" ] } ], "source": [ "print( ind2sub1( sub2ind1(c(13, 27)) ) )\n", "print( sub2ind1( ind2sub1(134) ) )" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Dikstra Algorithm\n", "-----------------\n", "The Dijkstra algorithm compute the geodesic distance on a graph.\n", "We use here a graph whose nodes are the pixels, and whose edges defines the\n", "usual 4-connectity relationship.\n", "\n", "\n", "In the following, we use the notation $i \\sim j$ to indicate that an\n", "index $j$ is a neighbor of $i$ on the graph defined by the discrete\n", "grid.\n", "\n", "\n", "The metric $W(x)$. We use here a constant metric." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "W <- array(1, c(n,n))" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Set $\\Ss = \\{x_0\\}$ of initial points." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "x0 <- c(n/2 + 1 , n/2 + 1)" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Initialize the stack of available indexes." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "I <- c(sub2ind1(x0))" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Initialize the distance to $+\\infty$, excepted for the boundary conditions." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "D <- array(1, c(n,n)) + Inf\n", "u <- ind2sub1(I)\n", "D[u[1],u[2]] <- 0" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Initialize the state to 0 (unexplored), excepted for the boundary point $\\Ss$ (indexed by |I|)\n", "to $1$ (front)." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "S <- array(0, c(n,n))\n", "S[u[1],u[2]] <- 1" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Define a callbabk to use a 1-D indexing on a 2-D array." ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "extract <- function(x,I){ x[I] }\n", "extract1d <- function(x,I){ extract(as.vector(t(x)),I) }" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "The first step of each iteration of the method is\n", "to pop the from stack the element $i$ with smallest current distance $D_i$." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "j <- order( extract1d(D,I) )\n", "j <- j[1]\n", "i <- I[j] \n", "a <- I[j]\n", "I <- I[-c(j)]" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "We update its state $S$ to be dead (-1)." ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "u <- ind2sub1(i)\n", "S[u[1],u[2]] <- -1" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Retrieve the list of the neighbors that are not dead and add to I those that are not yet in it." ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "J <- c()\n", "for (k in 1:4){\n", " j <- Neigh(i,k)\n", " if ( extract1d(S,j)!=-1 ){\n", " # add to the list of point to update\n", " J <- c(J, j) \n", " if ( extract1d(S,j)==0 ){\n", " # add to the front\n", " u <- ind2sub1(j)\n", " S[u[1],u[2]] <- 1\n", " I <- c(I, j)\n", " }\n", " }\n", "}" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "image/png": "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\n2ALMMgAAAABJRU5ErkJggg==", "text/plain": [ "Plot with title \"\"" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "imageplot(S)" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Update neighbor values.\n", "For each neightbo $j$ of $i$, perform the update,\n", "assuming the length of the edge between $j$ and $k$ is $W_j$.\n", "$$D_j \\leftarrow \\umin{k \\sim j} D_k + W_j.$$" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "DNeigh <- function(D,k){ extract1d(D,Neigh(j,k)) }\n", "for (j in J){\n", " dx <- min(DNeigh(D,1), DNeigh(D,2))\n", " dy <- min(DNeigh(D,3), DNeigh(D,4))\n", " u <- ind2sub1(j)\n", " w <- extract1d(W,j);\n", " D[u[1],u[2]] <- min(dx + w, dy + w)\n", "}" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "__Exercise 1__\n", "\n", "Implement the Dijkstra algorithm by iterating these step while the\n", "stack |I| is non empty.\n", "Display from time to time the front that propagates." ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAJYCAIAAAAxBA+LAAAABmJLR0QA/wD/AP+gvaeTAAAU\nAUlEQVR4nO3dX48c1YHG4TObBCS3hx28a5TIchbsCxA3Jp8AvlmUbwafIHCD4MKQLLJ2hSM8\ny0xbwlHUezF12mZ6eqqqq/pfvc9zkYzs9kxjZfTm/Oiec7JYLAoApPq3fT8BANgnQwhANEMI\nQDRDCEA0QwhANEMIQDRDCEA0QwhANEMIQDRDCEA0QwhANEMIQDRDCEA0QwhANEMIQDRDCEA0\nQwhANEMIQDRDCEA0QwhANEMIQDRDCEA0QwhANEMIQDRDCEA0QwhANEMIQDRDCEA0QwhANEMI\nQDRDCEA0QwhANEMIQDRDCEA0QwhANEMIQDRDCEA0QwhANEMIQDRDCEA0QwhANEMIQDRDCEA0\nQwhANEMIQDRDCEA0QwhANEMIQDRDCEA0QwhANEMIQDRDCEA0QwhANEMIQDRDCEA0QwhANEMI\nQDRDCEA0QwhANEMIQDRDCEA0QwhANEMIQDRDCEA0QwhANEMIQDRDCEA0QwhANEMIQDRDCEA0\nQwhANEMIQDRDCEA0QwhANEMIQDRDCEA0QwhANEMIQDRDCEA0QwhANEMIQLTf7vsJTM3JX/b9\nDKZr8ed9PwOOge/B7Znq96ATIQDRDCEA0QwhANEMIQDRDCEA0QwhANEMIQDRDCEA0QwhANEM\nIQDR/Ig1gL1ZLJoPTk72+jyyORECEM0QAhBNGgXYtWURPf/yZfMrn9y5+kAj3T0nQgCiGUIA\nokmjADuyWkTPv35Wf/NB8xiNdOecCAGIZggBiCaNAmzXLUX0/NnXKw/XSHfNiRCAaIYQgGjS\nKMBWdCmi5y//2jzoWVmhke6IEyEA0QwhANGk0Wg/fv7i6oP3Pnt3v88EJqNXET2/82Xz6Jf1\nz7c1UoF0dE6EAEQzhABEk0YTLYvo86++an6lPLn6QCOFzWxWRM8f1DfUL4toWyP1ItLROREC\nEM0QAhBNGg1yQxF98Xnze1/Vx2ik0MfAInr+8UoAbW+k3mg/MidCAKIZQgCiSaPTd0sRff7u\nF82DXtRHa6TQzVUUHVhE/+9P618kqpHuihMhANEMIQDRpNHJ6lJEnz+pJbT+t0YKt7v2MtGB\nRfS8Vs3b3kh/rZG6sGlsToQARDOEAESTRqemVxF9/tlKCW1rpAIpmda9cX5gET3/+EH9Ch1+\n2Oizlt/XSDfjRAhANCfCidjsIPjjp8vjXdejodfOEKX1J6gNPAieP/h45Wu2HQ0731NRHA27\ncSIEIJohBCCaNHrcBhbR50+e1M+0/kUy137H+wsJ0P1OiYFF9PzOn5qvtHzRzGsa6Y44EQIQ\nzRACEE0aPVZXUXRgEX3+7mfNp1sm0tZG6mewMV0b3LI7sIiev/yk+ZLLH7XW3kg3uKeiaKS3\ncCIEIJohBCCaNHpkrr1MdGARff7i0+bzLqNmayN1TwWTs0ERLTWKDiyi58/qG+qXRbS9kQ65\ny7dopKucCAGIZggBiCaNHod1b5wfWER//KqW0GURbW+k7vJlIoYU0VKj6MAiev71SgBtb6Sd\n76m49SEa6ZITIQDRDCEA0aTRg9b6o0QHFtHnX6yU0PZG2vsu36KRcpCGFNFSo+jAInr+5foX\niWqku+JECEA0QwhANGn0oC2L4rIxrnsJ522B8rbaWdNlTaz368tQ79cGe79W2fe+eFFKuf/5\nu/XXn9RHNsX1vdpg7z9RRDkCZ5+sz5KdimLb29s7vUe++aWzWlzPaoM9q1X2rHbas2dfl1LO\nasg9q2n33//afIGzWlzPaoM9q1X2rHbas1puz2rLPUstoktOhABEM4QARJNGj8P9T1ey5pqX\ncG7WSFuLaKlRtEsRfePZwuFalsDFoEbaoaJ2aKStRbTUKKqIjs6JEIBohhCAaNLocXjdcK41\n0vUdtFcjbS2ipUbRLkVUaeG4HEIjbS2ipUZRRXR0ToQARDOEAESTRo/MSiNd80b70q+RthbR\nUqOoIsqEbdJI177RvvRqpK1FtNQoqoiOzokQgGiGEIBo0uixuuob119EWjZspK1FtNQoqoiS\noEcjbf9hpLc+aPmq0bYiWmoUVURH50QIQDRDCEA0afS4rX2jfenXSLtfrqSIEqW9kfa4sOm2\nB3W/XEkRHZ0TIQDRnAgnYuDRsPudEv4PJpm2fTTsfqeEg+DonAgBiGYIAYgmjU7NZo3UnRLQ\n0Uoj3eCeihse1P1OCUV0dE6EAEQzhABEk0Ynq1cjVUShr+bHHA66y/f1L3W/U0IRHZ0TIQDR\nDCEA0aTR6evSSBVR2Mwmd/mWGxpp9zslFNHRORECEM0QAhBNGg1ySyNVRGGggY20+50SvklH\n50QIQDRDCEA0aTTRaiMVW2AsmzVSlyvtkRMhANEMIQDRpNFoSgtsT69GqojukRMhANEMIQDR\npFGA7erSSBXRPXIiBCCaIQQgmjQKsCO3NFJFdI+cCAGIZggBiCaNAuzaaiNVRPfIiRCAaIYQ\ngGjSKMDeKKKHwIkQgGiGEIBohhCAaIYQgGiGEIBohhCAaIYQgGgni8Vi388BAPbGiRCAaIYQ\ngGiGEIBohhCAaIYQgGiGEIBohhCAaIYQgGiGEIBohhCAaIYQgGiGEIBohhCAaIYQgGiGEIBo\nhhCAaIYQgGiGEIBohhCAaIYQgGiGEIBohhCAaIYQgGiGEIBohhCAaIYQgGiGEIBohhCAaIYQ\ngGiGEIBohhCAaIYQgGiGEIBohhCAaIYQgGiGEIBohhCAaIYQgGiGEIBohhCAaIYQgGiGEIBo\nhhCAaIYQgGiGEIBohhCAaIYQgGiGEIBohhCAaIYQgGiGEIBohhCAaIYQgGiGEIBohhCAaIYQ\ngGiGEIBohhCAaIYQgGiGEIBohhCAaIYQgGiGEIBohhCAaIYQgGiGEIBohhCAaIYQgGiGEIBo\nhhCAaIYQgGiGEIBohhCAaIYQgGiGEIBohhCAaIYQgGiGEIBohhCAaIYQgGiGEIBohhCAaIYQ\ngGiGEIBohhCAaIYQgGiGEIBohhCAaIYQgGiGEIBohhCAaIYQgGiGEIBohhCAaIYQgGiGEIBo\nhhCAaIYQgGiGEIBohhCAaIYQgGiGEIBohhCAaIYQgGiGEIBohhCAaIYQgGiGEIBohhCAaIYQ\ngGiGEIBohhCAaIYQgGiGEIBohhCAaIYQgGiGEIBohhCAaIYQgGiGEIBohhCAaIYQgGiGEIBo\nhhCAaIYQgGiGEIBohhCAaIYQgGiGEIBohhCAaIYQgGiGEIBohhCAaIYQgGiGEIBohhCAaIYQ\ngGiGEIBohhCAaIYQgGiGEIBohhCAaIYQgGiGEIBohhCAaIYQgGiGEIBohhCAaIYQgGiGEIBo\nhhCAaIYQgGiGEIBohhCAaIYQgGiGEIBohhCAaIYQgGiGEIBohhCAaIYQgGiGEIBohhCAaIYQ\ngGiGEIBohhCAaIYQgGiGEIBohhCAaIYQgGiGEIBohhCAaIYQgGiGEIBohhCAaIYQgGiGEIBo\nhhCAaIYQgGiGEIBohhCAaIYQgGiGEIBov933E5iak7/s+xlM1+LP+34GHIMD/B5cLJoP5t/9\ns/ngbz83Hzx7fvXB7MH95oP332k+ePS7qw9OTnbyLDuY6vegEyEA0QwhANGk0Wg/f/Pq6oN3\n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\n7Uba/XIlRXR0ToQARDOEAESTRidiYCPtfrmS5EK4lUba/1L7ckMj7X65kiI6OidCAKIZQgCi\nSaNTs1kjdbkS9NX8UIsNLrUvNzTS7pcrKaKjcyIEIJohBCCaNDpZvRqpIgqb2eSN9uWGRtr9\nciVFdHROhABEM4QARJNGp69LI1VEYaCBjbT75Uq+N0fnRAhANCfCILccDR0EYSybHQ3dKbFH\nToQARDOEAEQ7WSwW+34OALA3ToQARDOEAEQzhABEM4QARDOEAEQzhABEM4QARDOEAEQzhABE\nM4QARDOEAEQzhABEM4QARDOEAEQzhABEM4QARDOEAEQzhABEM4QARDOEAEQzhABEM4QARDOE\nAEQzhABEM4QARDOEAEQzhABEM4QARDOEAEQzhABEM4QARDOEAEQzhABEM4QARDOEAEQzhABE\nM4QARDOEAEQzhABEM4QARDOEAEQzhABEM4QARDOEAEQzhABEM4QARDOEAEQzhABEM4QARDOE\nAEQzhABEM4QARDOEAEQzhABEM4QARDOEAEQzhABEM4QARDOEAEQzhABEM4QARDOEAEQzhABE\nM4QARDOEAEQzhABEM4QARDOEAEQzhABEM4QARDOEAEQzhABEM4QARDOEAEQzhABEM4QARDOE\nAEQzhABEM4QARDOEAEQzhABEM4QARDOEAEQzhABEM4QARDOEAEQzhABEM4QARDOEAEQzhABE\nM4QARDOEAEQzhABEM4QARDOEAEQzhABEM4QARDOEAEQzhABEM4QARDOEAET7fxWyjzAuRfTw\nAAAAAElFTkSuQmCC", "text/plain": [ "Plot with title \"\"" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "options(repr.plot.width=5, repr.plot.height=5)\n", "\n", "source(\"nt_solutions/fastmarching_0_implementing/exo1.R\")\n", "D <- exo1(x0,W)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "## Insert your code here." ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Display the geodesic distance map using a cosine modulation to make the\n", "level set appears more clearly." ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "Plot with title \"\"" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "displ <- function(D){ cos(2*pi*5*D/max(D) ) }\n", "\n", "# color map function\n", "cmap_jet <- function(v){ return( rgb(v, (sin(v*2*pi)+1)/2, (cos(v*2*pi)+1)/2) ) }\n", "\n", "options(repr.plot.width=3.5, repr.plot.height=3.5)\n", "\n", "plot(as.cimg(displ(D)), colourscale=cmap_jet, interpolate = FALSE, axes = FALSE)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true, "deletable": true, "editable": true }, "source": [ "Fast Marching\n", "-------------\n", "The Dijstra algorithm suffers from a strong metrization problem, and it\n", "actually computes the $\\ell^1$ distance on the grid.\n", "\n", "\n", "The Fast Marching algorithm replace the graph update by a local\n", "resolution of the Eikonal equation. This reduces significantly the grid\n", "bias, and can be shown to converge to the underlying geodesic distance\n", "when the grid step size tends to zero.\n", "\n", "\n", "Over a continuous domain, the distance map $D(x)$ to a set of seed\n", "points $\\Ss$ is the unique solution in the viscosity sense\n", "$$\\forall x \\notin \\Ss, \\quad \\norm{\\nabla D(x)} = W(x)\n", " \\qandq\n", " \\forall y \\in \\Ss, \\quad D(y) = 0.$$\n", "\n", "\n", "The equation is then discretized on a grid of $n \\times n$ pixel, and a\n", "solution $(D_{k,\\ell})_{k,\\ell=1}^n \\in \\RR^{n \\times n}$ is found by using\n", "an upwind finite difference approximation, that is faithful to the\n", "viscosity solution\n", "$$\\forall (k,\\ell) \\notin \\tilde \\Ss, \\quad\n", " \\norm{ (\\nabla D)_{k,\\ell} } = W_{k,\\ell}\n", " \\qandq\n", " \\forall (k,\\ell) \\notin \\tilde \\Ss, \\quad D_{k,\\ell}=0,\n", "$$\n", "where $\\tilde \\Ss$ is the set of discrete starting points (defined here\n", "by |x0|).\n", "\n", "\n", "To be consisten with the viscosity solution, one needs to use a\n", "non-linear upwind gradient derivative. This corresponds to computing\n", "the norm of the gradient as\n", "$$\\norm{ (\\nabla D)_{k,\\ell} }^2 =\n", " \\max( D_{k+1,\\ell}-D_{k,\\ell}, D_{k-1,\\ell}-D_{k,\\ell}, 0 )^2 +\n", " \\max( D_{k,\\ell+1}-D_{k,\\ell}, D_{k,\\ell-1}-D_{k,\\ell}, 0 )^2.\n", "$$\n", "\n", "\n", "A each step of the FM propagation, one update $D_{k,\\ell} \\leftarrow d$\n", "by solving the eikonal equation with respect to $D_{k,\\ell}$ alone.\n", "This is equivalent to solving the quadratic equation\n", "$$(d-d_x)^2 + (d-d_y)^2 = w^2 \\qwhereq w=W_{k,\\ell}.$$\n", "and where\n", "$$d_x = \\min(D_{k+1,\\ell},D_{k-1,\\ell}) \\qandq\n", " d_y = \\min(D_{k,\\ell+1},D_{k,\\ell-1}).$$\n", "\n", "\n", "The update is thus defined as\n", "$$\n", " d = \\choice{\n", " \\frac{d_x+d_y+ \\sqrt{\\De}}{2} \\quad\\text{when}\\quad \\De \\geq 0, \\\\\n", " \\min(d_x,d_y)+w \\quad \\text{otherwise.}\n", " }\n", " \\qwhereq\n", " \\De = 2 w^2 - (d_x-d_y)^2.\n", "$$\n", "\n", "\n", "Note that in the case where $\\De<0$, one has to use the Dijkstra\n", "update.\n", "\n", "\n", "Once the Dijstra algorithm is implemented, the implementation of the Fast\n", "Marching is trivial. It just corresponds to replacing the graph udpate" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "D[u[1],u[2]] <- min(dx + w, dy + w)" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "by the eikonal update." ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "Delta <- 2*w - (dx-dy)**2\n", "if (Delta>=0){\n", " D[u[1],u[2]] <- (dx + dy + sqrt(Delta))/ 2 } \n", "if (Delta<0){\n", " D[u[1],u[2]] <- min(dx + w, dy + w) }" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "__Exercise 2__\n", "\n", "Implement the Fast Marching algorithm.\n", "Display from time to time the front that propagates." ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAJYCAIAAAAxBA+LAAAABmJLR0QA/wD/AP+gvaeTAAAg\nAElEQVR4nO3d25Mj13Hn8QSqCoVL3+fGGZLiUBJlrezY1TpCftvYN/9bDv9V+y841hFe70as\nrTUlDq9z70Z3446qAvahfnnQ7JEZsjTksDu/nxeeQQOFKhDV2ZWV52Rnu90aAABRdd/1DgAA\n8C4RCAEAoREIAQChEQgBAKERCAEAoREIAQChEQgBAKERCAEAoREIAQChEQgBAKERCAEAoREI\nAQChEQgBAKERCAEAoREIAQChEQgBAKERCAEAoREIAQChEQgBAKERCAEAoREIAQChEQgBAKER\nCAEAoREIAQChEQgBAKERCAEAoREIAQChEQgBAKERCAEAoREIAQChEQgBAKERCAEAoREIAQCh\nEQgBAKERCAEAoREIAQChEQgBAKERCAEAoREIAQChEQgBAKERCAEAoREIAQChEQgBAKERCAEA\noREIAQChEQgBAKERCAEAoREIAQChEQgBAKERCAEAoREIAQChEQgBAKERCAEAoREIAQChEQgB\nAKERCAEAoREIAQChEQgBAKERCAEAoREIAQChEQgBAKERCAEAoREIAQChEQgBAKERCAEAoREI\nAQChEQgBAKERCAEAoREIAQChEQgBAKERCAEAoREIAQChEQgBAKERCAEAoREIAQChEQgBAKER\nCAEAoREIAQChEQgBAKERCAEAoREIAQCh5e96B26bzt+/6z24vbZ/9673ADcB5+D357aeg1wR\nAgBCIxACAEIjEAIAQiMQAgBCIxACAEIjEAIAQiMQAgBCIxACAEIjEAIAQiMQAgBCIxACAEIj\nEAIAQiMQAgBCIxACAEIjEAIAQiMQAgBCIxACAEIjEAIAQiMQAgBCy9/1DgDALbfdarAea1RP\nmnbQLDbtIBvosiTfz9pB77jTDjqdH2QvA+OKEAAQGoEQABAaqVEAeJuapQaLZ3U7OHuph9bn\ni3ZQTzVo1ut2kPV67SDfG7SD3pEG0/v9djB4mJtZ1v++9jwsrggBAKERCAEAoZEaBYC3YP6V\nCkHHX83aweLFRTtYjccaTM/bQbW6bAdNrRxplisRWpQH7aDcO9Lg6XE7WD47NLP5h6P2n8MP\ns7d+FDFxRQgACI1ACAAIjdRoaOsLTe/tHTJlF/iPadZmZtNPV+0/z79Q2nP+/KUG58/awXLx\nvB2s6lftoNoqWVp3lEfNV0p4FnMlQsvJvXbQP39PLx8/NLP1+f32nxeXyp3ufVK2g6z3Fo4r\nIK4IAQChEQgBAKGRGr39li+1mOH8S9WnLV9N28GzybwdPN0ftoP+vb12MPyJatj69/lrCdip\nddLY5W/nZjZ5omzn9Nk37WB++bkG6y/bwaL7dTtY9pQ1rfqeGu1pc/la52CxVGq0XykFOrj8\noB2slz8xs/X8sV67eL8dbFZKota/1Eby4Z98fBHxOw4AEBqBEAAQGqnRW+vsH1WN9uKJsjGz\nl0/bwXKqGrZ1pTq3XqHys/6e6tNGnz3Sdj5WfubkN6Pvd4+Bm2DyWyUzL3/3wswmTz/X45NP\n28Gs+Z0G/SftYLGvrOny6LQdrA4n7aAeqeg0n6nys7zYbwf98zt61eRFO1gvz8ysGuvWxqbW\na7fNxvfuQfuf5q+UG6WO9I/BFSEAIDQCIQAgNFKjt0QqDT3/Z+VeXn6mtMzk9N/awbRS6mae\nf9UO1uVZO+itT9rB8PWH7WDv4pN2sDj7RTt4Pv7YzI5+rXQN1aQI5eL/Kg954WWibVL08vJf\n9U/7Fw32PTV6T1Wj8/det4PFQ2VEV/fUfak60JlbXOqEKl+poHTwzFcofe4rlL6amFkzU252\ne1lf28lOpo10S93jsL8s/0OHGRO/ywAAoREIAQChkRq92VJG9OwfVRp69qnyM+OL/9UOLrL/\n0w6m97yq7Z6vfHiiXjDlmTq/jF4pozIbf663eKGKtXo5NbNN9Ss9/htVk5IjxS2WmiulpUTT\nxPm2TDRlRC8PPEf68HMNHnvB9sdKZi5+ohN2+Z5+91aHSl0WF1U76D9XO/vll0qfrp94O/ty\nZWbbZ3qm6fS1zkRb6z7T1vKB2tjPD+62A3o2fQd+hQEAQuOK8GZLpTHpQvD0/B/0yPB/6jkf\n+F+sn2ge4fRn+vt0+VDdJ/rPVDWz93v9Dbv4VLf3q6/VXHRzvjIz01WldQv/A/Nv772dgwF+\nNBpdle267O56SvgKau18wVQaky4ELz9RxuXylzrRpr/QyTL/6LAdLO5rsD7QrMHepepoBi+9\nne9dzRes9zTYFmm+oJlZpynaQTbx5dkutURi77lv9khrJTb3lPXJ+t914DFxRQgACI1ACAAI\njdToTdWuoJYmC6bSmJQRPf2ZP/JrdQe9+GvNOrr8Cy2WtnioldUGz1QIcPD/lAhanXzeDtr7\n82Zmvzcz61743fjP9nxPlJZhDTbcGotnOlkWL5SoTF12U0+JdgW1NFkwlcakjOjlXyl1OfmF\nGkpM33+ojRypccS6VDFL765uRgxPVIxT7esdN72x79fczDqV3ihbeaFN5YnQpSYE98612fKF\nr574zBtSfMyv/eu4IgQAhEYgBACExjXyDZMmDrY9JdLyaWmyYKoRTRnR0//mcw3/WmmZi8c/\nawezg4/awejDL7T9+79vB/Xohb+nttPmYYrPVO3WP9U694MnqhpdfqStMbMQN9RWZdR29lJl\no6ux0pLLhWpBU5fdtqdEWj4tTRZMNaIpI3r5+LEGJ1q5cFboHFxu1Oalv6ei7nWpV22K66uj\nddenZpZP9Ua9C711OVE2tb/WWdlfPPL918zg1UttdvtYNzU6nT/4GUTELywAQGgEQgBAaKRG\nb5j5l1psqe2ymxpKpOXT0qz5VCOaMqKv/+LX7WC89zd68krrpR3cUUK1Kvf9rf65/U8+U2q0\nPHtqZoOx3mj06rEGLz/2fdOia3af8lHcSOuxcqPrc51oq6kKqle1mk4seyrabLvspoYSafm0\nNGs+1YimjOhl8Z81mP9STz7/oB0Mj5RxbYZ++qgC1LqVKreLycrMytcqZO2/8Dn4r7SwxvJS\n+7Zav7q2/+mI1uO0fXKjwhUhACA0AiEAIDRSozfM8pVWHVxOn9uVFrupoURaRzTNmk81oikj\n+mr839vB2afKz6w+8fVCVVlmxWNlXfovtcT98MnMzPae6I3m46+u7snVfTMjNYobqZ6o10Q9\nVSKxWun7X21VPlr1vV/u4cSutNhNDSXSOqJp1nyqEU0Z0Ytv/lM7mHymqs7qp35XQi+ybKjV\nLXpHesf+/bGZDd7zVS/8rds9ubpv1SoNLq8dUTpGO+H3v3BFCAAIjUAIAAiNS+ObYX2hYrZn\nE2U+19W5ma1LtU9KLXZTZ6W0jmiaNZ9qRFNG9Nn/eO/aG5X/RcVmo4Pf+Xae+JanV99o3dNb\nr1cqS6vSvvne9g4pS8NN0ixU+dmslXVsas8odpSQrHv6ntejlZlVB3pJarGbOiuldUTTrPlU\nI5oyoqf/kOq0pRh5LWj/2bXttFuuDrWEaXXg+zZaXd8339u0/7sjWnyrlxOMK0IAQHAEQgBA\naKRGb4aUY3y6r14qveLIzHprzbktz9R+OvWaT52V0jqiadb8rkbUnXzyWz2n1HNGp19c207/\n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\nBEIAQGgEQgBAaARCAEBoBEIAQGgEQgBAaARCAEBoBEIAQGgEQgBAaARCAEBoBEIAQGgEQgBA\naARCAEBoBEIAQGgEQgBAaARCAEBoBEIAQGgEQgBAaARCAEBoBEIAQGgEQgBAaARCAEBoBEIA\nQGgEQgBAaARCAEBoBEIAQGgEQgBAaARCAEBoBEIAQGgEQgBAaARCAEBoBEIAQGgEQgBAaARC\nAEBoBEIAQGgEQgBAaARCAEBoBEIAQGgEQgBAaARCAEBoBEIAQGgEQgBAaARCAEBoBEIAQGgE\nQgBAaARCAEBoBEIAQGgEQgBAaARCAEBoBEIAQGgEQgBAaARCAEBoBEIAQGgEQgBAaARCAEBo\nBEIAQGgEQgBAaARCAEBoBEIAQGgEQgBAaARCAEBoBEIAQGgEQgBAaARCAEBoBEIAQGgEQgBA\naARCAEBoBEIAQGgEQgBAaARCAEBoBEIAQGgEQgBAaARCAEBoBEIAQGgEQgBAaARCAEBoBEIA\nQGgEQgBAaARCAEBoBEIAQGgEQgBAaARCAEBoBEIAQGgEQgBAaARCAEBoBEIAQGgEQgBAaARC\nAEBoBEIAQGgEQgBAaARCAEBoBEIAQGgEQgBAaARCAEBoBEIAQGgEQgBAaARCAEBoBEIAQGgE\nQgBAaARCAEBoBEIAQGgEQgBAaARCAEBoBEIAQGgEQgBAaARCAEBoBEIAQGgEQgBAaARCAEBo\nBEIAQGgEQgBAaARCAEBoBEIAQGgEQgBAaARCAEBoBEIAQGgEQgBAaARCAEBoBEIAQGgEQgBA\naARCAEBoBEIAQGgEQgBAaARCAEBoBEIAQGgEQgBAaARCAEBoBEIAQGgEQgBAaARCAEBoBEIA\nQGgEQgBAaARCAEBoBEIAQGgEQgBAaARCAEBoBEIAQGgEQgBAaARCAEBoBEIAQGgEQgBAaARC\nAEBoBEIAQGgEQgBAaARCAEBoBEIAQGgEQgBAaARCAEBoBEIAQGgEQgBAaARCAEBoBEIAQGgE\nQgBAaARCAEBoBEIAQGgEQgBAaARCAEBoBEIAQGgEQgBAaARCAEBoBEIAQGgEQgBAaARCAEBo\nBEIAQGgEQgBAaARCAEBoBEIAQGgEQgBAaARCAEBoBEIAQGgEQgBAaARCAEBoBEIAQGgEQgBA\naARCAEBo+bvegdum8/fveg9ur+3fves9wE3AOfj9ua3nIFeEAIDQCIQAgNBIjQLAO7PdatDp\nvNP9iI0rQgBAaARCAEBopEYB4HtRL3ww3bSDZqHBZqmU6KTWI5NclyXdvpKk2UCP5Hs+GHyv\n+xsXV4QAgNC4IgSAt2B1qou86rxuB5OJBvV03Q6aRdUONmv9aFM37aCbZxr09Gs5GxTtIN/r\ntYPpfm5mxZGeUN6hwObt4IoQABAagRAAEBqp0dsvTVSqpxo1Cw02aw26vXR/XoN8TwOmNwF/\n0Opsa2br18p2Ts9W7WB9sWwH9VTVMtVCg2alHzWVnrxtlCPtZJ4RLUoNyn47KAYqksn3BmbW\nO9Tjk1M9s3dXSdTyhNP1T8EVIQAgNAIhACA0UqO3TTVRtnN9pmq0i4t/v3St8oq1QhVrbxaq\nzQ71JemdZGZW7JN7QUSNcpm2fK4TavZyZWar01n7z/XFVIPJpB1UCx+s9aOm0pObRjnSzVYn\nY7ejUy/LlPnMilE7KHp7Ggz2zax3vt/+s3eux8sLPXM2UbK0/54nWss/4VjD4YoQABAagRAA\nEBqp0Zut8kLQladrLl8r5bIeq1BtPVE2pn6zdK1WsjTLlQhNhWq5F6r19pV16R0PzGx6V08o\nPfdS7JEsxa1VXegUmz1VDnP5QifU8vTSzFbn5+0/V9NxO1gvNagq/ahqLttBs/Ucqelk3JjO\nwa75OVjp1MtWnhHNDjSYH5lZb3bc/rOcalDNjtpBPdMzm7lO2+qRMq7FIefpv4srQgBAaARC\nAEBopEZvqvk3jZlNnirJuXyl+rTVmZIwq4mnZRYXGqz1o7qZt4PNRpVw3a5qy/Js2A6Knmdj\nBoftoDw9MrPyTI/3xypdmz9SsnT4fvY2jgx499rJ8mY2+1rnyOKZTrHla2U+l+enZracvdJL\nVhqsm1MN7Kwd1F2dg3WujdSZp0YzT402So3mjU+fb3SK5bXOwV59Yma99Z32n9Xqnra21Bnd\nLLW3zcrXMq20kdUHOseZdP8mrggBAKERCAEAoZEavWEmn/rCht9MzWzxQlmaxfh1O1hNfbBM\niRrlZ6qtkqV1R2Vvm44yq93ai0Urn8O7Uh1ab37SDsrZPTMrp3e1tYkGtdewTeYqctv/pPhz\njhF4V1JGdP6lTo3FU91QWLzUmbU4f9kOlvPnZrasnuu12xcaZHrmuuenXum3J0qvGu35hPrC\nJ9RXPqF+7UuMpqrRladG1ydmVjZ+6i28GLX2efqVb7bSZreNGv9uN7qpsTIv/CZH6rgiBACE\nRiAEAIRGavRmuPwXFYNNv1IyZP78lZktxkrLLGbP2sGy1mBlKVGjGraq8NRo4fmZXJvNaq8a\nrTwbUyk1WjYqUStnD8ysv3qojSynPvDp+V7DdlkpCXPwKxY6xA2wmzWfakQ9Izp/oVsMi7HO\nrMX8qQb1N2a27Oqfy9LPuIGnRkc+xX5PJ0s18vLOoYpFNz2Vd3bXvjroXOWjxUwl3L2pzsre\nbGxX6sDrtITp2mtQN9rsdqPNblMbNtfpKiNa+TqkzLXnihAAEBqBEAAQGqnRH7VdRvQLZTVn\nT5V+mY+/MbP5/Mv2n4vNVxrkStSs+p6oGfr03pFPqB/6oqOlrzW68sm8c19i1BctLOeeGl2e\n2pXlE+tLT8vU2slN7dmYjQrVLk35VXKk+DFb+Dqiadb8rkbUM6LzuU6xee3nWvaVmS0Hfldi\n36tJD5URXR3rjFsf6YyrD/RG9Z5Olqav1GW2VH4yn+rXcn6pnemdazvleGpmtfd7aiaeaF14\nsWjtxaLz5toxdjrafifT9U+36Po+pKWGLSauCAEAoREIAQChkRr9MdrNmvca0ZQRnZ0pFzqb\nPzGzuX3e/nPe9xzpntewHfnM+hPVmK12+RlvVT9Q/iRbaJnQ/FJJkvJcc4HLM+V5+ufnZlZP\nla5pVl6oNvNCte0b2Ziu/tKaFMqRMtcePx6zL7zXfOqs5OuIplnzqUY0ZUTn+Rf60fBrM1sc\n6dxc3NE9iNU9X5X0nrdCu6M3qo6VCK33lahs+hpkS91QyCe611CMdWb1TvVI/WplZvUrr9Mu\nvPT0PGVEtRHTG1pnrlO709Vv+27hM/dLr1Md+hXRR0EjAleEAIDQCIQAgNCCXgj/OLWdlczX\nETWfNW9eI2qeETWzmf3OzGaDz/WEo681uO8pnQfKiC4feM/6u56fOfL8zMgL1WZKrRTnSsL0\nXiur03+hyrTqxdzMmpden3buGdGFZ2H0ROt0lI3p5p578STMfKhiVHo24V3ZtVh6qW9722ve\nvLOS+Tqi5rPmzWtEzTOiZjY/eWpmi/t6yeI9X5X0kc6R1QMlKlf3dcmxPlZasjrQoOn7ObLU\neVRc6mTsjfVI+dJrTfcbM2v6Xp5d6DfGtvvGXYmZl4bWeqOuz9PPzrXWaNb3ZTRG+tFqX2dl\ntGVIuSIEAIRGIAQAhEZq9N2rpkrUpHbzV5orKT+TJs6nMtE2KTq9owK2+UMvK/1AE94XH3ja\n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\n5lNnpbSOaJo1n2pEU0Z0OPPbE+OXZtZ/7eWpL/0ex8uN71vhe+v3KXz/0xHlGz/G3G9hpM/h\n2zcs0kd360U5TgAA/iACIQAgNFKj70zvRCsf9o6VjihPlSQpZ/d8oDbW5dKnyZ97VvPF3Mzq\nkbd3Hyhjuc2n196oWyt9mp+oxqztNW9XejalFUrbWfPmNaLmGVEzG30+NbPh50rCDL5WRnTw\n4tD37a7vre+2+aDvR7TvdbB+1OlzAL4PuS8jMd33GfF7nhodeI3o3L+WtXL4vbUPZroZUY51\nZtWvlBqt9xu7cg5uSpWVbvLrFxidjZ+DQ58CX2izbWclu7JCaTtr3rxG1DwjamaDl6dmNnjm\nldvP9NblC71j/5X/Mhkf+P4fXz8ib9BW+FIb6XPYfTL7uV356G49rggBAKERCAEAoZEafWeK\nfVVJTu+mqkufNT9VjrG/etgOqkoZ0XqqrEjzcmlX2k9v87FvWHmbTq1nZgtv1TRRWmZ9qGxn\najefmiulpUTTxPlUJtomRUdPNC1/9LXyKsOX9/XM6SMNag36hfa/3POs6Ykfox91+hyA71Vx\n5HXah/ru9c6VErySP0wFz/rGVr6wZ32RUqNeod2vzWzTU+nm1ju/m+klXe/wnq29WPRQG+n5\neqSp3XxqrrRbs9Qnzqcy0TYpOvhKWxt8rXNn8NR/h7zSEfUvdETlwk89P6Je5rXcfT/qff8c\n/JNJn1UQXBECAEKLFfZ/nMr39H+hP9bfZdVEf7vVS/8j9FKDZqU/PzfnazPbZM21rXVq/RWZ\nLdIa+f6X5qn+kKyOdbVXjzTraNfg15ePSiuopfmCbXXM7kLwmQphhucfaLD6iZ7Z/VCDka4I\nB8d+jXtv/9pRAz+M8o6+yZNTZTV655o/V051bVStVNVVLzTPr177qecJlabQObItGjPbZqlb\nra4UO41Ove5KV4T53K8Ij2d6oz2lcJoyNd/2E9Z7SqQV1NJ8wbY6Jl0IDr/ygrXnSrQMTnW1\n158oT9Nfe8FaxwelV67t+RXhoc+VPNHOpM8qCK4IAQChEQgBAKGRnnr3Cu+6MH+kREftt+7r\npd+Wr5U22cw8LbOozcx0x926jWbjddc+WWrm3TvPtZHyha/HdqSUSz3ytepnW3+yHkk9JdIK\nau18wVQakzKio8VjPWI+GHqO9Pg9DR7oiPp+jAW9JvCO9O56v5QLLX1WzZTwr5ee/6yVw2zW\n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\nrkJggg==", "text/plain": [ "Plot with title \"\"" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "options(repr.plot.width=5, repr.plot.height=5)\n", "\n", "source(\"nt_solutions/fastmarching_0_implementing/exo2.R\")\n", "D <- exo2(x0,W)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "## Insert your code here." ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Display the geodesic distance map using a cosine modulation to make the\n", "level set appears more clearly." ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaQAAAGkCAIAAADxLsZiAAAABmJLR0QA/wD/AP+gvaeTAAAg\nAElEQVR4nO3daXiV5dX28Y2BEIaEBAIJEEMgMoVBCJMoRoaAioCCKKIVqVqnqtUqVmsVx1pR\ni1qqWLVlKCqVogIqGMaIAkLCGEbBAAEDhBDCPD/fknVe73H0+dYnx7v+v0+cxw47+973dnF7\nr31dq9qFCxciAPD/u4v+r18AAPw3UOwAuECxA+ACxQ6ACxQ7AC5Q7AC4QLED4ALFDoALFDsA\nLlDsALhAsQPgAsUOgAsUOwAuUOwAuECxA+ACxQ6ACxQ7AC5Q7AC4QLED4ALFDoALFDsALlDs\nALhAsQPgAsUOgAsUOwAuUOwAuECxA+ACxQ6ACxQ7AC5Q7AC4QLED4ALFDoALFDsALlDsALhA\nsQPgAsUOgAsUOwAuUOwAuECxA+ACxQ6ACxQ7AC5Q7AC4QLED4ALFDoALFDsALlDsALhAsQPg\nAsUOgAsUOwAuUOwAuECxA+ACxQ6ACxQ7AC5Q7AC4QLED4ALFDoALFDsALlDsALhAsQPgAsUO\ngAsUOwAuUOwAuECxA+ACxQ6ACxQ7AC5Q7AC4QLED4ALFDoALFDsALlDsALhAsQPgAsUOgAsU\nOwAuUOwAuECxA+ACxQ6ACxQ7AC5Q7AC4QLED4ALFDoALFDsALlDsALhAsQPgAsUOgAsUOwAu\nUOwAuECxA+ACxQ6ACxQ7AC5Q7AC4QLED4ALFDoALFDsALlDsALhAsQPgAsUOgAsUOwAuVP+/\nfgH4f6yLRHZWpgPf77EP5rd90caVt95tY9GCrjZGNzhrY3rmxzZ2GrfGxraHHrWxYY8UG88e\nP2/jvhUFNu5IniLxrpryqhoMtfHg1nY2niiKsfH8aZsiUbUu2Fgj7pw8WlcO8NxR+TyfKY+S\nR09Us/GiaPlFtVJO2tiglRxgysHPbGzx4SmJxaNsTOohB1i9tlxSHFhRZOOmhPE2rnmik43b\n80faePqgHGBKv1U2dvvoAxszNz1T8eeY7nVih8ZHfKPYVT07I5G8ylT+8SH74Nps+UB/NqKv\nPLpWil2dNCkNl3f+1saasz63selu+S828SIpdudKpeiUfrTLxs1tptm4bHgdG9fFy3/AO4ta\n2Vi2VorduRM2RWrUkxiTJDU3uoGUxtMHpayc3CfF7sxheaqoWhLjI2dsbJb+k40dD0+XX/T5\nMfm7m3vbmHg6Q35RfflF5R8dtHHTxVNtnDvmiI3f77jZxmOF8h/spb132BidK5+NS+Y/WBmq\nVaPY8b+xAFyg2AFwgWIHwIVqFy5c+N9/Cv9FB57aY+/TfTK0o33047Hzbdz4F7ln16hviY3X\nJF9p4/CMTBt7DZRbPPXay02snZ9stfHbs8NsnL9A7p2tqDPJxsKZcuvw9AH5NzU2Q1oBTa5a\nbWNq4kc2pmycY2OjXLlXGLfBpkh5e4n7s1JtLMoYZOOukltt3Luks41HNsqdxOiGcrxpw6Qz\n0OPYaBuz+8nxXll9po3NbpFbloc3yE3KpV9Jx2nGxnwb5xbLXdf9CxNtzHhooY0jn8+u+HPn\nnvcMvHlixDeu7AC4QLED4ALFDoALFDsALtCgqHLmTblvrfl26JTXv7GPFrwtHYmLh8oN+xt+\n7mDjiGuet7Hbg7+x8dxJueme9/6fbZzz3lM25twhqy82TpZ+xekS+fpu8oCfbWzX5VUbO0/6\nq43tn29jY/que+Sp0vrZGJfe1MaYhtJUOXlAbvaXb5fFJ8WFC2zcnvo3GzeM3Wzj6tG/trEg\n73fyVN80tjE6Ub68nXGHdCT6T5ZVEIPufcXGLr/6rY1RMXL9sXLCWzZOnzvWxs8br7dx92fS\nkGn3cGW/4qboJmNry/vsEFd2AFyg2AFwgWIHwAWKHQAXaFBUOS+dXfXZucrdLFaPk30vUm6Q\njsTwLa1tvO22STZ2fmyEjYfXHrVxwfc32Dhj63EbF2+dZeO++fJl/YZZZTZ2yZL791kPy9qM\ny9552sY23eXef+IVjWysEScbMZ3W3VaO75IWxMl9ckQxSXVtrJ0q7Yvo+vLMZ8rlmUu+22/j\n5h+ki7L8gZdtzH1b1jnk5UoH5kCu7C+SlC3LWnq3GmLj8Fa1bex3uWxFU+9SOaLVb8jmK9Om\njbZxRustNhZ9XtmvuCczMvG6iHNc2QFwgWIHwAWKHQAXKHYAXGBb9iqnaEFXu7t6sGtTsEYi\n6EhkjpGOxP7F8nfnHOli48el0vpYNkm+2X+mTBZFdHpCbpxfPW24jf37yjKATgNkK/kGY+Ns\nPLFX1hvsmqnjLHZ9aGNh53/ZuHfwXhsPZcrd/YR86bE0md3ExrTVcrwtUu+SHx7Q1sY+175g\nY8dlj9vYvfpLNua8L92beU/MsLFg4vU2zt6aa2NJqaxUOdxJ5lcMOpxnY3B+I7dJOjtbPhv/\n6ru94s+xyTGRiPQ6HOLKDoALFDsALlDsALhAsQPgAg2KKie6wVk77zWYIzGipeza1PnJ/9SR\n+CwiN92nrnnGxh/GP2RjrSYyOLX37b+ycWhX2R8p+5h0FZo9LQs5ThTJ7OrVr/7bxpUdHrRx\n1b9lYcOmLtLrKNq2yMayTTLN9tQ+mcZdM1NmV8ffJuOoU1rKmpC2eQNs7Hq/LKjoNnWCja1H\nSJOh79PjbEx/VXodl0zob+Nnq76w8dsZ79m4ZLw81Yk1F9t45ko5g0MXb7IxWCFz8hrZWat8\nW+Unp13czZGIfHIc4soOgAsUOwAuUOwAuECxA+ACWzxVOW+dnzr3QuUs5F/XPmYfHXDvP208\ntl0enVkk37//+5rHbFzx2sM21ut4xMZrO1xl4y0tZGRB1uC/21i3tcyQ3j5ZBl0vSZTb+Qvn\nycSGVWdlWvPuOZfaeLJY/gGumSiDMuq2lD2d6lwsDZlju2Ulw9FtsmbgVIk8c0yyPPPFg9ba\n2LX6fTb2vVru/V9VIj2H9DtkwPbRLTIFPHf2nTZ+skOGXXy9fomNh9fF2thjzNs23tnpDRuH\npUibqE56HRu/ee8XFX9Ovbtvx79KF8UhruwAuECxA+ACxQ6ACxQ7AC6wgqLK6TRuTc1Zlfsp\n9Rq40z4aTLYO5kgEuzYFaySCjsSQ5pk2jkqRr+Nf/oDscXT+tDSycv/4nI2zZsgQhpzs2TZu\nnSKDrs8dlyUTSdmya1OrLu9LXCXdjGZT9tmYuCzZxpKexTbuHJUkL6Or9By25skSkR3/lCbD\nztrLbVy/RBaQbJx/uY1DhssIjh53y0qV/ndLT6lOyrM21tgsZ2FWJN/GcJXLmt021qsvZ/+6\npvNs7DWwchJIdHv+S+fKDoAPFDsALlDsALhAsQPgArctq5y2hx5tuntURazXTyY9f/fSazbO\n2C9TF4I5EsGuTcEaiaAj0euRF208sVu2S8rJkUUR00tP27goXzoDJW/Ws7HxQHm0m27x1Os+\nWY2QOVm2eEq/ZLGN9TPTbIy5PNrGk8XyqkpHFtq4/UdZBJJ/RzMbl+qkiJXrZYunDW9m21jc\nS46oqFQaBQfTltnYv78cYPA+R2ShSuRMkZyjWWXSJwnOb+LWLBuTG/3Zxiv+MKYyyDQOp7iy\nA+ACxQ6ACxQ7AC5Q7AC4wBZPVc6FmZELKyvjrhlb7aMTx2TYOKmd3Ckv/aGBjf0fks2F7q8j\nPYfgm/2n9snd/S+/k5vfU/bIF/1zJ8n9+7PHdKL2A/+wceCLsrlQ9guyT1G7IffbGN9JGjKn\nS+XzWbZWxm+X79hlY1yLVHmqSxNsjK4vKzfK1pywsWDWuzbOf1Z2x/rqGRndveadX9pYvY6M\n/c4aLR2YUU1lUcR1V8iQ7JpJ0mPJ+eAXNr57TIZs5PxFeiz1ux+0cXSBrCe577WNFX+OvaVe\ngxdlPYlDXNkBcIFiB8AFih0AFyh2AFxgBUWVc/b4+XPmrvy3Z4fZR3Pu+NjGfX+SqQudnvjc\nxmCyddZg6XUEuzYFaySmHJKOxKKJ79hYPU5uyQ+4/XYbb2opIyn6Jeyxsemz8nX+8gKZ2LDy\n5Sk2rmsjGyJteUyeqriPrD9IXiTjHVq/0dTGjptl06rWN8h2WFc8Kys30mbfYmPzKTL3+tMt\nC21cNF0aMsF7FdnzgE3RCfI+D7z5KxuDWR/FXVvZuHeZLMZYM05WbuQ8KZ+Ndq9UfnJanrup\nQWRsxDeu7AC4QLED4ALFDoALFDsALtCgqHL2rSgo/ahyYcD8tTJ0YuNk6Vc0zCqz8eppw23M\nPiZDlIPJ1sEciWDXpmCNRNCRuGbIdTbeERtvY59h0qColSKLBNaP/8bGRVlyRIsP9ZYfLpNb\n8sW5bW08MV2euVaKHELy15ts7BD/tI29R0rfoM/4mTZm3DvAxmFFckQJsbLOoeZ+eTfmzvrS\nxuCdjC2UXkeD+rLjU9bvn7Mxe22OjT9OkyHoe7JkRnjw2Zi/oLIjcTbuwmUR77iyA+ACxQ6A\nCxQ7AC5Q7AC4QIOiytmRPGVzm2kVcUUdWRRxukQ2U+pyl4xn7t9XlgE0e7q1jT9OkrvswWTr\nYI5EsGtTsEYi6Ehk3y7f3Y/otmELXn/Yxn+v+FQebSQTGwrf6WBjtSh5rgaXyaZGzQaus7Gk\noKM81XSJP52bY+O6CettLNgvHYkbe9xk45V3jrcxPN5GI206dUQ2gPpm4lQbF+XLCU2ZIfsy\nNf2NrK+4ZLSM7u7/Kzm/a8/K2f9m2Xs2rqgzqeLPzaIbRdzjyg6ACxQ7AC5Q7AC4QLED4AIN\niipnx101lw2vUxELZ3a1jyYP+NnGrIc/sLHTABnRcKLorI1LEuXmd072bBuDydbd/yB7DQW7\nNgVrJIKOxDcfyd39KeWyidOCnB02HsmRoRNpt8qqj+6177Yxc0yejc2/kEEZP10v4x3yX+ti\n4w/H5b36aZp0Qqa3lVdVUn6jjScayRENuFV6LH2GyTSPQ62lq7B/m2wA9cNLMhgk5xE5Cxl6\njpoWyavqNOAPNmY9LEM21v3yORvtJ+dgRrWITN/2iCs7AC5Q7AC4QLED4ALFDoALNCiqnKIG\nQ9fFd6qIpw/IP0jtusiyh8u6ybZFDcbG2bj61X/buLCwsY1bp/SzsfFAWUERTLYO5kgEuzYF\naySCjsTcGbNsPH9Kjuiq38tN9+uvl7UKved/YmOL66+2se6D8jKO7pAtnnY0n2fj4uzuNn7x\nxaM2LntPJlQErzmyf4hNteLk7/Z7/G2JCbIv008vyiiM3dcNtDE4CwvnyTnqkiY7XHX+nbRN\nLntezv6iCfLZmP/VmxV/PnckAq7sALhAsQPgAsUOgAsUOwAu0KCocg5ubbezqHI0cmyG3Ozv\nPOmvNrbpXmTjib0yKWJlhwdtXHVW5jGfO17Nxm76w9k93rAxmGwdzJEId23SNRJBR6L/aNkQ\naVR8qY39eu23MeHxOjYeyJUlIltnfmZjak/ZpunSxwfLo3nyzE3jZcJ03X3yqnImySZOC3Kk\n1ZO4ooWNjbMH2djhUXkZ2S/IO5n/pLzPXy6cYeOqsxNtXNlBuhlt9sprbtP91zZ2npRi44qM\nP1X8uWaTqEikRsQ3ruwAuECxA+ACxQ6ACxQ7AC7QoKhyThTFlK2tnGbd8pcyoqF9tzY2Jg6T\n2QK7Zsr+SKv+LS2I3XMutTEpe6+Nve6TL+u3GyKTE8oLpE8STLYO5kgEuzYFaySCjsTAoV/b\neFFN+Qc494WXbcwZJ0+1+huZjNH5zVts7P/ESzZ2v/ep//B7I0nX2nS07Fkbl/xRnmpBpvRn\n2mX1tLFZgcyubjfkfht73SeDI1Y9JGchOEer3pUz2O9GGfudOkxmZrd/Xj4bTVZWbsMVH5MU\niUhTxSGu7AC4QLED4ALFDoALFDsALtCgqHLOn46cO1EZUxM/so+m77rHxhpxcgN7x64PbdzU\nRWYqn5wj/7a16vK+jZmT5Yfjx0qTYeXLU2xcfKi3jcFk62CORLBrU7BGIuhIzJ0qrY8pR2WM\nRu7SchsPvhJr4/Iesryk4Kgu1Wgkz3zN7TP1Vcns6j3XS+dn51vyVIXT5XgXf9zbxp4J/7Kx\n29OjbMx8Xt7nVpPkLCyeM9bG4AwG5zc9Tt7Y4LNhPzn1I1fQoODKDoALFDsALlDsALhAsQPg\nAg2KKieq1oUaZlx1ysY59tHktC9tPF0q46kLO8ut8aJti2ysmXjexlarZDeh9EsW/4dnXtdG\nVhSsL5PlFtWi5IeDydbBHIlg16ZgjUTQkfhqqsyCqF5bDuHyZ96yce1U2fIo+LvBHIn6dV+x\nMetZmefQ+3V5zcv1iHZFfW/j+jI5hHVtZND1paWyzCP9EhmS3WpVbxuXJT5jY9E2ec2FnfvY\neLr0zzYmp8k4i5SNlY8mJMRGmsjyEoe4sgPgAsUOgAsUOwAuUOwAuECDosqpEXcuJqnyNnyj\n3F320bh0mbh8fNcJG/cOlv2CyjbJUIK6LY/a2GzKPhvrZ6bJ310r0x62PCZDsotz29rY4LKD\nNmaOybMxmGwdzJEIdm0K1kgEHYnhl7e3cdRFMpNhyjZ5dMb3G/SZZaxEu3EyULztVw/8h9ec\nOUamUy+6R443eDeC96rsH3K8wfscnIW6g+QcBWcwOL/H18jZDz4b9pMTm1EakSEiHnFlB8AF\nih0AFyh2AFyg2AFwgQZFlRNV92x0g9MVMW6pPBrTUHZeOvpTmY2HMmvbeGpfTRsb9iq2MXFZ\nsjzz5dE27v9exh0U95H5Biemyw83G7jOxuZfZNlY90H54WCydTBHIti1KVgjEXQk+o79k42R\nlpK2nZcdn75/8Tfye5+S37vrGRkrkfn4CBubT5AjSnxLjrfku742Fo+Q96r8GWkxxXeSKROJ\n38tZqHO/zK84sLSZjcH5PTlPuhl1m8fbGGfaMzHyiFNc2QFwgWIHwAWKHQAXKHYAXKBBUeWc\nO1r99MHKf4TKZVFA5ORM+dJ8TFJdGxPyj9tYM/OUjcd2J9pY0lP6FSeLT9sY1yLVxuRFm22s\nlSI/XFLQ0cafrs+18egO+eHUngNsDCZbB3Mkgl2bgjUSQUdiyjaZI7F2qqygaNDjiP5emQKe\n2lM6IcFrDo6opEA2gArejeC9Ct7J4H0OzkJwjmomyRkMzm9w9k8ekM9G+ZXmIffLJyJc2QFw\ngmIHwAWKHQAXKHYAXKBBUeWcKY86uS+qIu7vL7e3y1+T7YNSBsnmQk1my43o+NuKbPz5m0ts\n3DkqycbSkYXyVNe2srH1G7J9UPLXsr6icLo0KPJf62LjjubzbLz08cE29n/iJRuDydbBHIlg\n16ZgjUTQkTh7XP4tz+olz9z/Gvm9DZ9NkKd6fbaN+T/JER2c2sDGtBGyoKL1tfJexfeRZ977\n9VYbd34sZ+HoCuk5NB7wo41NnpfzW/sKWU5TNKfQxv1ZlZ+cIwn1I+5xZQfABYodABcodgBc\noNgBcIEGRZVz7kS1M4crY1HGIPtoceECG1vUz7AxbfXNNqa0lLv7hR89buPWrvfZuP3Hv8tT\n1X/Vxo6bX7CxQ7yMlP7pnEzy/uH4BzYuzu5uY2refhu73/uUjaMaDbMxmGwdzJEIdm0K1kgE\nHYlRjeTTHvzeQ3nH9DXLuo4fjv9g44Vz1WwM3o3gvYq+UX44eJ+Ds3DqS7n+CM5gcH6jB8sz\nB58N+8k5FJEOkk9c2QFwgWIHwAWKHQAXKHYAXKBBUeVcFB2JMl+M31Vyq310e+o9NnYrf9DG\nFql32dg2TzZTWpX8Wxu35v3Kxvw7ZNxBlzXP2dj6Brk13nukjJReN2G9jT9N62DjF188amPT\neJkjMXDo1zZec/tMG+vXfcXGYLJ1MEci2LUpWCMRdCTOn5Lx2wuWyqv6okxec+Ef29nY/DY5\n3t4jF9vY+oYZNpbpKOv8O/5s49a8nTbGJMurapsnP9wiVQZlnCm/YOP21L/ZuKukMpbGJEVk\ntodHXNkBcIFiB8AFih0AFyh2AFygQVHl1Eo5GR85UxH3LulsH90wVuYblEyU1QhNBsiOT13v\nlxvYiz9ba+OOf8ozL514vY2X137XxiueleZGn/HSRijYL52Q6W132LjsPVlRUHefLGyIJF1r\nU79eMkci61lZnND2K2mMBJOtgzkSwa5NwRqJoCMxZZ9sghS85ti20mTop8fbJ1fejbhHY2z8\n7gVpMiw9Lu/zvrdk16YWv1htY9ehcgaD81vynZz94LNhPzllLaIimRHnuLID4ALFDoALFDsA\nLlDsALhAg6LKadCqoFn6TxVx9bjh9tHVz8jQ6M13yhCGPtfKbfVuUyfY2LW67Ca0s/ZyG1eu\nlx+e/2xjG9Nmy5ZHGffKHfobe9xkY0n5jTbOnSH7FOVMkm2ajpY9a+Oe6xvZ2Pt1GUfd4vqr\nbcx8fIQ8lU62DuZIBLs2BWskgo7ERTVlJUO//nJEN8bJ8WY8Lu/Gntl7bZz/7GM2rlz/s41R\ntaUFEZyjbnpSag2MsnH5+3L2Vy+Xz8aRFyv7JKdiIjQouLID4ALFDoALFDsALlDsALhAg6LK\nSTn4WcfD0ytiQUOZyVCQ9zsblz+QYmPHZTJlovUI+bJ+36vllvz6JTKyYMOb2TZ+9cyHNjaf\n0t/GYUXyRf8r7xxv44lGcv8+mCOxIOffNi75o2zEtPMtWV+xvPbdNmaOkUZB8wlZNv50fa6N\nwWTrYI5EsGtTuEZCOxKjGsmiiPB4i6QxsuCQvFfBO/nzS8k2tn9kvo19r5L2RXAGDy4rt3H5\nAy/bWJAnM9GjG1b2WKJiq0UiMrDCIa7sALhAsQPgAsUOgAsUOwAu0KCoclp8eOr055WbES2b\ns8o+uu1DGTid+7bcv+9eXW729316nI1Xzf/Cxo3zL7exuFexjWve+aWNn25ZaGNC7C9szL5d\nFkUMuPVTG2vFSWMkcUULGxdkyjZNhdNlfsWuqO9tXHTPQXmqt9bZWFIgyy0OTm1gYzDZOpgj\nEezaFKyRCDoSwb3+RTPl3fj0iOydFbyTib0O29h//mAbryqR462VIv+FLpss5zf3Kzn7xa/K\nopeWd1U2ZBrUahSJpEV848oOgAsUOwAuUOwAuECxA+ACDYoqp0XxqPjNvStij2Oj7aM7E+W2\nel7uqzbmvJ9oY/qrMjM7/Q65cT5kuCzGKCqVmQxf7syxcdH0f9hYc/918qIbybKHPsP+aWO/\nx9+2sXH2IBvbZfW0cfHHvW1cXyaLBIpzgyEMfW2slSIrGdJGSPuiQ7yMswgmWwdzJIJdm4I1\nEkFHYvL+Mnl0+pc2Vq9zTn5RprzPQ+rLWUj/vZyjndO32JjzvoyzyMstsTE6UX6R/eQ0j7o5\nEnku4htXdgBcoNgBcIFiB8AFih0AF2hQVDlJPdolns6oiNn95Ab2hs1yHz3/T/JF/3lPzLDx\nkgmy19DNW7ba2OPuZ2w8mLbMxiOHHrRx0cR3bJw7S+7BnzoiiwQOtZa77P0SpNfR4VG599+s\nQO6y90z4l43r2sgeR1se22Nj8Yg2NiYvkinRra9tamPHzTJlovUN8l4Fk62DORLBrk3BGomg\nI3G2XCZF9LlPBnuPSIi2MTgLR7ectHF+Hfm9826T13xgXLyNmU/KwpXsNpWXMi1HVov8MeIc\nV3YAXKDYAXCBYgfABYodABeqXbhw4X//KfwXXZgZubCyMu6aIV2FiWMybJzUTvZlKv1BNjXq\n/9CdNt5f55Q8eresczi1TxYJfPmdjHeYskdmLOdOkuHNZ4/JLflOD8hyi4EvykKO7BfesLHd\nkPttjO9Uy8bTpfL5LFt7yMbyHbtsjGuRKk91aYKN0fVlY6ayNTJ0omDWuzYGk62DORLBrk3B\nGoms0dLbGdU038brrpBBGTWTpF+R84GszXj3WE159C9/t7F+d9nwanSBTLe477WNFX+OvaVe\ngxeTIr5xZQfABYodABcodgBcoNgBcIEGRZWz/3dF5R9V3nhOH32pffS7l16zccL+z2ycPUdu\nfkfVOm/jkCsvs/GulIE29nrkRRtP7JZuRk6OrGSYXqhbHuV/bmPJ0no2Nh4oXZRuHeT+fa/7\nZDJG5uTf2ph+ifRY6mem2RiTLHf3TxbLqyrNL7Rx+49ydz//DtkuaelEOcCV66UD8/NXcu8/\nmCMR7No0Ik1eVf/+coC1Lpaew9I3ZQXFh0Vf2Tjr2+U2njshVyeDB0kT6cFGQ2284g9jKkPX\nSDU5Po+4sgPgAsUOgAsUOwAuUOwAuMAWT1XOpoTxmy6eWhETN+y0j3b5ldy/H95qno0lpU/Z\nuGS8DMn+ev0SG2tslkUREdktKXL5A7Ih0sCb5cZ5g/rSzUiZIffvcx6ZbePWKf1s/HKh7FO0\n6iHZTKnVpPclruptY7Mp+2xM/F5+b0lP6YTs/FjWDGztep/EPHlj973VxMao2tK4a//IfBuD\nydbBHIlg16aLomXlRtCRmLJ5uo1fr5flFif21rDxqkefsHF4/do2Bp+Nwxsql4hEN6leOyJP\n5RBXdgBcoNgBcIFiB8AFih0AF1hBUeW8dX7q3AvfVsRf1z5mHx1wr+zLdGy7PDqzqJ2Nf18j\n+xSteO1hG+t1PGLjtR2usvGWFtKwyBosyw/qtpaJDdsnr7ZxSaJ8W3/hvMY2rjo70cbdc2SJ\nyMli+Qe4ZqIsAqnb8qiNdS6W+RXHdsuM8KPb6tp4qkSeOSZZnvniQWtt7Fpduhl9r/7ZxqtK\nZFFEMH08mCORO1sWgXyyQwZlBF2jw+tibewxRuaL39lJdscallJgY530OjZ+817lblGpd/ft\n+FfZaMshruwAuECxA+ACxQ6ACxQ7AC6wgqLK2Z4/8vsdN1fEpI2d7KMJLd+yseeTj9g46HCe\njWeubCtP/a2kH8Y/ZOOsMtlN6NCxe20s7trKxuy1Mvf6ktFyh75p0Q4bu6TJ7fyVHWRrqVXv\nygKDTV1kGUDRtiE2lm1KsfHA0mY21kySbakaD/jRxpSWs2xsmydbPHUdKp26brrFU+sR0nKp\nlSL/4eycvsXGYLL1Z8dkAcm3M+R9DtZIBB2J26+UlSqDYjfZWO9S6cAs+8MWkhAAAAZESURB\nVNObNs7YVrkYo3fcJR0j3nFlB8AFih0AFyh2AFyg2AFwgQZFlXP6YPVjhZXnZW5TaSvEzU23\nMWawLE7IHDPCxqGL5X52jU5dbKy1ZreNyya9YmMwj3nvMmky/DhNlmr0182FOg34g42df3ej\njW32ysSGfjfKi9yxS8ZRF3buIy9jsOwHdShT9jhKyD9uY5PnZdemtNU329gi9Rv54QHSzKk1\nUMZ+H1xWbuOyyS/ZmPO+9Drm3SZ7WBX8RZobNeJlonawa9PITv+yMehINOotS0TyX5PtoabP\nHWvj3OLtFX9uGImJNIw4x5UdABcodgBcoNgBcIFiB8AFGhRVTkq/VZf2rlyBsHqc3Fb//Ib1\nNlaf1lr+8m2SOj8m/Ypha2VHoHr1pVGQuFUmLi/eKusN1oyTH96TJXsrrT0rQxiyHk6w8bLn\nn7axTfdf25g6THod6XHjbTxdKvf+j685YePJebLjU0ySrCiofUUtG6MHy1KNM+WyZKLku/02\nLn//rxIfeNnG3K/utjEvV96NA+PibUzKlkd7t5I1IcEciX6X6znSNRJBR2LatNE2ft5YFnLs\n/7yym3EkMxKRzpZHXNkBcIFiB8AFih0AFyh2AFygQVHldPvog+jcDyriqdflS/MFb/e1ccZQ\nuSd9dnYHG09eI5MTuj34GxuvayoDtpMbSSsg7T2de/3kxzZunDzMxm+WvWfjul8+Z+OiCa/a\n2HmSbNPU/nkZdpG+6x55VWmyP1JcelMb6zaXVsDJA9K+KJpTaGNx4QIbt6f+zcYNY2U0xOrl\n0kUpyCuSp3pVFq5EJ8qiiMwnP7Wx/+SRNg7qJStVgsnWUTFy/RHs2hSskQg6Ers/S7Wx3cML\nK/7cOLpJOAXdH67sALhAsQPgAsUOgAsUOwAuMCS7yjnw1J7yjw9VxE+GyvCAj8fOt3HjX6Rf\n0aivfFn/muQrbRyekWljr4Ef2Fivvaw32PnJVhu/PSsdifkLZML0ijqTbCyc2dXG0wfk39TY\nDJkh3eQqGbCdmviRjSkb59jYKHeXjXEbbIqUt5e4P0tu2BdlDLJxV8mtNu5dImM0jmyUKeDR\nDeV404atsrHHsdE2ZveT472y+kwbm90i0zwOb5CmylJdmzFjY76Nc4tlv6/9C6V5lfHQQhtH\nPp9d8efOPe8ZeLPMJneIKzsALlDsALhAsQPgAl8qrnJiuteJVKvcn6NzJ/mS7dlo2Wr8Z7kL\nF4lNljtN7eJkx5TUu+UeVnR7PfvyxJHYSD0bW567SV5GnNzqbRbdyMaDGbK/yLkj8sw1m8iO\n5/ExSTbWj1xhY0JCrLyqjFIbY+Q7xZGTeghHEurbeCgidz9L9feWtZBXdUreyEhUrBxRg1py\nvM2j5H1uOVJ+ODZK3smI3M+MRDeRs5DaRG7C9o67xMaGEXlZR/TsN9bPRueelZ+c1HS5e+sT\nDQoALvC/sQBcoNgBcIFiB8AFih0AFyh2AFyg2AFwgWIHwAWKHQAXKHYAXKDYAXCBYgfABYod\nABcodgBcoNgBcIFiB8AFih0AFyh2AFyg2AFwgWIHwAWKHQAXKHYAXKDYAXCBYgfABYodABco\ndgBcoNgBcIFiB8AFih0AFyh2AFyg2AFwgWIHwAWKHQAXKHYAXKDYAXCBYgfABYodABcodgBc\noNgBcIFiB8AFih0AFyh2AFyg2AFwgWIHwAWKHQAXKHYAXKDYAXCBYgfABYodABcodgBcoNgB\ncIFiB8AFih0AFyh2AFyg2AFwgWIHwAWKHQAXKHYAXKDYAXCBYgfABYodABcodgBcoNgBcIFi\nB8AFih0AFyh2AFyg2AFwgWIHwAWKHQAXKHYAXKDYAXCBYgfABYodABcodgBcoNgBcIFiB8AF\nih0AFyh2AFyg2AFwgWIHwAWKHQAXKHYAXKDYAXCBYgfABYodABcodgBcoNgBcIFiB8AFih0A\nFyh2AFyg2AFwgWIHwAWKHQAXKHYAXKDYAXCBYgfABYodABcodgBcoNgBcIFiB8AFih0AFyh2\nAFyg2AFwgWIHwAWKHQAXKHYAXKDYAXCBYgfABYodABcodgBcoNgBcIFiB8AFih0AFyh2AFyg\n2AFwgWIHwAWKHQAXKHYAXKDYAXCBYgfABYodABcodgBc+B/32kUkGkZEoAAAAABJRU5ErkJg\ngg==", "text/plain": [ "Plot with title \"\"" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "options(repr.plot.width=3.5, repr.plot.height=3.5)\n", "\n", "plot(as.cimg(displ(D)), colourscale=cmap_jet, interpolate = FALSE, axes = FALSE)" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Computation of Geodesic Paths\n", "-----------------------------\n", "We use a more complicated, non-constant metric, with a bump in the\n", "middle." ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "n <- 100\n", "x <- seq(-1, 1, length=n)\n", "grid <- meshgrid_2d(x, x)\n", "Y <- grid$X ; X <- grid$Y\n", "sigma <- 0.2\n", "W <- 1 + 8 * exp(-(X**2 + Y**2)/ (2*sigma**2))" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Display it." ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaQAAAGkCAIAAADxLsZiAAAABmJLR0QA/wD/AP+gvaeTAAAP\ngUlEQVR4nO3dS3LbRhQFUMtx/nvSSrKzTLMS7yn/jzJol+vZT91ukJRI6Z4zQLEgCqI5uHX9\ngAbuHh4e3gC8dm+v/QEAnoOwAyIIOyCCsAMiCDsggrADIgg7IIKwAyIIOyCCsAMiCDsggrAD\nIgg7IIKwAyIIOyCCsAMiCDsggrADIgg7IIKwAyIIOyCCsAMiCDsggrADIgg7IIKwAyIIOyCC\nsAMiCDsggrADIgg7IIKwAyIIOyCCsAMiCDsggrADIgg7IIKwAyIIOyCCsAMiCDsggrADIgg7\nIIKwAyIIOyCCsAMiCDsggrADIgg7IIKwAyIIOyCCsAMiCDsggrADIgg7IIKwAyIIOyCCsAMi\nCDsggrADIgg7IIKwAyIIOyCCsAMiCDsggrADIgg7IIKwAyIIOyCCsAMiCDsggrADIgg7IIKw\nAyIIOyCCsAMiCDsggrADIgg7IIKwAyIIOyCCsAMiCDsggrADIgg7IIKwAyIIOyCCsAMiCDsg\ngrADIgg7IIKwAyIIOyCCsAMiCDsggrADIgg7IMK7a38APvfLL7+8f//+2p+CV+X+/v6nn366\n9qe4MmF3c96/f//zzz9f+1Pwqtzd3Qk7/40FIgg7IIKwAyIIOyCCsAMiCDsggrADIgg7IIKw\nAyIIOyCCsAMiCDsggrADIgg7IIKwAyIIOyCCsAMiCDsggrADIgg7IIKwAyIIOyCCsAMiCDsg\ngrADIgg7IIKwAyIIOyDCu2t/AHjc3d3dRY7z8PBwkePw0ml2QATNjiu7VIM7enyNL41mB0TQ\n7HhWT93j9vVPouu9bpodEEGz48md3+aOHuG0jlb/ipb3+mh2QATNjidxtItddpa3PtpOa9Py\nXh/NDoig2XEx++1s551Pt4Li6HlYLe910OyACJodF3BOU1v/7jn9brSwnRUU+91tvFO/e4k0\nOyCCZseJLtvmdvYcNWthvfEdbXmmeC+RZgdE0Ow47LROV/ec89Mdvant96+jv2uK91JodkAE\nzY4Djp45nfW1c17vqD2rTuj6653j7E/x9LtbptkBETQ7tux3uv3Xddv3r48w0ztdfb3es3Pk\ndYPT726ZZgdE0Oz4gkt1up3t7P07n2SYdbf1/tl7ZpM+/e4l0uyACJodU+d0utO2b9++ffOl\nrre27nH//fffmy81u9O63uz70e9uh2YHRNDseMRTdLre2uqe9U93Jnc7bW4cs+7pXW/smdHv\nXi7NDoig2XHAzjVx6+4227N+5+z8bDWbuI2m1tvc2NbmVTvdTsur79Tgbp9mB0TQ7PjEzh3o\nZmtg121uZ/vVV18tjjD7DH1aN2tz//7772c/7S1vbNctb3ZnlFm/0/tugWYHRNDs+OBop9uf\n0PXW1l/Pfrqe3w3rOV3tdOPI43VteeP17BsY76lncqv987P63XVpdkAEzY4tp3W6WYMb23fv\n3j26v3e9Wb8bdjrdbPvPP/98PNrY0/+9w9F+x63R7IAImh1b07q6Z71GYtbjepsbr/u2/nR2\nlnbd7Oo8bnS32uPqdrZao7a8qp637XaeX6H9XYtmB0TQ7HjE/kqJ2VnX3ub69uuvv3709azr\nHW12vceN7d9///3ZMWvL27m3ytCvvOufSo+7HZodEEGzi7bfYur719O62u9mPe6bb775uKdu\n6/7e7MZ23ez6mdba5v7666+Pxxl7Zm2xWt/brn4z+w1O43t+mh0QQbPjE0fvT7czrZs1uLH9\n9ttvP9vT3z+b3A2zad3obnU7jjP63Xq9bT1y7191z875WT3uFmh2QATNLtTRaV39raPTutrv\nRo+bbXvX6/O7dbObzen+/PPPN481xNnR9rf12zja3TS+56TZARE0Oz7Yn9bN+t1sZtcndGP7\n3XffPbqt75lN7noXm03rRqcbR/jjjz/ePNbm6nHq635fvLr/6F2U9bjr0uyACJodW3amdWPb\n53T1DGztdN9///1n297yaivcb3ZjTje2O+dzh9lzKuqe+i+91OSO56HZARE0uzjr87CXutPJ\n+jxsbXY//PDDx21vefW3ejsb+hV2Y05Xp3XrVtjbXL+b8fjdfle72TezcweUnZ9yKZodEEGz\n4wttbrZ/vYJif2ZXm92PP/745tOW18/M1qvthnqFXT0DW5vdrNP1Nlfvf1e39fkV9V89W0HR\n/1bdr8c9P80OiKDZ8QW95fU7hfRnTdSZXT2jOrb1fOtocKPT1W2d39U1FetmV9dL/P7772++\ndPZ2fee78bfG6/qvq08jm83vdLdbo9kBETQ7pnbWVBy968n6nOys39Vr7naa3Vgp0d/Zr8jr\nKy762du6rTO79QoK/e7WaHZABM0uyP4VduvXvdP1FbKzu570c7J9NUVtdqPx1WY3jtObXb3H\n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", "text/plain": [ "Plot with title \"\"" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "imageplot(W)" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Starting points." ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "x0 <- c(round(.1*n)+1, round(.1*n)+1)" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "__Exercise 3:__ \n", "\n", "Compute the distance map to these starting point using the FM algorithm. _Important:_ use symetric boundary conditions." ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "image/png": "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\noHLoQ4yvvYmJV3cxfvUjqOSfQHFuEpmxg6mv7TC7Y3kd1c5l7Jy4h+1zo6jmz6J+dwbtjYOp\nbOGJuckaCsV7KN27g5GrKZS2jqIwMovM6EO9VQZ9XJIN8T/2mOyiKBoKw77YP4Jqt6u1N+oj\np8eRnw35K4H00TRy0xWUToygvTGL1uY5gyrLbqNl0KU2U84hO5YzmPcaZoOFE88g9KcLvUxC\n3WuokQj36cLZa9inC5nu1kf/HBarP4PV957EzqWyQSfkvfPQU7uYePwDzGa+hIWXXsHhX5vE\n/O2fxPSJT6FybhLZ8cT+V7J9eQsrV1/BvYV/j9t/dQN3PvFzuP/gJ7HxzgKayymDs+PKuW0c\nOvcdHFn5VRz74l0c++qPYb745zH59BkUj2XZ2+Or32lj4/2bWN78KhY/+Q0s/mwO9898FqsP\nPoHtK4fQWk3ZrwmZbaNy/C7GM69i6r2LmPrDUYyvP4fywlkU5kpIFRMGWbKx0kB19Ta2Su9j\n86lNbJ98GtXOWdQfTKC9fVC3my73kJ/cRCl9HSO372Pkahml5gnkF6aRGU0bVMWGT7W1UUvX\nCuQMt5jsoigaCjHZPXI27ny4+ub1idVnUDk5j8JCEdnJlMG0hHwxidyhMHcq/Nk32KMJJ3eh\nb1rYuwmnh3tnc7W+wRyJ0HN4rz/d3bcM6l5DjUS4TxfOXsM+Xch0K+9+BNsXx9FcS9q/VXe8\nicmnrmN28stYeOP3cOSX2jjy2p/D7MRPYOKp4ygsZNDrwu71BlbfeRd3M/8ON//S27j5sx/D\nnd5/ggdvPInq9dz+d1Q+W8PMc6/jWOcXcfKLr+HUFz+KY82/gdmPPY/y42GuBdQXu9h4exH3\nb30Vd07/Jm7/1TXcefFHsdT6M9j44Cxqtw5qQsL+4MipdUzMvYHp5W/h0Nc2MfX2pzCReQHl\no/PIHcrsf7XtzR5qixvY3vkAm2c/wOZzKWzNPO776zRCj8JwhpudbKEwuYSR5mWUL2+ifPMs\nSqlTyE+NIV1+qI9LtYfG+lZmF2XDLSa7KIqGQkx2j5zV7LduFH+3eu1FTKy8gMr8GZQWppCf\nLSI7ljKYrBqyW+qhOfPh1C/kuDCTobvbQ2uzazDvdW822OJVg57DoT9d6GUS6l5DjUS4TxfO\nXsM+3V6mW04imYbisRYmnrmN2YWv4sj138CxL97HsS9/FoeTfwHTTz2NkdMFg8yye7OD1Teu\n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\ns4uvo/r4IvJHMoZpa3O1h91rK9hYexdrp97G2pc6WD/9NLZrT6N+dxKdrcNz2OxkF8XZVZQH\nH6P86QrKn05jrPeI4VSVsIs2vJ/hhLq1tYdm9x4as6uoLxYM972G3WBhj0Q4vQ3z6fZnmYS+\n161Nw/t04ew11OlCTlc8mUPqgekk+00x7cOfobvTQ3ujjeZqDfWVdeyt3sJu7SNsp97H5uz7\nWH/yKtZf3Rl7/hkjL2Z2URSNhJjZPXSWfvfDi2P/lFtJI7uRRXYrj8xuHum9AtKhi7OdQ7Kb\nQbJ3uIMidG720130MmFybxPdYh3tSgPt8QZaMy205rtoLCZRP5ZH/eg49hbOoTZxErX8WdS6\nZ1HbPo3a8lHs3Z1Cc6mI1mrYj3V4nS9TGaCw2Eb57CqmznyA+bFvY/HyN3H8767hxN88gmMf\n/ykWZv4Ak0+ewdjJUK9kWKWqXdvB5vVLWM3/K1ZevYqVLy5ivfR57Fw5g8a9InpNSI8NkJ+v\nozR1HZXtS6h+UEfl1nMo5c8gP1NBqhSm3UFnu4vm5gb2kjewd3wL9aNzaDhmuO817AYLwszh\nMJ8uzDIJfa+hRyLcpxuevaYPXmOoSLY3emhvddHZbKG1uYfm+iYam/ext3sDu72PsTN2Edtn\nP8bmk3ew8XITGy9NYv385xfzcVJxzOyiKBoNMbN76Nz7ypmLr72arW0hu7OL7M4eMjs7SNfW\nkd7rIVXvI9kaIBk6ZMNDCvrZBHr5JHpjSXTKGXSqObSrE2hVK2hVptAcm0UzdwSNxFHU28fQ\nqC2icWcOjdVJNJdLaK1l0dlKGU4qDnlQqgi56S7GTtRQOXMbU4tvY677zzjy83/Fsf9tFcf+\n4RyOfvp1LEz/EaafOo/yoyVkqomD7793o4HNj65htfZ9LL/0Y9z/wwRWHnsFGzsvYffGHNpr\nhx/v7GQPY0fXUC1cwMTFjzHxbgHVzScwNnsS+ZmC4a7YYZ7VQmPrHvbKn6J2tona/CLqrWNo\nbZT8Rp9Guedg5nCYT3enZtj3Gnokwn26cPYahJxu++Imdm/ewd7GbdSbt7A3uI5a4Sp2j36K\nnUfuYPupbcM7hltPz2HzkXPYrD6PrfZzTyfPGHkxs4uiaCTEzO6hcz/3lY9Tj2XGt5BNbSGd\n2EZmsIPUoIZ0r45kv4lUr43E/grSAQaJFAapDHrJHHqpIrrJEjqJKjqDKjq9SbTbk2jtTaK9\n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", "text/plain": [ "Plot with title \"\"" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "options(repr.plot.width=3.5, repr.plot.height=3.5)\n", "\n", "source(\"nt_solutions/fastmarching_0_implementing/exo3.R\")\n", "D <- exo3(x0,W)" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "## Insert your code here." ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Once the geodesic distance map to $\\Ss$\n", "has been computed, the geodesic curve between any point $x_1$ and $\\Ss$\n", "extracted through gradient descent\n", "$$\\ga'(t) = - \\eta_t \\nabla D(\\ga(t)) \\qandq \\ga(0)=x_1$$\n", "where $\\eta_t>0$ controls the parameterization speed of the resulting\n", "curve.\n", "\n", "\n", "To obtain unit speed parameterization, one can use $\\eta_t =\n", "\\norm{\\nabla D(\\ga(t))}^{-1}$ (one need to be careful when\n", "$\\ga$ approaches $\\Ss$ since $D$ is not smooth on $\\Ss$).\n", "\n", "\n", "Compute the gradient $G_0(x) = \\nabla D(x) \\in \\RR^2$ of the distance map.\n", "Use centered differences." ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "G0 <- grad(D)" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Normalize the gradient to obtained $G(x) = G_0(x)/\\norm{G_0(x)}$, in order to have unit speed geodesic curve (parameterized\n", "by arc length)." ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "d <- sqrt(apply(G0**2, c(1,2), sum))\n", "U <- array(0, c(n,n,2))\n", "U[,,1] <- d\n", "U[,,2] <- d\n", "G <- G0 / U" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "The geodesic is then numerically computed using a discretized gradient\n", "descent, which defines a discret curve $(\\ga_k)_k$ using\n", "$$\\ga_{k+1} = \\ga_k - \\tau G(\\ga_k)$$\n", "where $\\ga_k \\in \\RR^2$ is an approximation of $\\ga(t)$ at time\n", "$t=k\\tau$, and the step size $\\tau>0$ should be small enough.\n", "\n", "\n", "Step size $\\tau$ for the gradient descent." ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "tau <- .8" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Initialize the path with the ending point." ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "x1 <- round(.9*n) + 1i*round(.88*n)\n", "gamma <- c(x1)" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Define a shortcut to interpolate $G$ at a 2-D points.\n", "_Warning:_ the |interp2| switches the role of the axis ..." ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "Geval <- function(G,x){ bilinear_interpolate(G[,,1], Im(x), Re(x) ) + 1i * bilinear_interpolate(G[,,2],Im(x), Re(x)) }" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Compute the gradient at the last point in the path, using interpolation." ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "g <- Geval(G, gamma[length(gamma)])" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Perform the descent and add the new point to the path." ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "gamma <- c(gamma, gamma[length(gamma)] - tau*g)" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "__Exercise 4__\n", "\n", "Perform the full geodesic path extraction by iterating the gradient\n", "descent. You must be very careful when the path become close to\n", "$x_0$, because the distance function is not differentiable at this\n", "point. You must stop the iteration when the path is close to $x_0$." ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "source(\"nt_solutions/fastmarching_0_implementing/exo4.R\")\n", "gamma <- exo4(tau,x0,x1,G)" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "## Insert your code here." ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Display the geodesic curve." ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "image/png": "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\n10vs3r1bS529rb/zXfW9qtfhTxc+jSw1f0d36xqanSkLpu2OlfZrZyDAyNHsTLl/8A4o66XX\nSn+f2rvJNRXD3vWk/pxsqt+Fn7lr0uyqKyXiPeNP5MVXXMRnb8NlOGdXfwUF/a5raHameGn7\nwLo/ra2hACNGszPEOSdd5/3bg22nSFPSMzNQwZ7J13Gni6+QTd31JD4nG19NETa7qvGFza46\nTtzswnucpNpf1cvi+9zF11rUPwGj/mxs2OlSrxP/dWiCa4hmZ80O6fFgdX9pY2tjAUaIZmfN\nHul66ez5de/PdG7n/Grqvh3DPmOs/jrZuOVVy7DfxVdWNGl2qa+Gc3PV9wo/hRffWyXshvGy\n/reR+u3R2tpFszPHuW2DG36NPwawgGZn0LXSHmmvudUXSEdJX4n3a3IdxbDPo0jN36Xucxd/\n2i6cR6tUM3HhlRKV+CxtfFfk+ieZxfc0Tp2HTf1+mKHrDv5KN+hx6cZw3fsz2xoKMDI0O4uc\n+5L3p8+ven+mc/9JqmsZ9Z8mG/aa2fpztfEyvkI2NWdXCc+6xs8tS41heW2uyZ2K0QU0O5uu\nlvrB6gulY1sbCzASNDubfizdFN7lyftznLt9qEM06TjDXmuROnsbb4mbXSWcv6v/3Fyqx9X/\nFKmfHd1HszPKuSvDVe/Pkta1NRhgBGh2Zn1JekraZ271QO9Pdu6a5R1r2KeRNfmMXtwE4y2h\n1J5NPis37BLjiGZn1hPSVeG69+e3NRRgBAg7u5z7fLjq/anSAW0NBlhrhJ1lN0o/DFbXef+b\nrY0FWGOEnWWzzl0Rrnv/5uUdyK9A2UBRFEVRxFtS25sccyVjXo1fPkaNsDPNuc+GnyX2/lDv\nj25vOMAa4myscQ9Iu6TXzK+X5QV5/k9N3umDJ67GW+Jl6qmsqadAxHcPDq+RSF1BEb83PnL8\n3cOx1f8UqZ8d3Uezs865T4Wr3p8tHdjWYIC1Q7Ozzrl/8P7jwXnY9WV5YZ5/eMFuTTpO3ODi\nHpd6jld4x+BwGd/LJHyKa7ilOk51l7r4ONUy1fXixhf/FM1/A+gmmh1mnLs8XC/LC6XptkYD\nrBGanWn+6WcjXOr9u4PLxZ5fludk2RWptjJsm0s9zSt8xmu4TD0bLLzutf4ZFNUTY6vjVMv4\nu6S6Xv2MXn3Li38/9b95jBLNDpIece4fw/WyfA9/NjBhaHaQJOc+7v3r51e9P7gst+b5NcGW\n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\nAAAASUVORK5CYII=", "text/plain": [ "Plot with title \"\"" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "imageplot(W)\n", "lines(Im(gamma), Re(gamma), col=\"blue\", lwd=3)\n", "points(x0[2], x0[1], col=\"red\", pch=19, lwd=4)\n", "points(Im(x1), Re(x1), col=\"green\", pch=19, lwd=4)" ] }, { "cell_type": "raw", "metadata": { "deletable": true, "editable": true }, "source": [ "" ] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "R", "language": "R", "name": "ir" }, "language_info": { "codemirror_mode": "r", "file_extension": ".r", "mimetype": "text/x-r-source", "name": "R", "pygments_lexer": "r", "version": "3.4.3" } }, "nbformat": 4, "nbformat_minor": 1 }