- A+

Category：Languages

I have a curve, derived from empirical data, and I can obtain a reasonable model of it. I need to identify a point (x, y) where the curve intersects a circle of known center and radius. The following code illustrates the question.

`x <- c(0.05, 0.20, 0.35, 0.50, 0.65, 0.80, 0.95, 1.10, 1.25, 1.40, 1.55, 1.70, 1.85, 2.00, 2.15, 2.30, 2.45, 2.60, 2.75, 2.90, 3.05) y <- c(1.52, 1.44, 1.38, 1.31, 1.23, 1.15, 1.06, 0.96, 0.86, 0.76, 0.68, 0.61, 0.54, 0.47, 0.41, 0.36, 0.32, 0.29, 0.27, 0.26, 0.26) fit <- loess(y ~ x, control = loess.control(surface = "direct")) newx <- data.frame(x = seq(0, 3, 0.01)) fitline <- predict(fit, newdata = newx) est <- data.frame(newx, fitline) plot(x, y, type = "o",lwd = 2) lines(est, col = "blue", lwd = 2) library(plotrix) draw.circle(x = 3, y = 0, radius = 2, nv = 1000, lty = 1, lwd = 1) `

It's straightforward to find the intersection using functions from the `sf`

package. Similar to @Onyambu, we first calculate the circle values:

`circ <- function(xc = 0, yc = 0, r = 1, n = 100){ v <- seq(0, 2 * pi, len = n) cbind(x = xc + r * cos(v), y = yc + r * sin(v)) } m <- circ(xc = 3, yc = 0, r = 2) `

Then convert your predicted values and the circle values to "simple features" (`LINESTRING`

), and find their intersection:

`library(sf) int <- st_intersection(st_linestring(as.matrix(est)), st_linestring(m)) int # POINT (1.2091 0.8886608) `

Add the intersection to your plot:

`plot(x, y, type = "o", lwd = 2) lines(est, col = "blue", lwd = 2) lines(m) points(int[1], int[2], col = "red", pch = 19) `