Compute Radially Equispaced Points on Ellipse
ellipsePoints.RdCompute points on (the boundary of) an ellipse which is given by elementary geometric parameters.
Usage
ellipsePoints(a, b, alpha = 0, loc = c(0, 0), n = 201, keep.ab.order=FALSE)Arguments
- a,b
length of half axes in (x,y) direction. Note that \((a,b)\) is equivalent to \((b,a)\) unless
keep.ab.order=TRUE.- alpha
angle (in degrees) giving the orientation of the ellipse, i.e., the original (x,y)-axis ellipse is rotated by
angle.- loc
center (LOCation) of the ellipse.
- n
number of points to generate.
- keep.ab.order
logical indicating if \((a,b)\) should be considered ordered. When
FALSE, as per default, the orientation of the ellipse is solely determined byalpha.Note that
keep.ab.order = TRUEseems a more natural default, butFALSEis there for back-compatibility.
See also
the ellipse package and ellipsoidhull
and ellipsoidPoints
in the cluster package.
Examples
## Simple Ellipse, centered at (0,0), x-/y- axis parallel:
ep <- ellipsePoints(5,2)
str(ep)
#> num [1:201, 1:2] 5 4.98 4.94 4.87 4.77 ...
plot(ep, type="n",asp=1) ; polygon(ep, col = 2)
## (a,b) = (2,5) is equivalent to (5,2) :
lines(ellipsePoints(2,5), lwd=2, lty=3)
## keep.order=TRUE : Now, (2,5) are axes in x- respective y- direction:
lines(ellipsePoints(2,5, keep.ab.order=TRUE), col="blue")
## rotate by 30 degrees :
plot(ellipsePoints(5,2, alpha = 30), asp=1)
abline(h=0,v=0,col="gray")
abline(a=0,b= tan( 30 *pi/180), col=2, lty = 2)
abline(a=0,b= tan(120 *pi/180), col=3, lty = 2)
## NB: use x11(type = "Xlib") for the following if you can
if(dev.interactive(TRUE)) {
## Movie : rotating ellipse :
nTurns <- 4 # #{full 360 deg turns}
for(al in 1:(nTurns*360)) {
ep <- ellipsePoints(3,6, alpha=al, loc = c(5,2))
plot(ep,type="l",xlim=c(-1,11),ylim=c(-4,8),
asp=1, axes = FALSE, xlab="", ylab="")
}
## Movie : rotating _filled_ ellipse {less nice to look at}
for(al in 1:180) {
ep <- ellipsePoints(3,6, alpha=al, loc = c(5,2))
plot(ep,type="n",xlim=c(-1,11),ylim=c(-4,8),
asp=1, axes = FALSE, xlab="", ylab="")
polygon(ep,col=2,border=3,lwd=2.5)
}
}# only if interactive