using System; using System.Collections.Generic; using System.Reflection.Emit; using System.Text; using Sunweaver.Commands.Attributes; using Sunweaver.VM; namespace Sunweaver.Commands { [BasePair("Given a point (x,y), returns the angle from (1,0) in the range [-180 degrees, 180 degrees]. " + "That range is mapped to [-4500, 4500].]")] public class atan : Abstracts.BinaryOperation { public override void Operation(long a, long b) { VM.Stack.Push( (long)Math.Round(Math.Atan2(a,b) / (2 * Math.PI) * DNASystem.UnitsInAFullCircle)); } public override void CompileOperation(ILGenerator il, Locals locals) { il.Emit(OpCodes.Ldloc, locals[typeof(VirtualMachine)]); il.Emit(OpCodes.Ldfld, typeof(VirtualMachine).GetField("Stack")); il.Emit(OpCodes.Ldloc, locals[typeof(long), 0]); il.Emit(OpCodes.Conv_I8); il.Emit(OpCodes.Ldloc, locals[typeof(long), 1]); il.Emit(OpCodes.Conv_I8); il.Emit(OpCodes.Call, typeof(Math).GetMethod("Atan2")); il.Emit(OpCodes.Ldc_R8, Math.PI); il.Emit(OpCodes.Div); il.Emit(OpCodes.Ldc_R8, DNASystem.UnitsInAFullCircle); il.Emit(OpCodes.Div); il.Emit(OpCodes.Call, typeof(Math).GetMethod("Round")); il.Emit(OpCodes.Conv_I8); il.Emit(OpCodes.Call, typeof(IntStack).GetMethod("Push")); } } }