Пример #1
0
        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);
        }
Пример #3
0
        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);
        }