Add WAngle.ArcTan().
This commit is contained in:
@@ -67,6 +67,41 @@ namespace OpenRA
|
|||||||
return new WAngle(Angle - 512).Tan();
|
return new WAngle(Angle - 512).Tan();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static WAngle ArcTan(int y, int x)
|
||||||
|
{
|
||||||
|
if (y == 0)
|
||||||
|
return new WAngle(x >= 0 ? 0 : 512);
|
||||||
|
|
||||||
|
if (x == 0)
|
||||||
|
return new WAngle(Math.Sign(y)*256);
|
||||||
|
|
||||||
|
var ay = Math.Abs(y);
|
||||||
|
var ax = Math.Abs(x);
|
||||||
|
|
||||||
|
// Find the closest angle that satisfies y = x*tan(theta)
|
||||||
|
var bestVal = int.MaxValue;
|
||||||
|
var bestAngle = 0;
|
||||||
|
for (var i = 0; i < 256; i++)
|
||||||
|
{
|
||||||
|
var val = Math.Abs(1024*ay - ax*TanTable[i]);
|
||||||
|
if (val < bestVal)
|
||||||
|
{
|
||||||
|
bestVal = val;
|
||||||
|
bestAngle = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculate quadrant
|
||||||
|
if (x < 0 && y > 0)
|
||||||
|
bestAngle = 512 - bestAngle;
|
||||||
|
else if (x < 0 && y < 0)
|
||||||
|
bestAngle = 512 + bestAngle;
|
||||||
|
else if (x > 0 && y < 0)
|
||||||
|
bestAngle = 1024 - bestAngle;
|
||||||
|
|
||||||
|
return new WAngle(bestAngle);
|
||||||
|
}
|
||||||
|
|
||||||
// Must not be used outside rendering code
|
// Must not be used outside rendering code
|
||||||
public float RendererRadians() { return (float)(Angle * Math.PI / 512f); }
|
public float RendererRadians() { return (float)(Angle * Math.PI / 512f); }
|
||||||
public float RendererDegrees() { return Angle * 0.3515625f; }
|
public float RendererDegrees() { return Angle * 0.3515625f; }
|
||||||
|
|||||||
Reference in New Issue
Block a user