- As the document says,
Compile[{{x1,t1,n1},…},expr]
assumes thatxi
is a rankni
array of objects, each of a type that matchesti
.
Hence, {xyz,_Real,1}
means xyz
is a rank 1 array of "real numbers". Since xyz
is a vector, xyz[[1]]
means the first component of xyz
. Therefore, if xyz={2,4,3}
, then xyz[[1]]=2
.
The
expr
inCompile[{{x1,t1,n1},…},expr]
is given by the block ofModule
, a simple example of which for seeing how it works could bef=Module[{r=x,theta=y},{r,theta,r+theta}];
Here is how the function really works. Given $x=(x_1,x_2,x_3)$ and $y=(y_1,y_2,y_3)$ in $\mathbb{R}^3$, the output of the function is $$ \bigg(\frac{r(1+x_3)}{1+x_3-y_3}\cos(\theta+\pi)+x_1, \frac{r(1+x_3)}{1+x_3-y_3}\sin(\theta+\pi)+x_2,0\bigg) $$ where $$ r:=\sqrt{(x_1-y_1)^2+(x_2-y_2)^2},\quad \theta:=\arctan\frac{x_2-y_2}{x_1-y_1}. $$
The coordinate of the center of the sphere $S$ is given by $x=(x_1,x_2,x_3)$ and the radius of the sphere is $1$. This makes sense since the output of the function is of the form $(R\cos\psi+x_1,R\sin\psi+x_2,0)$, which implies that $x_1,x_2$ are the first two coordinates of the center of the sphere.
On the other hand, $y=(y_1,y_2,y_3)$ is the coordinate of a point on the sphere. The output of the function gives the coordinate of the "sterographic projection" of $y$ (the intersection of the line (which goes through $y$ and the north pole of the sphere) with the complex plane). When $x=(0,0,0),$ the function coincides with the one defined in Wikipedia.
One needs to be careful ofwith the definition $\theta$ since in Mathematica, ArcTan[x,y]
is different from the function $\arctan\frac{y}{x}$. For instance one has in Mathematica ArcTan[1,1]
=$\frac{\pi}{4}$ and ArcTan[-1,-1]
=$\frac{-3\pi}{4}$. This is why $\theta+\pi$ instead of $\theta$ is used in the output of the function. For the sake of a function, one could define $\theta$ as the angle of the vector $(y_1-x_1,y_2-x_2,0)$ with the $X_1$-axis and replace $\theta+\pi$ with $\theta$ in the output of the function.
In the code, one could replace theta = ArcTan[(xyz[[1]] - XYZ[[1]]), (xyz[[2]] - XYZ[[2]])]
with theta = ArcTan[(XYZ[[1]] - xyz[[1]]), (XYZ[[2]] - xyz[[2]])]
and theta + Pi
in the Cos
and Sin
functions with theta
.
Having not checked it though, I think one can simply replace Cos[theta+Pi]
with XYZ[[1]]-xyz[[1]]
and Sin[theta+Pi]
with XYZ[[2]]-xyz[[2]]
so that one does not need to introduce the variable theta
at all.