void BackwardConcentricMap(Real64 &u, Real64 &v)
{

	Real64 radius, theta;

	radius = Sqrt64(u*u + v*v);
	theta  = Arg64 (v, u) / QuadPi64;

	if(3.0 <= theta)
	{
		u = -radius;
		v = -radius * (theta - 4.0);
	}
	else if(1.0 <= theta && theta < 3.0)
	{
		u = radius * (2.0 - theta);
		v = radius;
	}
	else if(-1.0 <= theta && theta < 1.0)
	{
		u = radius;
		v = radius * theta;
	}
	else if(-3.0 <= theta && theta < -1.0)
	{
		u =  radius * (2.0 + theta);
		v = -radius;
	}
	else
	{
		u = -radius;
		v = -radius * (theta + 4.0);
	}

	u = (u+1.0) * 0.5;
	v = (v+1.0) * 0.5;

}


void ForwardConcentricMap(Real64 &u, Real64 &v)
{

	u = 2.0 * u - 1.0;
	v = 2.0 * v - 1.0;

	// Avoid Zero Divide
	if(0.0 == u && 0.0 == v)
	{
		return;
	}

	Real64 radius, theta;

	if(u > -v)
	{
		if(u > v) { radius =  u; theta = (u == 0.0) ? 0.0 : 0.0 + v/u; }
		else      { radius =  v; theta = (v == 0.0) ? 0.0 : 2.0 - u/v; }
	}
	else
	{
		if(u < v) { radius = -u; theta = (u == 0.0) ? 0.0 : 4.0 + v/u; }
		else      { radius = -v; theta = (v == 0.0) ? 0.0 : 6.0 - u/v; }
	}

	theta *= QuadPi64;

	u = radius * Cos64(theta);
	v = radius * Sin64(theta);

}
