public Direction GetRetrograde() { var up = (Target.findLocalMOI(Target.findWorldCenterOfMass()) - Target.mainBody.position).normalized; var d = new Direction {Rotation = Quaternion.LookRotation(Target.orbit.GetVel().normalized*-1, up)}; return d; }
public Direction GetPrograde() { var up = (target.findLocalMOI(target.findWorldCenterOfMass()) - target.mainBody.position).normalized; Direction d = new Direction(); d.Rotation = Quaternion.LookRotation(target.orbit.GetVel().normalized, up); return d; }
private bool TryParseFunction(string text) { Match match; bool result; foreach(kOSExternalFunction f in executionContext.ExternalFunctions) { match = Regex.Match(text, f.regex, RegexOptions.IgnoreCase); if (match.Success) { EvalDlg = delegate() { match = Regex.Match(text, f.regex, RegexOptions.IgnoreCase); string[] pArr = new string[f.ParameterCount]; for (var i = 0; i < f.ParameterCount; i++) { pArr[i] = ParseSubExpressionAsString(match.Groups[i + 1].Value); } Value = executionContext.CallExternalFunction(f.Name, pArr); }; EvalDlg(); return true; } } #region TRIG // Basic result = TryParseNumericFunction("SIN_(1)", text, delegate(double[] parameters) { Value = (float)Math.Sin(parameters[0] * (Math.PI / 180)); }); if (result) return true; result = TryParseNumericFunction("COS_(1)", text, delegate(double[] parameters) { Value = (float)Math.Cos(parameters[0] * (Math.PI / 180)); }); if (result) return true; result = TryParseNumericFunction("TAN_(1)", text, delegate(double[] parameters) { Value = (float)Math.Tan(parameters[0] * (Math.PI / 180)); }); if (result) return true; // Inverse result = TryParseNumericFunction("ARCSIN_(1)", text, delegate(double[] parameters) { Value = (float)(Math.Asin(parameters[0]) * (180 / Math.PI)); }); if (result) return true; result = TryParseNumericFunction("ARCCOS_(1)", text, delegate(double[] parameters) { Value = (float)(Math.Acos(parameters[0]) * (180 / Math.PI)); }); if (result) return true; result = TryParseNumericFunction("ARCTAN_(1)", text, delegate(double[] parameters) { Value = (float)Math.Atan(parameters[0] * (180 / Math.PI)); }); if (result) return true; result = TryParseNumericFunction("ARCTAN2_(2)", text, delegate(double[] parameters) { Value = (float)Math.Atan2(parameters[0] * (180 / Math.PI), parameters[1] * (180 / Math.PI)); }); if (result) return true; /* string regexSin = Utils.BuildRegex("SIN_(1)"); match = Regex.Match(text, regexSin, RegexOptions.IgnoreCase); if (match.Success) { EvalDlg = delegate() { match = Regex.Match(text, regexSin, RegexOptions.IgnoreCase); double v = ParseSubExpressionAsDouble(match.Groups[1].Value); Value = (float)Math.Sin(v * (Math.PI / 180)); }; EvalDlg(); return true; } string regexCos = Utils.BuildRegex("COS_(1)"); match = Regex.Match(text, regexCos, RegexOptions.IgnoreCase); if (match.Success) { EvalDlg = delegate() { match = Regex.Match(text, regexCos, RegexOptions.IgnoreCase); double v = ParseSubExpressionAsDouble(match.Groups[1].Value); Value = (float)Math.Cos(v * (Math.PI / 180)); }; EvalDlg(); return true; } string regexTan = Utils.BuildRegex("TAN_(1)"); match = Regex.Match(text, regexTan, RegexOptions.IgnoreCase); if (match.Success) { EvalDlg = delegate() { match = Regex.Match(text, regexTan, RegexOptions.IgnoreCase); double v = ParseSubExpressionAsDouble(match.Groups[1].Value); Value = (float)Math.Tan(v * (Math.PI / 180)); }; EvalDlg(); return true; } string regexASin = Utils.BuildRegex("ARCSIN_(1)"); match = Regex.Match(text, regexASin, RegexOptions.IgnoreCase); if (match.Success) { EvalDlg = delegate() { match = Regex.Match(text, regexASin, RegexOptions.IgnoreCase); double v = ParseSubExpressionAsDouble(match.Groups[1].Value); Value = (float)(Math.Asin(v) * (180 / Math.PI)); }; EvalDlg(); return true; } string regexACos = Utils.BuildRegex("ARCCOS_(1)"); match = Regex.Match(text, regexACos, RegexOptions.IgnoreCase); if (match.Success) { EvalDlg = delegate() { match = Regex.Match(text, regexACos, RegexOptions.IgnoreCase); double v = ParseSubExpressionAsDouble(match.Groups[1].Value); Value = (float)(Math.Acos(v) * (180 / Math.PI)); }; EvalDlg(); return true; } string regexATan = Utils.BuildRegex("ARCTAN_(1)"); match = Regex.Match(text, regexATan, RegexOptions.IgnoreCase); if (match.Success) { EvalDlg = delegate() { match = Regex.Match(text, regexATan, RegexOptions.IgnoreCase); double v = ParseSubExpressionAsDouble(match.Groups[1].Value); Value = (float)(Math.Atan(v) * (180 / Math.PI)); }; EvalDlg(); return true; } string regexATan2 = Utils.BuildRegex("ARCTAN2_(2)"); match = Regex.Match(text, regexATan2, RegexOptions.IgnoreCase); if (match.Success) { EvalDlg = delegate() { match = Regex.Match(text, regexATan2, RegexOptions.IgnoreCase); double x = ParseSubExpressionAsDouble(match.Groups[1].Value); double y = ParseSubExpressionAsDouble(match.Groups[2].Value); Value = (float)(Math.Atan2(x, y) * (180 / Math.PI)); }; EvalDlg(); return true; }*/ #endregion #region ABS match = Regex.Match(text, "^ABS\\(([ :@A-Za-z0-9\\.\\-\\+\\*/]+)\\)$", RegexOptions.IgnoreCase); if (match.Success) { EvalDlg = delegate() { match = Regex.Match(text, "^ABS\\(([ :@A-Za-z0-9\\.\\-\\+\\*/]+)\\)$", RegexOptions.IgnoreCase); double v = ParseSubExpressionAsDouble(match.Groups[1].Value); Value = (float)Math.Abs(v); }; EvalDlg(); return true; } #endregion #region Geospatial match = Regex.Match(text, "^LATLNG ?\\(([ :@A-Za-z0-9\\.\\-\\+\\*/]+),([ :@A-Za-z0-9\\.\\-\\+\\*/]+)\\)$", RegexOptions.IgnoreCase); if (match.Success) { EvalDlg = delegate() { match = Regex.Match(text, "^LATLNG ?\\(([ :@A-Za-z0-9\\.\\-\\+\\*/]+),([ :@A-Za-z0-9\\.\\-\\+\\*/]+)\\)$", RegexOptions.IgnoreCase); double lat = ParseSubExpressionAsDouble(match.Groups[1].Value); double lng = ParseSubExpressionAsDouble(match.Groups[2].Value); Value = new GeoCoordinates(executionContext.Vessel, lat, lng); }; EvalDlg(); return true; } #endregion #region Vectors & Rotations match = Regex.Match(text, "^V\\(([ :@A-Za-z0-9\\.\\-\\+\\*/]+),([ :@A-Za-z0-9\\.\\-\\+\\*/]+),([ :@A-Za-z0-9\\.\\-\\+\\*/]+)\\)$", RegexOptions.IgnoreCase); if (match.Success) { EvalDlg = delegate() { match = Regex.Match(text, "^V\\(([ :@A-Za-z0-9\\.\\-\\+\\*/]+),([ :@A-Za-z0-9\\.\\-\\+\\*/]+),([ :@A-Za-z0-9\\.\\-\\+\\*/]+)\\)$", RegexOptions.IgnoreCase); double x = ParseSubExpressionAsDouble(match.Groups[1].Value); double y = ParseSubExpressionAsDouble(match.Groups[2].Value); double z = ParseSubExpressionAsDouble(match.Groups[3].Value); Value = new Vector(x,y,z); }; EvalDlg(); return true; } match = Regex.Match(text, "^R\\(([ :@A-Za-z0-9\\.\\-\\+\\*/]+),([ :@A-Za-z0-9\\.\\-\\+\\*/]+),([ :@A-Za-z0-9\\.\\-\\+\\*/]+)\\)$", RegexOptions.IgnoreCase); if (match.Success) { EvalDlg = delegate() { match = Regex.Match(text, "^R\\(([ :@A-Za-z0-9\\.\\-\\+\\*/]+),([ :@A-Za-z0-9\\.\\-\\+\\*/]+),([ :@A-Za-z0-9\\.\\-\\+\\*/]+)\\)$", RegexOptions.IgnoreCase); double x = ParseSubExpressionAsDouble(match.Groups[1].Value); double y = ParseSubExpressionAsDouble(match.Groups[2].Value); double z = ParseSubExpressionAsDouble(match.Groups[3].Value); Value = new Direction(new Vector3d(x, y, z), true); }; EvalDlg(); return true; } match = Regex.Match(text, "^Q\\(([ :@A-Za-z0-9\\.\\-\\+\\*/]+),([ :@A-Za-z0-9\\.\\-\\+\\*/]+),([ :@A-Za-z0-9\\.\\-\\+\\*/]+),([ :@A-Za-z0-9\\.\\-\\+\\*/]+)\\)$", RegexOptions.IgnoreCase); if (match.Success) { EvalDlg = delegate() { match = Regex.Match(text, "^Q\\(([ :@A-Za-z0-9\\.\\-\\+\\*/]+),([ :@A-Za-z0-9\\.\\-\\+\\*/]+),([ :@A-Za-z0-9\\.\\-\\+\\*/]+),([ :@A-Za-z0-9\\.\\-\\+\\*/]+)\\)$", RegexOptions.IgnoreCase); float x = (float)ParseSubExpressionAsDouble(match.Groups[1].Value); float y = (float)ParseSubExpressionAsDouble(match.Groups[2].Value); float z = (float)ParseSubExpressionAsDouble(match.Groups[3].Value); float w = (float)ParseSubExpressionAsDouble(match.Groups[4].Value); Value = x + " " + y + " " + z + " " + w; }; EvalDlg(); return true; } match = Regex.Match(text, "^HEADING ?([ :@A-Za-z0-9\\.\\-\\+\\*/]+) BY ([ :@A-Za-z0-9\\.\\-\\+\\*/]+)$", RegexOptions.IgnoreCase); if (match.Success) { EvalDlg = delegate() { match = Regex.Match(text, "^HEADING ?([ :@A-Za-z0-9\\.\\-\\+\\*/]+) BY ([ :@A-Za-z0-9\\.\\-\\+\\*/]+)$", RegexOptions.IgnoreCase); float heading = (float)ParseSubExpressionAsDouble(match.Groups[1].Value); float pitch = (float)ParseSubExpressionAsDouble(match.Groups[2].Value); var q = UnityEngine.Quaternion.LookRotation(VesselUtils.GetNorthVector(executionContext.Vessel), executionContext.Vessel.upAxis); q *= UnityEngine.Quaternion.Euler(new UnityEngine.Vector3(-pitch, heading, 0)); Value = new Direction(q); }; EvalDlg(); return true; } #endregion return false; }
public override void AddTo(BindingManager manager) { manager.AddGetter("VESSELNAME", delegate(CPU cpu) { return cpu.Vessel.vesselName; }); manager.AddSetter("VESSELNAME", delegate(CPU cpu, object value ) { cpu.Vessel.vesselName = value.ToString(); }); manager.AddGetter("ALTITUDE", delegate(CPU cpu) { return cpu.Vessel.altitude; }); manager.AddGetter("ALT:RADAR", delegate(CPU cpu) { return cpu.Vessel.heightFromTerrain > 0 ? Mathf.Min(cpu.Vessel.heightFromTerrain, (float)cpu.Vessel.altitude) : (float)cpu.Vessel.altitude; }); manager.AddGetter("ALT:APOAPSIS", delegate(CPU cpu) { return cpu.Vessel.orbit.ApA; }); manager.AddGetter("ALT:PERIAPSIS", delegate(CPU cpu) { return cpu.Vessel.orbit.PeA; }); manager.AddGetter("ETA:APOAPSIS", delegate(CPU cpu) { return cpu.Vessel.orbit.timeToAp; }); manager.AddGetter("ETA:PERIAPSIS", delegate(CPU cpu) { return cpu.Vessel.orbit.timeToPe; }); manager.AddGetter("MISSIONTIME", delegate(CPU cpu) { return cpu.Vessel.missionTime; }); manager.AddGetter("TIME", delegate(CPU cpu) { return new kOS.TimeSpan(Planetarium.GetUniversalTime()); }); manager.AddGetter("STATUS", delegate(CPU cpu) { return cpu.Vessel.situation.ToString().Replace("_", " "); }); manager.AddGetter("COMMRANGE", delegate(CPU cpu) { return VesselUtils.GetCommRange(cpu.Vessel); }); manager.AddGetter("INCOMMRANGE", delegate(CPU cpu) { return Convert.ToDouble(CheckCommRange(cpu.Vessel)); }); manager.AddGetter("APOAPSIS", delegate(CPU cpu) { return cpu.Vessel.orbit.ApA; }); manager.AddGetter("PERIAPSIS", delegate(CPU cpu) { return cpu.Vessel.orbit.PeA; }); manager.AddGetter("VELOCITY", delegate(CPU cpu) { return new VesselVelocity(cpu.Vessel); }); manager.AddGetter("ANGULARMOMENTUM",delegate(CPU cpu) { return new Direction(cpu.Vessel.angularMomentum, true); }); manager.AddGetter("ANGULARVEL", delegate(CPU cpu) { return new Direction(cpu.Vessel.angularVelocity, true); }); manager.AddGetter("MASS", delegate(CPU cpu) { return cpu.Vessel.GetTotalMass(); }); manager.AddGetter("VERTICALSPEED", delegate(CPU cpu) { return cpu.Vessel.verticalSpeed; }); manager.AddGetter("SURFACESPEED", delegate(CPU cpu) { return cpu.Vessel.horizontalSrfSpeed; }); manager.AddGetter("BODY", delegate(CPU cpu) { return cpu.Vessel.mainBody.bodyName; }); manager.AddGetter("LATITUDE", delegate(CPU cpu) { return getLattitude(cpu); }); manager.AddGetter("LONGITUDE", delegate(CPU cpu) { return getLongitude(cpu); }); manager.AddGetter("GEOPOSITION", delegate(CPU cpu) { return new GeoCoordinates(cpu.Vessel, getLattitude(cpu), getLongitude(cpu)); }); manager.AddGetter("HEADING", delegate(CPU cpu) { return VesselUtils.GetHeading(cpu.Vessel); }); manager.AddGetter("NORTH", delegate(CPU cpu) { return new Direction(VesselUtils.GetNorthVector(cpu.Vessel), false); }); manager.AddGetter("UP", delegate(CPU cpu) { return new Direction(cpu.Vessel.upAxis, false); }); manager.AddGetter("ENCOUNTER", delegate(CPU cpu) { return VesselUtils.TryGetEncounter(cpu.Vessel); }); manager.AddGetter("NEXTNODE", delegate(CPU cpu) { var vessel = cpu.Vessel; if (!vessel.patchedConicSolver.maneuverNodes.Any()) { throw new kOSException("No maneuver nodes present!"); } return Node.FromExisting(vessel, vessel.patchedConicSolver.maneuverNodes[0]); }); manager.AddGetter("PROGRADE", delegate(CPU cpu) { Debug.Log("********* Check PRO"); var vessel = cpu.Vessel; var up = (vessel.findLocalMOI(vessel.findWorldCenterOfMass()) - vessel.mainBody.position).normalized; Direction d = new Direction(); d.Rotation = Quaternion.LookRotation(cpu.Vessel.orbit.GetVel().normalized, up); return d; }); manager.AddGetter("RETROGRADE", delegate(CPU cpu) { var vessel = cpu.Vessel; var up = (vessel.findLocalMOI(vessel.findWorldCenterOfMass()) - vessel.mainBody.position).normalized; Direction d = new Direction(); d.Rotation = Quaternion.LookRotation(cpu.Vessel.orbit.GetVel().normalized * -1, up); return d; }); manager.AddGetter("FACING", delegate(CPU cpu) { var facing = cpu.Vessel.transform.up; return new Direction(new Vector3d(facing.x, facing.y, facing.z).normalized, false); }); manager.AddGetter("MAXTHRUST", delegate(CPU cpu) { return VesselUtils.GetMaxThrust(cpu.Vessel); }); manager.AddGetter("AV", delegate(CPU cpu) { return cpu.Vessel.transform.InverseTransformDirection(cpu.Vessel.rigidbody.angularVelocity); }); manager.AddGetter("STAGE", delegate(CPU cpu) { return new StageValues(cpu.Vessel); }); }
private bool TryParseFunction(string text) { Match match; bool result; foreach(kOSExternalFunction f in executionContext.ExternalFunctions) { match = Regex.Match(text, f.regex, RegexOptions.IgnoreCase); if (match.Success) { EvalDlg = delegate() { match = Regex.Match(text, f.regex, RegexOptions.IgnoreCase); string[] pArr = new string[f.ParameterCount]; for (var i = 0; i < f.ParameterCount; i++) { pArr[i] = ParseSubExpressionAsString(match.Groups[i + 1].Value); } Value = executionContext.CallExternalFunction(f.Name, pArr); }; EvalDlg(); return true; } } #region TRIG // Basic result = TryParseNumericFunction("SIN_(1)", text, delegate(double[] parameters) { Value = Math.Sin(parameters[0] * (Math.PI / 180)); }); if (result) return true; result = TryParseNumericFunction("COS_(1)", text, delegate(double[] parameters) { Value = Math.Cos(parameters[0] * (Math.PI / 180)); }); if (result) return true; result = TryParseNumericFunction("TAN_(1)", text, delegate(double[] parameters) { Value = Math.Tan(parameters[0] * (Math.PI / 180)); }); if (result) return true; // Inverse result = TryParseNumericFunction("ARCSIN_(1)", text, delegate(double[] parameters) { Value = (Math.Asin(parameters[0]) * (180 / Math.PI)); }); if (result) return true; result = TryParseNumericFunction("ARCCOS_(1)", text, delegate(double[] parameters) { Value = (Math.Acos(parameters[0]) * (180 / Math.PI)); }); if (result) return true; result = TryParseNumericFunction("ARCTAN_(1)", text, delegate(double[] parameters) { Value = Math.Atan(parameters[0]) * (180 / Math.PI); }); if (result) return true; result = TryParseNumericFunction("ARCTAN2_(2)", text, delegate(double[] parameters) { Value = Math.Atan2(parameters[0], parameters[1]) * (180 / Math.PI); }); if (result) return true; #endregion #region Other Math result = TryParseNumericFunction("ABS_(1)", text, delegate(double[] parameters) { Value = Math.Abs(parameters[0]); }); if (result) return true; result = TryParseNumericFunction("FLOOR_(1)", text, delegate(double[] parameters) { Value = Math.Floor(parameters[0]); }); if (result) return true; result = TryParseNumericFunction("CEILING_(1)", text, delegate(double[] parameters) { Value = Math.Ceiling(parameters[0]); }); if (result) return true; result = TryParseNumericFunction("ROUND_(1)", text, delegate(double[] parameters) { Value = Math.Round(parameters[0]); }); if (result) return true; result = TryParseNumericFunction("SQRT_(1)", text, delegate(double[] parameters) { Value = Math.Sqrt(parameters[0]); }); if (result) return true; #endregion #region Geospatial result = TryParseNumericFunction("LATLNG_(2)", text, delegate(double[] parameters) { Value = new GeoCoordinates(executionContext.Vessel, parameters[0], parameters[1]); }); if (result) return true; #endregion #region Time result = TryParseNumericFunction("T_(1)", text, delegate(double[] parameters) { Value = new TimeSpan(parameters[0]); }); if (result) return true; #endregion #region Vectors & Rotations result = TryParseNumericFunction("V_(3)", text, delegate(double[] parameters) { Value = new Vector(parameters[0], parameters[1], parameters[2]); }); if (result) return true; result = TryParseNumericFunction("R_(3)", text, delegate(double[] parameters) { Value = new Direction(new Vector3d(parameters[0], parameters[1], parameters[2]), true); }); if (result) return true; result = TryParseNumericFunction("Q_(4)", text, delegate(double[] parameters) { Value = new Direction(new UnityEngine.Quaternion((float)parameters[0], (float)parameters[1], (float)parameters[2], (float)parameters[3])); }); if (result) return true; match = Regex.Match(text, "^HEADING ?([ :@A-Za-z0-9\\.\\-\\+\\*/]+) BY ([ :@A-Za-z0-9\\.\\-\\+\\*/]+)$", RegexOptions.IgnoreCase); if (match.Success) { EvalDlg = delegate() { match = Regex.Match(text, "^HEADING ?([ :@A-Za-z0-9\\.\\-\\+\\*/]+) BY ([ :@A-Za-z0-9\\.\\-\\+\\*/]+)$", RegexOptions.IgnoreCase); double heading = ParseSubExpressionAsDouble(match.Groups[1].Value); double pitch = ParseSubExpressionAsDouble(match.Groups[2].Value); var q = UnityEngine.Quaternion.LookRotation(VesselUtils.GetNorthVector(executionContext.Vessel), executionContext.Vessel.upAxis); q *= UnityEngine.Quaternion.Euler(new UnityEngine.Vector3((float)-pitch, (float)heading, 0)); Value = new Direction(q); }; EvalDlg(); return true; } #endregion #region Maneuver Nodes result = TryParseNumericFunction("NODE_(4)", text, delegate(double[] parameters) { Value = new Node(parameters[0], parameters[1], parameters[2], parameters[3]); }); if (result) return true; #endregion return false; }
private bool TryParseFunction(string text) { Match match; match = Regex.Match(text, "^SIN\\(([ :@A-Za-z0-9\\.\\-\\+\\*/]+)\\)$", RegexOptions.IgnoreCase); if (match.Success) { EvalDlg = delegate() { match = Regex.Match(text, "^SIN\\(([ :@A-Za-z0-9\\.\\-\\+\\*/]+)\\)$", RegexOptions.IgnoreCase); double v = ParseSubExpressionAsDouble(match.Groups[1].Value); Value = (float)Math.Sin(v * (Math.PI / 180)); }; EvalDlg(); return true; } match = Regex.Match(text, "^COS\\(([ :@A-Za-z0-9\\.\\-\\+\\*/]+)\\)$", RegexOptions.IgnoreCase); if (match.Success) { EvalDlg = delegate() { match = Regex.Match(text, "^COS\\(([ :@A-Za-z0-9\\.\\-\\+\\*/]+)\\)$", RegexOptions.IgnoreCase); double v = ParseSubExpressionAsDouble(match.Groups[1].Value); Value = (float)Math.Cos(v * (Math.PI / 180)); }; EvalDlg(); return true; } match = Regex.Match(text, "^TAN\\(([ :@A-Za-z0-9\\.\\-\\+\\*/]+)\\)$", RegexOptions.IgnoreCase); if (match.Success) { EvalDlg = delegate() { match = Regex.Match(text, "^TAN\\(([ :@A-Za-z0-9\\.\\-\\+\\*/]+)\\)$", RegexOptions.IgnoreCase); double v = ParseSubExpressionAsDouble(match.Groups[1].Value); Value = (float)Math.Tan(v * (Math.PI / 180)); }; EvalDlg(); return true; } match = Regex.Match(text, "^ABS\\(([ :@A-Za-z0-9\\.\\-\\+\\*/]+)\\)$", RegexOptions.IgnoreCase); if (match.Success) { EvalDlg = delegate() { match = Regex.Match(text, "^ABS\\(([ :@A-Za-z0-9\\.\\-\\+\\*/]+)\\)$", RegexOptions.IgnoreCase); double v = ParseSubExpressionAsDouble(match.Groups[1].Value); Value = (float)Math.Abs(v); }; EvalDlg(); return true; } match = Regex.Match(text, "^V\\(([ :@A-Za-z0-9\\.\\-\\+\\*/]+),([ :@A-Za-z0-9\\.\\-\\+\\*/]+),([ :@A-Za-z0-9\\.\\-\\+\\*/]+)\\)$", RegexOptions.IgnoreCase); if (match.Success) { EvalDlg = delegate() { match = Regex.Match(text, "^V\\(([ :@A-Za-z0-9\\.\\-\\+\\*/]+),([ :@A-Za-z0-9\\.\\-\\+\\*/]+),([ :@A-Za-z0-9\\.\\-\\+\\*/]+)\\)$", RegexOptions.IgnoreCase); double x = ParseSubExpressionAsDouble(match.Groups[1].Value); double y = ParseSubExpressionAsDouble(match.Groups[2].Value); double z = ParseSubExpressionAsDouble(match.Groups[3].Value); Value = new Direction(new Vector3d(x, y, z), false); }; EvalDlg(); return true; } match = Regex.Match(text, "^R\\(([ :@A-Za-z0-9\\.\\-\\+\\*/]+),([ :@A-Za-z0-9\\.\\-\\+\\*/]+),([ :@A-Za-z0-9\\.\\-\\+\\*/]+)\\)$", RegexOptions.IgnoreCase); if (match.Success) { double x = ParseSubExpressionAsDouble(match.Groups[1].Value); double y = ParseSubExpressionAsDouble(match.Groups[2].Value); double z = ParseSubExpressionAsDouble(match.Groups[3].Value); Value = new Direction(new Vector3d(x, y, z), true); return true; } return false; }
private bool TryParseFunction(string text) { Match match; #region TRIG match = Regex.Match(text, "^SIN\\(([ :@A-Za-z0-9\\.\\-\\+\\*/]+)\\)$", RegexOptions.IgnoreCase); if (match.Success) { EvalDlg = delegate() { match = Regex.Match(text, "^SIN\\(([ :@A-Za-z0-9\\.\\-\\+\\*/]+)\\)$", RegexOptions.IgnoreCase); double v = ParseSubExpressionAsDouble(match.Groups[1].Value); Value = (float)Math.Sin(v * (Math.PI / 180)); }; EvalDlg(); return true; } match = Regex.Match(text, "^COS\\(([ :@A-Za-z0-9\\.\\-\\+\\*/]+)\\)$", RegexOptions.IgnoreCase); if (match.Success) { EvalDlg = delegate() { match = Regex.Match(text, "^COS\\(([ :@A-Za-z0-9\\.\\-\\+\\*/]+)\\)$", RegexOptions.IgnoreCase); double v = ParseSubExpressionAsDouble(match.Groups[1].Value); Value = (float)Math.Cos(v * (Math.PI / 180)); }; EvalDlg(); return true; } match = Regex.Match(text, "^TAN\\(([ :@A-Za-z0-9\\.\\-\\+\\*/]+)\\)$", RegexOptions.IgnoreCase); if (match.Success) { EvalDlg = delegate() { match = Regex.Match(text, "^TAN\\(([ :@A-Za-z0-9\\.\\-\\+\\*/]+)\\)$", RegexOptions.IgnoreCase); double v = ParseSubExpressionAsDouble(match.Groups[1].Value); Value = (float)Math.Tan(v * (Math.PI / 180)); }; EvalDlg(); return true; } match = Regex.Match(text, "^ARCSIN\\(([ :@A-Za-z0-9\\.\\-\\+\\*/]+)\\)$", RegexOptions.IgnoreCase); if (match.Success) { EvalDlg = delegate() { match = Regex.Match(text, "^ARCSIN\\(([ :@A-Za-z0-9\\.\\-\\+\\*/]+)\\)$", RegexOptions.IgnoreCase); double v = ParseSubExpressionAsDouble(match.Groups[1].Value); Value = ((float)Math.Asin(v) * (180 / Math.PI)); }; EvalDlg(); return true; } match = Regex.Match(text, "^ARCCOS\\(([ :@A-Za-z0-9\\.\\-\\+\\*/]+)\\)$", RegexOptions.IgnoreCase); if (match.Success) { EvalDlg = delegate() { match = Regex.Match(text, "^ARCCOS\\(([ :@A-Za-z0-9\\.\\-\\+\\*/]+)\\)$", RegexOptions.IgnoreCase); double v = ParseSubExpressionAsDouble(match.Groups[1].Value); Value = ((float)Math.Acos(v) * (180 / Math.PI)); }; EvalDlg(); return true; } match = Regex.Match(text, "^ARCTAN\\(([ :@A-Za-z0-9\\.\\-\\+\\*/]+)\\)$", RegexOptions.IgnoreCase); if (match.Success) { EvalDlg = delegate() { match = Regex.Match(text, "^ARCTAN\\(([ :@A-Za-z0-9\\.\\-\\+\\*/]+)\\)$", RegexOptions.IgnoreCase); double v = ParseSubExpressionAsDouble(match.Groups[1].Value); Value = ((float)Math.Atan(v) * (180 / Math.PI)); }; EvalDlg(); return true; } match = Regex.Match(text, "^ARCTAN2\\(([ :@A-Za-z0-9\\.\\-\\+\\*/]+),([ :@A-Za-z0-9\\.\\-\\+\\*/]+)\\)$", RegexOptions.IgnoreCase); if (match.Success) { EvalDlg = delegate() { match = Regex.Match(text, "^ARCTAN2\\(([ :@A-Za-z0-9\\.\\-\\+\\*/]+),([ :@A-Za-z0-9\\.\\-\\+\\*/]+)\\)$", RegexOptions.IgnoreCase); double x = ParseSubExpressionAsDouble(match.Groups[1].Value); double y = ParseSubExpressionAsDouble(match.Groups[2].Value); Value = (float)(Math.Atan2(x, y) * (180 / Math.PI)); }; EvalDlg(); return true; } #endregion #region ABS match = Regex.Match(text, "^ABS\\(([ :@A-Za-z0-9\\.\\-\\+\\*/]+)\\)$", RegexOptions.IgnoreCase); if (match.Success) { EvalDlg = delegate() { match = Regex.Match(text, "^ABS\\(([ :@A-Za-z0-9\\.\\-\\+\\*/]+)\\)$", RegexOptions.IgnoreCase); double v = ParseSubExpressionAsDouble(match.Groups[1].Value); Value = (float)Math.Abs(v); }; EvalDlg(); return true; } #endregion #region Geospatial match = Regex.Match(text, "^LATLNG ?\\(([ :@A-Za-z0-9\\.\\-\\+\\*/]+),([ :@A-Za-z0-9\\.\\-\\+\\*/]+)\\)$", RegexOptions.IgnoreCase); if (match.Success) { EvalDlg = delegate() { match = Regex.Match(text, "^LATLNG ?\\(([ :@A-Za-z0-9\\.\\-\\+\\*/]+),([ :@A-Za-z0-9\\.\\-\\+\\*/]+)\\)$", RegexOptions.IgnoreCase); double lat = ParseSubExpressionAsDouble(match.Groups[1].Value); double lng = ParseSubExpressionAsDouble(match.Groups[2].Value); Value = new GeoCoordinates(executionContext.Vessel, lat, lng); }; EvalDlg(); return true; } #endregion #region Vectors & Rotations match = Regex.Match(text, "^V\\(([ :@A-Za-z0-9\\.\\-\\+\\*/]+),([ :@A-Za-z0-9\\.\\-\\+\\*/]+),([ :@A-Za-z0-9\\.\\-\\+\\*/]+)\\)$", RegexOptions.IgnoreCase); if (match.Success) { EvalDlg = delegate() { match = Regex.Match(text, "^V\\(([ :@A-Za-z0-9\\.\\-\\+\\*/]+),([ :@A-Za-z0-9\\.\\-\\+\\*/]+),([ :@A-Za-z0-9\\.\\-\\+\\*/]+)\\)$", RegexOptions.IgnoreCase); double x = ParseSubExpressionAsDouble(match.Groups[1].Value); double y = ParseSubExpressionAsDouble(match.Groups[2].Value); double z = ParseSubExpressionAsDouble(match.Groups[3].Value); Value = new Vector(x,y,z); }; EvalDlg(); return true; } match = Regex.Match(text, "^R\\(([ :@A-Za-z0-9\\.\\-\\+\\*/]+),([ :@A-Za-z0-9\\.\\-\\+\\*/]+),([ :@A-Za-z0-9\\.\\-\\+\\*/]+)\\)$", RegexOptions.IgnoreCase); if (match.Success) { EvalDlg = delegate() { match = Regex.Match(text, "^R\\(([ :@A-Za-z0-9\\.\\-\\+\\*/]+),([ :@A-Za-z0-9\\.\\-\\+\\*/]+),([ :@A-Za-z0-9\\.\\-\\+\\*/]+)\\)$", RegexOptions.IgnoreCase); double x = ParseSubExpressionAsDouble(match.Groups[1].Value); double y = ParseSubExpressionAsDouble(match.Groups[2].Value); double z = ParseSubExpressionAsDouble(match.Groups[3].Value); Value = new Direction(new Vector3d(x, y, z), true); }; EvalDlg(); return true; } match = Regex.Match(text, "^Q\\(([ :@A-Za-z0-9\\.\\-\\+\\*/]+),([ :@A-Za-z0-9\\.\\-\\+\\*/]+),([ :@A-Za-z0-9\\.\\-\\+\\*/]+),([ :@A-Za-z0-9\\.\\-\\+\\*/]+)\\)$", RegexOptions.IgnoreCase); if (match.Success) { EvalDlg = delegate() { match = Regex.Match(text, "^Q\\(([ :@A-Za-z0-9\\.\\-\\+\\*/]+),([ :@A-Za-z0-9\\.\\-\\+\\*/]+),([ :@A-Za-z0-9\\.\\-\\+\\*/]+),([ :@A-Za-z0-9\\.\\-\\+\\*/]+)\\)$", RegexOptions.IgnoreCase); float x = (float)ParseSubExpressionAsDouble(match.Groups[1].Value); float y = (float)ParseSubExpressionAsDouble(match.Groups[2].Value); float z = (float)ParseSubExpressionAsDouble(match.Groups[3].Value); float w = (float)ParseSubExpressionAsDouble(match.Groups[4].Value); Value = x + " " + y + " " + z + " " + w; }; EvalDlg(); return true; } #endregion match = Regex.Match(text, "^HEADING ?([ :@A-Za-z0-9\\.\\-\\+\\*/]+) BY ([ :@A-Za-z0-9\\.\\-\\+\\*/]+)$", RegexOptions.IgnoreCase); if (match.Success) { EvalDlg = delegate() { match = Regex.Match(text, "^HEADING ?([ :@A-Za-z0-9\\.\\-\\+\\*/]+) BY ([ :@A-Za-z0-9\\.\\-\\+\\*/]+)$", RegexOptions.IgnoreCase); float heading = (float)ParseSubExpressionAsDouble(match.Groups[1].Value); float pitch = (float)ParseSubExpressionAsDouble(match.Groups[2].Value); var q = UnityEngine.Quaternion.LookRotation(VesselUtils.GetNorthVector(executionContext.Vessel), executionContext.Vessel.upAxis); q *= UnityEngine.Quaternion.Euler(new UnityEngine.Vector3(-pitch, heading, 0)); Value = new Direction(q); }; EvalDlg(); return true; } return false; }
public static void SteerShipToward(Direction targetDir, FlightCtrlState c, Vessel vessel) { // I take no credit for this, this is a stripped down, rearranged version of MechJeb's attitude control system var CoM = vessel.findWorldCenterOfMass(); var MoI = vessel.findLocalMOI(CoM); var mass = vessel.GetTotalMass(); var up = (CoM - vessel.mainBody.position).normalized; var target = targetDir.Rotation; var vesselR = vessel.transform.rotation; Quaternion delta; delta = Quaternion.Inverse(Quaternion.Euler(90, 0, 0) * Quaternion.Inverse(vesselR) * target); Vector3d deltaEuler = ReduceAngles(delta.eulerAngles); deltaEuler.y *= -1; Vector3d torque = GetTorque(vessel, c.mainThrottle); Vector3d inertia = GetEffectiveInertia(vessel, torque); Vector3d err = deltaEuler * Math.PI / 180.0F; err += new Vector3d(inertia.x, inertia.z, inertia.y); //err.Scale(SwapYZ(Vector3d.Scale(MoI, Inverse(torque)))); prev_err = err; Vector3d act = 120.0f * err; float precision = Mathf.Clamp((float)torque.x * 20f / MoI.magnitude, 0.5f, 10f); float drive_limit = Mathf.Clamp01((float)(err.magnitude * 420.0f / precision)); act.x = Mathf.Clamp((float)act.x, -drive_limit, drive_limit); act.y = Mathf.Clamp((float)act.y, -drive_limit, drive_limit); act.z = Mathf.Clamp((float)act.z, -drive_limit, drive_limit); //act = averageVector3d(averagedAct, act, 2); c.roll = Mathf.Clamp((float)(c.roll + act.z), -drive_limit, drive_limit); c.pitch = Mathf.Clamp((float)(c.pitch + act.x), -drive_limit, drive_limit); c.yaw = Mathf.Clamp((float)(c.yaw + act.y), -drive_limit, drive_limit); }
public override void AddTo(BindingManager manager) { manager.AddGetter("VESSELNAME", delegate(CPU cpu) { return cpu.Vessel.vesselName; }); manager.AddSetter("VESSELNAME", delegate(CPU cpu, object value ) { cpu.Vessel.vesselName = value.ToString(); }); manager.AddGetter("ALTITUDE", delegate(CPU cpu) { return (float)cpu.Vessel.altitude; }); manager.AddGetter("ALT:RADAR", delegate(CPU cpu) { return (float)cpu.Vessel.heightFromTerrain; }); manager.AddGetter("MISSIONTIME", delegate(CPU cpu) { return (float)cpu.Vessel.missionTime; }); manager.AddGetter("STATUS", delegate(CPU cpu) { return cpu.Vessel.situation.ToString().Replace("_", " "); }); manager.AddGetter("APOAPSIS", delegate(CPU cpu) { return (float)cpu.Vessel.orbit.ApA; }); manager.AddGetter("PERIAPSIS", delegate(CPU cpu) { return (float)cpu.Vessel.orbit.PeA; }); manager.AddGetter("ALT:APOAPSIS", delegate(CPU cpu) { return (float)cpu.Vessel.orbit.ApA; }); manager.AddGetter("ALT:PERIAPSIS", delegate(CPU cpu) { return (float)cpu.Vessel.orbit.PeA; }); manager.AddGetter("ETA:APOAPSIS", delegate(CPU cpu) { return (float)cpu.Vessel.orbit.timeToAp; }); manager.AddGetter("ETA:PERIAPSIS", delegate(CPU cpu) { return (float)cpu.Vessel.orbit.timeToPe; }); manager.AddGetter("VELOCITY", delegate(CPU cpu) { return cpu.Vessel.obt_velocity; }); manager.AddGetter("ANGULARMOMENTUM",delegate(CPU cpu) { return new Direction(cpu.Vessel.angularMomentum, true); }); manager.AddGetter("ANGULARVEL", delegate(CPU cpu) { return new Direction(cpu.Vessel.angularVelocity, true); }); manager.AddGetter("MASS", delegate(CPU cpu) { return cpu.Vessel.GetTotalMass(); }); manager.AddGetter("VERTICALSPEED", delegate(CPU cpu) { return (float)cpu.Vessel.verticalSpeed; }); manager.AddGetter("SURFACESPEED", delegate(CPU cpu) { return (float)cpu.Vessel.horizontalSrfSpeed; }); manager.AddGetter("BODY", delegate(CPU cpu) { return cpu.Vessel.mainBody.bodyName; }); manager.AddGetter("LATITUDE", delegate(CPU cpu) { return (float)cpu.Vessel.latitude; }); manager.AddGetter("LONGITUDE", delegate(CPU cpu) { return (float)cpu.Vessel.longitude; }); manager.AddGetter("HEADING", delegate(CPU cpu) { return VesselUtils.GetHeading(cpu.Vessel); }); manager.AddGetter("NORTH", delegate(CPU cpu) { return new Direction(VesselUtils.GetNorthVector(cpu.Vessel), false); }); manager.AddGetter("UP", delegate(CPU cpu) { return new Direction(cpu.Vessel.upAxis, false); }); manager.AddGetter("NODE", delegate(CPU cpu) { var vessel = cpu.Vessel; if (!vessel.patchedConicSolver.maneuverNodes.Any()) { throw new kOSException("No maneuver nodes present!"); } var up = (vessel.findLocalMOI(vessel.findWorldCenterOfMass()) - vessel.mainBody.position).normalized; var fwd = vessel.patchedConicSolver.maneuverNodes[0].GetBurnVector(cpu.Vessel.orbit); var rotRef = Quaternion.LookRotation(fwd, up); Direction d = new Direction(); d.Rotation = rotRef; return d; }); manager.AddGetter("MAG:NODE", delegate(CPU cpu) { var vessel = cpu.Vessel; var orbit = vessel.orbit; if (!vessel.patchedConicSolver.maneuverNodes.Any()) { throw new kOSException("No maneuver nodes present!"); } var mag = vessel.patchedConicSolver.maneuverNodes[0].GetBurnVector(orbit).magnitude; return (float)mag; }); manager.AddGetter("ETA:NODE", delegate(CPU cpu) { var vessel = cpu.Vessel; if (!vessel.patchedConicSolver.maneuverNodes.Any()) { throw new kOSException("No maneuver nodes present!"); } var time = vessel.patchedConicSolver.maneuverNodes[0].UT; var currTime = Planetarium.GetUniversalTime(); return (float)(time - currTime); }); manager.AddGetter("PROGRADE", delegate(CPU cpu) { var vessel = cpu.Vessel; var up = (vessel.findLocalMOI(vessel.findWorldCenterOfMass()) - vessel.mainBody.position).normalized; Direction d = new Direction(); d.Rotation = Quaternion.LookRotation(cpu.Vessel.orbit.GetVel().normalized, up); return d; }); manager.AddGetter("RETROGRADE", delegate(CPU cpu) { var vessel = cpu.Vessel; var up = (vessel.findLocalMOI(vessel.findWorldCenterOfMass()) - vessel.mainBody.position).normalized; Direction d = new Direction(); var vesselRoll = cpu.Vessel.GetTransform().eulerAngles.y; d.Rotation = Quaternion.LookRotation(cpu.Vessel.orbit.GetVel().normalized * -1, up); return d; }); manager.AddGetter("FACING", delegate(CPU cpu) { var facing = cpu.Vessel.transform.up; return new Direction(new Vector3d(facing.x, facing.y, facing.z).normalized, false); }); manager.AddGetter("MAXTHRUST", delegate(CPU cpu) { return VesselUtils.GetMaxThrust(cpu.Vessel); }); manager.AddGetter("AV", delegate(CPU cpu) { return cpu.Vessel.transform.InverseTransformDirection(cpu.Vessel.rigidbody.angularVelocity); }); manager.AddGetter("STAGE", delegate(CPU cpu) { return new StageValues(cpu.Vessel); }); }