[R] points on a sphere
Mike Lonergan
mel at mcs.st-and.ac.uk
Mon Oct 28 19:45:22 CET 2002
Hi Richard,
Here's a non-iterative way of approximately laying out points on the surface
of a sphere. It basically lays out a spiral on the surface (like peeling an
apple) then drops the points along it. I don't know if it will be any actual
use to you, but I quite like it (and would be interested to know what breaks
it).
Cheers,
Mike.
----------------------------------------------------------------
Mike Lonergan
The Observatory, Buchanan Gardens ph: (+44) 1334 461803
University of St Andrews fax:(+44) 1334 461800
Fife, KY16 9LZ, Scotland email: mel at mcs.st-and.ac.uk
--------------------------------------------------------------------
##########
points.on.unit.sphere<-function(n)
{ # attempts to regularly distribute approximately n points on
# the surface of a unit sphere non-iteratively
# by laying them out along a spiral with a fixed (angular) pitch, c,
# x,y,z are the cartesian coordinates of the points,
# theta is their longitude, phi their lattitude (in radians)
# by Mike Lonergan, mel at mcs.st-and.ac.uk
c<-sqrt(n*pi)/2
theta<-c(0,2*pi)
for(i in 3:floor(n/2))
theta[i]<-theta[i-1]+pi/(c*cos(theta[i-1]/(2*c)-pi/2))
# theta[i]<-sqrt(2*c+theta[i-1]^2)
if (2*floor(n/2)==n)
theta<-c(theta,2*pi*c-rev(theta))
else
theta<-c(theta, pi*c, 2*pi*c-rev(theta))
pts<-data.frame(theta=theta)
pts$phi<-theta/(2*c)-pi/2
pts$x<-cos(theta)*cos(pts$phi)
pts$y<-sin(theta)*cos(pts$phi)
pts$z<-sin(pts$phi)
pts
}
nearest<-function(data)
{ # takes a dataframe with columns x, y, z and returns the (straightline)
nearest
# neighbour distances between the points in its rows
# inefficient, but adequate for checking points.on.unit.sphere.
res<-NA
for (i in 1:dim(data)[1])
res[i]<-sqrt(min((data$x[-i]-data$x[i])^2 + (data$y[-i]-data$y[i])^2 +
(data$z[-i]-data$z[i])^2))
res
}
points.on.unit.sphere(1000)->pous
nearest(pous)->npous
par(mfrow=c(2,2))
hist(npous,main="nearest neighbour distances")
plot(pous$x+sign(pous$z),pous$y,main="plan view")
plot(pous$x+sign(pous$y),pous$z,main="side.view")
plot(npous,ylab="nearest neighbour distances",xlab="theta")
length(which(npous<0.06))
##########
> -----Original Message-----
> From: owner-r-help at stat.math.ethz.ch
> [mailto:owner-r-help at stat.math.ethz.ch]On Behalf Of Richard Rowe
> Sent: 26 October 2002 00:46
> To: r-help at stat.math.ethz.ch
> Subject: [R] points on a sphere
>
>
> Not an R question directly, but has anyone got a method for
> placing a
> moderately large number of (near) equi-spaced points on a
> sphere? I have a
> nasty feeling platonic solids are needed for exact solutions and I'm
> thinking of samplings involving around 200 - 1000
> regularly-spaced points,
>
> Thanks,
>
> Richard Rowe
>
> Richard Rowe
> Senior Lecturer
> Department of Zoology and Tropical Ecology, James Cook University
> Townsville, Queensland 4811, Australia
> fax (61)7 47 25 1570
> phone (61)7 47 81 4851
> e-mail: Richard.Rowe at jcu.edu.au
> http://www.jcu.edu.au/school/tbiol/zoology/homepage.html
>
> -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
> .-.-.-.-.-.-.-.-.-
> r-help mailing list -- Read
> http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
> Send "info", "help", or "[un]subscribe"
> (in the "body", not the subject !) To:
> r-help-request at stat.math.ethz.ch
> _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
> ._._._._._._._._._
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: points on unit sphere.txt
Url: https://stat.ethz.ch/pipermail/r-help/attachments/20021028/c5b5a4b0/pointsonunitsphere.txt
More information about the R-help
mailing list