#-------------------------------------------------------------
# Calcolo e grafica interattiva 
# di curve di livello e gradienti
#
# GdA 28/10/2021
#-------------------------------------------------------------

# Funzione: 
# https://web.northeastern.edu/seigen/MTH1252LevelCurves.html
myfun <- function(x,y) x*y*exp(-(x^2+y^2)/2)
# gradiente
Gr.x  <- function(x,y) { y*exp(-(x^2+y^2)/2) +
                             x*y*exp(-(x^2+y^2)/2)*(-x)}
Gr.y  <- function(x,y) { x*exp(-(x^2+y^2)/2) +
                             x*y*exp(-(x^2+y^2)/2)*(-y)}

#  Data
x <- (-100:100)*pi/100
y <- (-100:100)*pi/100
z <- outer(x, y, FUN='myfun')

# https://r-charts.com/correlation/contour-plot/
contour(x, y, z, col='blue', nlevel=20, lwd=1.5, labcex = 1.3, asp=TRUE)
text(3,-3, "FINE", cex=2)

cat(sprintf("Cliccare su un punto della finestra grafica (su FINE per terminare)\n"))
scala = 1
while(1) {  
  p <- locator(1)
  if((p$x[1]>2.8) & (p$y[1]< -2.8)) break  
  points(p$x[1], p$y[1],pch=19, cex=0.3, col='red')
  arrows(p$x[1], p$y[1],
         p$x[1] + Gr.x(p$x[1],p$y[1])*scala,
         p$y[1] + Gr.y(p$x[1],p$y[1])*scala,
         len=0.1, col='red')
}
