public override bool TryTransform(Point uv, out Point outPoint)
            {
                double R = 0.5;
                double u = double.NaN;
                double v = double.NaN;

                if (IsInverse)
                {
                    Vector3D xyz = new Vector3D((uv.X - 0.5) * 2.0, uv.Y - 0.5, 0.0);
                    double   z2  = R * R - xyz.X * xyz.X - xyz.Y * xyz.Y;

                    if (z2 >= 0)
                    {
                        xyz.Z = Math.Sqrt(z2);
                        xyz   = PlateCarreEffect.InverseMatrix3D.Transform(xyz);

                        u = 0.995 * MathTool.Frac(0.5 * Math.Atan2(xyz.X, xyz.Z) / Math.PI - 0.5);
                        v = 0.5 + Math.Asin(xyz.Y / R) / Math.PI;
                    }
                }
                else
                {
                }

                outPoint = new Point(u, v);

                return(!(double.IsNaN(u) || double.IsNaN(v)));
            }