#----------------------------------------------------------
# corde causali - scheletro di programma -
#
#  GdA, febbraio 2011
#----------------------------------------------------------

library(tripack)  # per 'circles'

# function pausa
pausa <- function() {
  cat ("\n >> Guarda il plot e dai enter per continuare\n")
  scan()
}

#----- addormenta lo script per un tempo t
dormi <- function(t) {
  Sys.sleep(t)  # funziona di sistema
}

# funzione per generare le corde
genera.corde <- function(n, R) {
  
  corde <- NULL # prepara l'oggetto dove mettere i risulati

#-----------------------------------------------------------  
  # "genera le coordinate delle corde"
  # ATTENZIONE: in realta' NON genera delle corde, ma e'
  # solo per far vedere come si riempie l'oggetto con
  # le informazioni geometrice sulle corde
  # => RISCRIVERE QUESTA PARTE USANDO IL METODO PREFERITO
  x1 <- runif(n,-R*1.1,R*1.1)
  y1 <- runif(n,-R*1.1,R*1.1)
  x2 <- runif(n,-R*1.1,R*1.1)
  y2 <- runif(n,-R*1.1,R*1.1)
#-----------------------------------------------------------
  corde$p1 <- cbind(x1,y1)
  corde$p2 <- cbind(x2,y2)

  # calcola le lunghezze delle "corde"
  corde$len <- sqrt( (corde$p2[,1]-corde$p1[,1])^2 +
                    (corde$p2[,2]-corde$p1[,2])^2)
  # calcola i centri delle "corde"
  corde$mid <- cbind((corde$p2[,1]+corde$p1[,1])/2,
                     (corde$p2[,2]+corde$p1[,2])/2)
  return(corde)
}


R = 1      # raggio del cerchio
n  = 100   # numero di corde da generare
sl = TRUE  # inserisce pause durante il tracciamento delle corde (o dei punti) 
           # mettere FALSE ne caso di molti eventi
sl.time = 0.05 # tempo di pausa, in secondi

# chiamiamo la function e guardiamo/analizziamo
corde <- genera.corde(n, R)

# guardiamo cosa c'e' in corde:
str(corde)

# tracciamo il cerchio 
plot(0,0,xlim=c(-R*1.2,R*1.2), ylim=c(-R*1.2,R*1.2), pch="+", asp=1)
circles(0,0,1)

# aggiungiamo le corde (ricordiamo che questa versione di
# genera.corde() in realta' genera segmenti a caso che
# non sono necessariamente corde
for (i in 1:n) {
  lines(c(corde$p1[i,1],corde$p2[i,1]), c(corde$p1[i,2],corde$p2[i,2]), col='red')
  if(sl) dormi(sl.time)
}
#

pausa()

# guardiamo anche i centri delle 'corde'
plot(0,0,xlim=c(-R*1.2,R*1.2), ylim=c(-R*1.2,R*1.2), pch="+", asp=1)
circles(0,0,1)
for (i in 1:n) {
  points(corde$mid[i,1],corde$mid[i,2], col='red', cex=0.15)
  if(sl) dormi(sl.time)
}
#
pausa()
# guardiamo infine la distribuzione delle lunghezze delle corde
hist(corde$len,nc=50)
