R: Fitting a Circle

circlefit {pracma} | R Documentation

## Fitting a Circle

### Description

Fitting a circle from points in the plane

### Usage

    circlefit(xp, yp, fast = FALSE)

### Arguments

`xp, yp` | Vectors representing the x and y coordinates of plane points
`fast` | logical; shall a fast, non-optimized solution be returned?

### Details

This routine first finds an ‘algebraic’ solution based on a linear fit and then calls `optim` with this solution as starting point. If `fast` is `TRUE` the algebraic solution will not be improved.

The value to be minimized is the distance of the given points to the nearest point on the circle.

### Value

Returns x- and y-coordinates of the center and the radius as a vector of length 3.

Writes the RMS error of the distance of the original points to the circle directly onto the console.

### Note

May be worth to apply `nls` instead of `optim`.

### References

Gander, W., G. H. Golub, and R. Strebel (1994). Fitting of Circles and Ellipses — Least Squares Solutions. ETH Zürich, Technical Report 217, Institut für Wissenschaftliches Rechnen.

### Examples

    # set.seed(8421)
    n  <- 20
    w  <- 2*pi*runif(n)
    xp <- cos(w) + 1 + 0.25 * (runif(n) - 0.5)
    yp <- sin(w) + 1 + 0.25 * (runif(n) - 0.5)

    circlefit(xp, yp, fast = TRUE)  #=> 0.9899628 1.0044920 1.0256633
                                    # RMS error: 0.07631986
    rslt <- circlefit(xp, yp)       #=> 0.9965782 1.0009066 1.0240452
                                    # RMS error: 0.07611598
    ## Not run:
    x0 <- rslt[1]; y0 <- rslt[2]; r0 <- rslt[3]
    plot(c(-0.2, 2.2), c(-0.2, 2.2), type="n", asp=1)
    grid()
    abline(h=0, col="gray"); abline(v=0, col="gray")
    points(xp, yp, col="darkred")

    w  <- seq(0, 2*pi, len=100)
    xx <- r0 * cos(w) + x0
    yy <- r0 * sin(w) + y0
    lines(xx, yy, col="blue")
    ## End(Not run)

[Package pracma version 2.0.4 Index]