internal override bool VesselsMeetCondition(List <Vessel> vessels, EvaluationContext context, out string statusLabel) { if (minSurface == 0 || vessels.Count == 0) { statusLabel = string.Empty; return(vessels.Count > 0); } double visible; double R = context.targetBody.Radius; if (vessels.Count == 1) { Vessel vessel = vessels[0]; double a = context.Altitude(vessel, context.targetBody); visible = 100.0 * a / (2 * (a + R)); } else { ResetVisibleSurfaces(); Vector3d bodyPosition = context.BodyPosition(context.targetBody); foreach (Vessel v in vessels) { Vector3d vesselPosition = context.VesselPosition(v); Vector3d viewDirection = (vesselPosition - bodyPosition); double a = R; double b = R + context.Altitude(v, context.targetBody); double c = Math.Sqrt(a * a + b * b); double α = Math.Asin(b / c) * 180.0 / Math.PI; MarkVisibleSurfaces(viewDirection.normalized, α); } visible = 100.0 * visibleSurfaces / (double)surfaces.Count; } string observedPercStr = Lib.HumanReadablePerc(visible / 100.0) + " / " + Lib.HumanReadablePerc(minSurface / 100.0); observedPercStr = Lib.Color(observedPercStr, visible > minSurface ? Lib.Kolor.Green : Lib.Kolor.Red); statusLabel = Localizer.Format("<<1>> of surface observed", observedPercStr); return(visible > minSurface); }
public static double VisibleSurface(List <Vessel> vessels, EvaluationContext context, Vector3d bodyPosition, double minElevation, List <Surface> surfaces) { Reset(surfaces); int visibleSurfaces = 0; foreach (Vessel v in vessels) { Vector3d vesselPosition = context.VesselPosition(v); Vector3d viewDirection = (vesselPosition - bodyPosition); double R = context.targetBody.Radius; double a = R; double b = R + context.Altitude(v, context.targetBody); double c = Math.Sqrt(a * a + b * b); double α = Math.Asin(b / c) * 180.0 / Math.PI; visibleSurfaces += MarkVisibleSurfaces(viewDirection.normalized, α - minElevation, surfaces); } return(visibleSurfaces / (double)surfaces.Count); }
internal override SubRequirementState VesselMeetsCondition(Vessel vessel, EvaluationContext context) { AltitudeState state = new AltitudeState(); state.distance = context.Altitude(vessel); double minAlt = min != 0 ? min : minR * context.targetBody.Radius; double maxAlt = max != 0 ? max : maxR * context.targetBody.Radius; state.requirementMet = true; if (minAlt != 0 && state.distance < minAlt) { state.requirementMet = false; } if (maxAlt != 0 && state.distance > maxAlt) { state.requirementMet = false; } return(state); }