diff --git a/maths.cpp b/maths.cpp index 29afc02..5309b0d 100644 --- a/maths.cpp +++ b/maths.cpp @@ -20,6 +20,11 @@ void angleToStep(long &stepX, long &stepY, double angleX, double angleY) { stepY = angleY / stepRatioY; } +double rollCorrection(double x, double max, double width) { + double correction = max * (1.0 - cos((10.0 * x) / (width * M_PI))) / 2.0; + return x - correction; +} + void cartesianToPolar(long &stepX, long &stepY, double zeroX, double zeroY, double x, double y, double z) { //TODO remove magic numbers double distance = 166.0; //turret to screen @@ -28,12 +33,20 @@ void cartesianToPolar(long &stepX, long &stepY, double zeroX, double zeroY, doub x = -x; //natural axis direction double dX = x + offsetX; - double dY = y + offsetY; + double dY = rollCorrection(y + offsetY, 0.2, 400.0); double dZ = z + distance; - double rho = sqrt(pow(dX, 2.0) + pow(dY, 2.0) + pow(dZ, 2.0)); - double angleY = M_PI / 2.0 - acos(dY / rho); - double angleX = atan2(dX, dZ); + + double roll = atan2(4.0, 236.0); + double rollY = dX * tan(roll); + double rollX = dY * tan(roll); + + double dXr = dX + rollX; + double dYr = dY + rollY; + + double rho = sqrt(pow(dXr, 2.0) + pow(dYr, 2.0) + pow(dZ, 2.0)); + double angleY = M_PI / 2.0 - acos(dYr / rho); + double angleX = atan2(dXr, dZ); angleToStep(stepX, stepY, angleX, angleY); }