Mam parę punktów i chciałbym znaleźć kółka o znanym r, które są określone przez te dwa punkty. Będę używał tego w symulacji i możliwej przestrzeni dla x
i y
mają granice (powiedzmy pudełko z -200, 200).wyznaczyć środek okręgu na podstawie dwóch punktów (znany promień) z rozwiązać/optyma
It is known że kwadrat promienia jest
(x-x1)^2 + (y-y1)^2 = r^2
(x-x2)^2 + (y-y2)^2 = r^2
Chciałbym teraz, aby rozwiązać ten nieliniowy układ równań, aby uzyskać dwa potencjalne centra koła. Próbowałem użyć pakietu BB
. Oto moja słaba próba, która daje tylko jeden punkt. To, co chciałbym uzyskać, to oba możliwe punkty. Wszelkie wskazówki w dobrym kierunku spotkają się z bezpłatnym piwem przy pierwszej możliwej okazji.
library(BB)
known.pair <- structure(c(-46.9531139599816, -62.1874917150412, 25.9011462171242,
16.7441676243879), .Dim = c(2L, 2L), .Dimnames = list(NULL, c("x",
"y")))
getPoints <- function(ps, r, tr) {
# get parameters
x <- ps[1]
y <- ps[2]
# known coordinates of two points
x1 <- tr[1, 1]
y1 <- tr[1, 2]
x2 <- tr[2, 1]
y2 <- tr[2, 2]
out <- rep(NA, 2)
out[1] <- (x-x1)^2 + (y-y1)^2 - r^2
out[2] <- (x-x2)^2 + (y-y2)^2 - r^2
out
}
slvd <- BBsolve(par = c(0, 0),
fn = getPoints,
method = "L-BFGS-B",
tr = known.pair,
r = 40
)
Graficznie można to zobaczyć za pomocą następującego kodu, ale potrzebne będą dodatkowe pakiety.
library(sp)
library(rgeos)
plot(0,0, xlim = c(-200, 200), ylim = c(-200, 200), type = "n", asp = 1)
points(known.pair)
found.pt <- SpatialPoints(matrix(slvd$par, nrow = 1))
plot(gBuffer(found.pt, width = 40), add = T)
DODATEK
Dziękuję wszystkim za cenne uwagi i kodu. Dostaję czas na odpowiedzi przez plakaty, które uzupełniły swoje odpowiedzi kodem.
test replications elapsed relative user.self sys.self user.child sys.child
4 alex 100 0.00 NA 0.00 0 NA NA
2 dason 100 0.01 NA 0.02 0 NA NA
3 josh 100 0.01 NA 0.02 0 NA NA
1 roland 100 0.15 NA 0.14 0 NA NA
wykonaj punkty leżą na obwodzie? – James
Możliwe jest rozwiązanie układów równania rękami i używanie wzorów – MBo
@ James, tak, punkty leżą gdzieś na obwodzie. Zaktualizowałem swoją odpowiedź, która pokazuje wynik. –