# --------------------------------------------------
# Funkcja generująca losowe punkty w kole
# --------------------------------------------------

dane <- function(srodek, promien, n) {

  x0 <- srodek[1]
  y0 <- srodek[2]

  theta <- 2 * pi * runif(n)
  rho <- promien * sqrt(runif(n))

  x <- x0 + rho * cos(theta)
  y <- y0 + rho * sin(theta)

  punkty <- cbind(x, y)

  return(punkty)
}


# --------------------------------------------------
# Główny skrypt
# --------------------------------------------------

srodki <- matrix(c(
   1,  6,
  -4,  0,
   3, -4
), ncol = 2, byrow = TRUE)

n <- nrow(srodki)


# --------------------------------------------------
# Obliczanie odległości pomiędzy środkami
# --------------------------------------------------

odleglosc_punkty <- matrix(0, nrow = choose(n, 2), ncol = 3)

idx <- 1

if (n >= 2) {
  for (i in 1:(n - 1)) {
    for (j in (i + 1):n) {

      odleglosc <- sqrt(sum((srodki[i, ] - srodki[j, ])^2))

      odleglosc_punkty[idx, ] <- c(odleglosc, i, j)

      idx <- idx + 1
    }
  }
}
# Sortowanie odległości rosnąco
odleglosc_punkty <- odleglosc_punkty[
  order(odleglosc_punkty[, 1]), 
]


# --------------------------------------------------
# Wyznaczanie promieni
# --------------------------------------------------

promien <- rep(0, n)
promien_pomocniczy <- c()

proporcja_promienia <- 0.3

for (i in 1:nrow(odleglosc_punkty)) {

  srodekA <- as.integer(odleglosc_punkty[i, 2])
  srodekB <- as.integer(odleglosc_punkty[i, 3])

  odleglosc <- odleglosc_punkty[i, 1]

  if (promien[srodekA] == 0 && promien[srodekB] == 0) {

    promien[srodekA] <- proporcja_promienia * odleglosc
    promien[srodekB] <- (1 - proporcja_promienia) * odleglosc

  } else if (promien[srodekA] != 0) {

    promien_pomocniczy <- c(
      promien_pomocniczy,
      odleglosc - promien[srodekA]
    )

    idx_zerowego <- srodekB

  } else {

    promien_pomocniczy <- c(
      promien_pomocniczy,
      odleglosc - promien[srodekB]
    )

    idx_zerowego <- srodekA
  }
}


# Uzupełnienie ostatniego promienia
promien_pomocniczy_sorted <- sort(promien_pomocniczy)

promien[idx_zerowego] <- promien_pomocniczy_sorted[1]


# --------------------------------------------------
# Generowanie punktów
# --------------------------------------------------

gestosc <- 6
wsp_skali_promienia <- 1.0

punkty <- matrix(numeric(0), ncol = 2)

# Przygotowanie wykresu
plot(NA,
     xlim = range(srodki[, 1]) + c(-max(promien), max(promien)),
     ylim = range(srodki[, 2]) + c(-max(promien), max(promien)),
     asp = 1,
     xlab = "x",
     ylab = "y",
     main = "Losowe punkty wokół zadanych środków")

grid()

for (i in 1:n) {

  punkty_ <- dane(
    srodki[i, ],
    wsp_skali_promienia * promien[i],
    ceiling(gestosc * promien[i]^2)
  )

  punkty <- rbind(punkty, punkty_)

  points(punkty_[, 1], punkty_[, 2],
         pch = 1,
         col = "blue")
}


# Rysowanie środków
points(srodki[, 1], srodki[, 2],
       pch = 4,
       col = "red",
       lwd = 2,
       cex = 1.5)

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: