get.dist = function(x)
{
  sqrt(x[1]^2 + x[2]^2)
}

get.pairs = function(N)
{
  M = matrix(0, nrow = N * (N - 1)/2, ncol = 2)
  x = 1:N
  k = 1
  
  for (i in head(x, -1))
  {
    for (j in (i + 1):(length(x)))
    {
      M[k, ] = c(i, j)
      k = k +1
    }
  }
  M
}

create.graph = function(N = 100, d = 0.3)
{
  rnd.points = matrix(runif(2 * N), ncol = 2)
  perms = get.pairs(N)
  
  Edges = apply(perms, 1, FUN = function(x){
    vec.diff = rnd.points[x[1], ] - rnd.points[x[2], ]
    get.dist(vec.diff)
  })
  
  res = cbind(Edges, perms)
  colnames(res) = c('E', 'V1', 'V2')
  list(M = res, N = N, d = d, pts = rnd.points)  
}

plot.graph = function(graph.obj)
{
  N = graph.obj$N
  d = graph.obj$d
  M = graph.obj$M
  rnd.points = graph.obj$pts
  
  caption = paste('G(N, d) : (', N, ', ', d, ')', sep = '')
  plot(rnd.points, type = 'p', pch = 21, bg = 'red', main = caption, cex = 1.5)
  
  for (r in 1:nrow(M))
  {
    if (M[r, 1] <= d)
    {
      v1 = M[r, 2]
      v2 = M[r, 3]
      arrows(rnd.points[v1, 1], rnd.points[v1, 2], rnd.points[v2, 1], rnd.points[v2, 2], angle = 0)
    }
  }
}

draw.graph = function(N = 100, d = 0.3)
{
  g = create.graph(N, d)
  plot.graph(g)
}