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))); }