В действительности Вы создали версию бедного человека ThreadPool. Ваш второй поток просто находится, там ничего не делая и без изрядного количества работы с Вашей стороны, Вы не можете только заставить его делать работу для Вас. Необходимо было бы передать делегатов в очередь, которую поток тогда снимает и выполняет.
Ваш лучший выбор состоит в том, чтобы сделать то, что Вы предназначили, и просто используйте.NET ThreadPool и дайте ему работу, чтобы сделать.
See Mapping a Square to a Circle. There's also a nice visualization for the mapping. You get:
xCircle = xSquare * sqrt(1 - 0.5*ySquare^2)
yCircle = ySquare * sqrt(1 - 0.5*xSquare^2)
Разделите каждое значение на величину, чтобы нормализовать все значения к единичному вектору, например
magn = sqrt(x * x + y * y);
newx = magn > 1.0 ? x / magn : x;
newy = magn > 1.0 ? y / magn : y;
Однако это может иметь эффект отсечения величины вместо нормализации для внутренних значений. То есть вы получите одинаковое значение для контроллера, который «полностью» сдвинут в верхний левый угол, и контроллера почти , полностью сдвинутого в том же направлении.