View source: R/stereographic.R
stereographic | R Documentation |
The stereographic projection is a function that maps the n-dimensional sphere from the South pole (0,...,-1) to the tangent plane of the sphere at the north pole (0,...,+1).
stereographic(p)
stereographic_inv(q)
p |
point on the n-spere ; can also be a set of points, each point represented as a column of a matrix. |
q |
point on the tangent plane at the north pole (last coordinate = 1); can also be a set of such points. |
The stereographic projection is a smooth function from S^n - (0,\dots,-1)
to the tangent hyperplane at the north pole. The south pole is mapped to
infinity, that is why one speaks of S^n
as a 'one-point compactification'
of R^{n-1}
.
All mapped points will have a last coordinate 1.0 (lying on the tangent plane.) Points mapped by 'stereographic_inv' are assumed to have a last coordinate 1.0 (this will not be checked), otherwise the result will be different from what is expected – though the result is still correct in itself.
All points are column vectors: stereographic
will transform a row
vector to column; stereographic_inv
will return a single vector
as column.
Returns a point (or a set of point) of (n-1) dimensions on the tangent plane
resp. an n-dimensional point on the n-sphere, i.e., sum(x^2) = 1
.
To map a region around the south pole, a similar function would be possible. Instead it is simpler to change the sign of the last coordinate.
Original MATLAB code by J.Burkardt under LGPL license; rewritten in R by Hans W Borchers.
See the "Stereographic projection" article on Wikipedia.
# points in the xy-plane (i.e., z = 0)
A <- matrix(c(1,0,0, -1,0,0, 0,1,0, 0,-1,0), nrow = 3)
B <- stereographic(A); B
## [,1] [,2] [,3] [,4]
## [1,] 2 -2 0 0
## [2,] 0 0 2 -2
## [3,] 1 1 1 1
stereographic_inv(B)
## [,1] [,2] [,3] [,4]
## [1,] 1 -1 0 0
## [2,] 0 0 1 -1
## [3,] 0 0 0 0
stereographic_inv(c(2,0,2)) # not correct: z = 2
## [,1]
## [1,] 1.0
## [2,] 0.0
## [3,] 0.5
## Not run:
# Can be used for optimization with sum(x^2) == 1
# Imagine to maximize the product x*y*z for x^2 + y^2 + z^2 == 1 !
fnObj <- function(x) { # length(x) = 2
x1 <- stereographic_inv(c(x, 1)) # on S^2
return( -prod(x1) ) # Maximize
}
sol <- optim(c(1, 1), fnObj)
-sol$value # the maximal product
## [1] 0.1924501 # 1/3 * sqrt(1/3)
stereographic_inv(c(sol$par, 1)) # the solution coordinates
[,1] # on S^2
## [1,] 0.5773374 # by symmetry must be
## [2,] 0.5773756 # sqrt(1/3) = 0.5773503...
## [3,] 0.5773378
## End(Not run)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.