# --------------------------------------------------
# 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)
write.csv(punkty, "punkty.csv", row.names = FALSE)
To embed this project on your website, copy the following code and paste it into your website's HTML: