public Encounter(GravityElementsClass gravElements, double startingTrueAnomaly, double endingTrueAnomaly, double timeOfEncounter, OrbitalPOI perigeeIcon)
 {
     this.gravElements        = gravElements;
     this.startingTrueAnomaly = startingTrueAnomaly;
     this.endingTrueAnomaly   = endingTrueAnomaly;
     this.timeOfEncounter     = timeOfEncounter;
     this.perigeeIcon         = perigeeIcon;
 }
    private void updateNode()
    {
        Vector2 nodePosition = node.getNodePosition();

        bool   nodeTowardsPerigee = OrbitalHelper.towardsPerigeeOrbit(mouseTrueAnomaly, shipElements.Clockwise);
        double nodeSpeed          = OrbitalHelper.calculateSpeed(nodePosition, shipElements.SemiMajorAxis, shipElements.Mu, shipElements.OrbitType);
        double nodeVelocityAngle  = OrbitalHelper.calculateVelocityAngle(nodePosition, shipElements.Eccentricity, shipElements.SemiMajorAxis, mouseTrueAnomaly, shipElements.GlobalRotationAngle, shipElements.Clockwise, nodeTowardsPerigee, shipElements.OrbitType);

        Vector2 nodeVelocity = OrbitalHelper.assembleVelocityVector(nodeVelocityAngle, nodeSpeed);

        GravityElementsClass newOrbit = calculateInitialOrbitalElements(nodePosition, nodeVelocity + thrustVector, shipElements.massiveBody);

        node = new Node(newOrbit, mouseTrueAnomaly, nodePosition);

        patchedConics.updatePotentialEncounters(node.getManeuver());
    }
    public GravityElementsClass getClassVersion()
    {
        GravityElementsClass returnGravityElements = new GravityElementsClass();

        returnGravityElements.velocity          = this.velocity;
        returnGravityElements.massiveBody       = this.massiveBody;
        returnGravityElements.gravitationalType = this.gravitationalType;

        returnGravityElements.Altitude      = this.Altitude;
        returnGravityElements.Speed         = this.Speed;
        returnGravityElements.VelocityAngle = this.VelocityAngle;

        returnGravityElements.OrbitType = this.OrbitType;
        returnGravityElements.Mu        = this.Mu;

        returnGravityElements.Position          = this.Position;
        returnGravityElements.Apogee            = this.Apogee;
        returnGravityElements.Perigee           = this.Perigee;
        returnGravityElements.Center            = this.Center;
        returnGravityElements.AltitudeOfPerigee = this.AltitudeOfPerigee;
        returnGravityElements.AngularMomentum   = this.AngularMomentum;

        returnGravityElements.SemiMajorAxis   = this.SemiMajorAxis;
        returnGravityElements.SemiLatusRectum = this.SemiLatusRectum;

        returnGravityElements.Eccentricity          = this.Eccentricity;
        returnGravityElements.EccentricityMagnitude = this.EccentricityMagnitude;
        returnGravityElements.EccentricAnomaly      = this.EccentricAnomaly;
        returnGravityElements.TrueAnomaly           = this.TrueAnomaly;
        returnGravityElements.MeanAnomaly           = this.MeanAnomaly;
        returnGravityElements.AnomalyAtEpoch        = this.AnomalyAtEpoch;
        returnGravityElements.MechanicalEnergy      = this.MechanicalEnergy;

        returnGravityElements.Time        = this.Time;
        returnGravityElements.TimeStep    = this.TimeStep;
        returnGravityElements.TimeAtEpoch = this.TimeAtEpoch;

        returnGravityElements.Clockwise      = this.Clockwise;
        returnGravityElements.TowardsPerigee = this.TowardsPerigee;

        returnGravityElements.GlobalTransformationVector = this.GlobalTransformationVector;
        returnGravityElements.GlobalRotationAngle        = this.GlobalRotationAngle;

        return(returnGravityElements);
    }
示例#4
0
    public void updatePotentialEncounters(GravityElementsClass newManeuver)
    {
        foreach (Encounter encounter in encounters.maneuverEncounters)
        {
            Destroy(encounter.PerigeeIcon.poiIcon);
        }
        encounters.maneuverEncounters.Clear();



        //initial setup
        GameObject tempPerigeeIcon = Instantiate(perigeeIcon);
        OrbitalPOI perigeePOI      = new OrbitalPOI(tempPerigeeIcon, newManeuver.Perigee);

        Encounter currentEncounter = new Encounter(newManeuver, newManeuver.TrueAnomaly, double.PositiveInfinity, 0, perigeePOI);

        iterations = 0;

        predictAnEncounter(currentEncounter, ref encounters.maneuverEncounters);
    }
    public void copyGravityElementsClass(GravityElementsClass gravElements)
    {
        this.velocity          = gravElements.velocity;
        this.massiveBody       = gravElements.massiveBody;
        this.gravitationalType = gravElements.gravitationalType;

        this.altitude      = gravElements.Altitude;
        this.speed         = gravElements.Speed;
        this.velocityAngle = gravElements.VelocityAngle;

        this.orbitType = gravElements.OrbitType;
        this.mu        = gravElements.Mu;

        this.position          = gravElements.Position;
        this.apogee            = gravElements.Apogee;
        this.perigee           = gravElements.Perigee;
        this.center            = gravElements.Center;
        this.altitudeOfPerigee = gravElements.AltitudeOfPerigee;
        this.angularMomentum   = gravElements.AngularMomentum;

        this.semiMajorAxis   = gravElements.SemiMajorAxis;
        this.semiLatusRectum = gravElements.SemiLatusRectum;

        this.eccentricity          = gravElements.Eccentricity;
        this.eccentricityMagnitude = gravElements.EccentricityMagnitude;
        this.eccentricAnomaly      = gravElements.EccentricAnomaly;
        this.trueAnomaly           = gravElements.TrueAnomaly;
        this.meanAnomaly           = gravElements.MeanAnomaly;
        this.anomalyAtEpoch        = gravElements.AnomalyAtEpoch;
        this.mechanicalEnergy      = gravElements.MechanicalEnergy;

        this.time        = gravElements.Time;
        this.timeStep    = gravElements.TimeStep;
        this.timeAtEpoch = gravElements.TimeAtEpoch;

        this.clockwise      = gravElements.Clockwise;
        this.towardsPerigee = gravElements.TowardsPerigee;

        this.globalTransformationVector = gravElements.GlobalTransformationVector;
        this.globalRotationAngle        = gravElements.GlobalRotationAngle;
    }
示例#6
0
    //Finds all encounters within one orbit of the craft
    public void updateEncounters()
    {
        foreach (Encounter encounter in encounters.predictedEncounters)
        {
            Destroy(encounter.PerigeeIcon.poiIcon);
        }
        encounters.predictedEncounters.Clear();

        //initial setup
        GravityElementsClass currentShipsGravityElements = shipElements.getClassVersion();

        double startingTrueAnomaly = shipElements.TrueAnomaly;

        GameObject tempPerigeeIcon = Instantiate(perigeeIcon);
        OrbitalPOI perigeePOI      = new OrbitalPOI(tempPerigeeIcon, currentShipsGravityElements.Perigee);

        Encounter currentEncounter = new Encounter(currentShipsGravityElements, startingTrueAnomaly, double.PositiveInfinity, 0, perigeePOI);

        iterations = 0;

        predictAnEncounter(currentEncounter, ref encounters.predictedEncounters);

        instantiatePOIs(encounters.predictedEncounters);
    }
示例#7
0
 public void applyThrust(GravityElementsClass newOrbit)
 {
     gravityElements.copyGravityElementsClass(newOrbit);
     shipPatchedConics.updateEncounters();
 }
示例#8
0
 public Node(GravityElementsClass maneuver, double trueAnomaly, Vector2 nodePosition)
 {
     this.maneuver     = maneuver;
     this.nodePosition = nodePosition;
     this.trueAnomaly  = trueAnomaly;
 }
    //takes in everything relative to the body being orbited
    private GravityElementsClass calculateInitialOrbitalElements(Vector2 position, Vector2 velocity, GameObject massiveBody)
    {
        GravityElementsClass gravityElements = new GravityElementsClass();

        gravityElements.massiveBody = massiveBody;

        gravityElements.Mu       = GlobalElements.GRAV_CONST * gravityElements.MassiveBody.GetComponent <MassiveBodyElements>().mass;
        gravityElements.Position = position;
        gravityElements.velocity = velocity;

        //Calculate Global Tranformation Vector
        gravityElements.GlobalTransformationVector = massiveBody.transform.position;

        //Calculate eccentricity
        gravityElements.Eccentricity = OrbitalHelper.calculateEccentricity(position, velocity, gravityElements.Mu);

        //Determine orbit type
        gravityElements.OrbitType = OrbitalHelper.determineOrbitType(gravityElements.Eccentricity);

        //Calculate Mechanical Energy
        gravityElements.MechanicalEnergy = OrbitalHelper.calculateMechanicalEnergy(gravityElements.Position, gravityElements.velocity, gravityElements.Mu, gravityElements.OrbitType);

        //Calculate Semi Major Axis
        gravityElements.SemiMajorAxis = OrbitalHelper.calculateSemiMajorAxis(gravityElements.MechanicalEnergy, gravityElements.Mu, gravityElements.OrbitType);

        //Calculate SemiLatusRectum
        gravityElements.SemiLatusRectum = OrbitalHelper.calculateSemiLatusRectum(gravityElements.SemiMajorAxis, gravityElements.Eccentricity, gravityElements.Perigee, gravityElements.OrbitType);

        //Calculate Perigee
        gravityElements.Perigee = OrbitalHelper.calculatePerigee(gravityElements.SemiMajorAxis, gravityElements.Eccentricity, gravityElements.OrbitType);

        //Calculate Apogee
        gravityElements.Apogee = OrbitalHelper.calculateApogee(gravityElements.SemiMajorAxis, gravityElements.Eccentricity, gravityElements.OrbitType);

        //Calculate Center
        gravityElements.Center = OrbitalHelper.calculateCenter(gravityElements.SemiMajorAxis, gravityElements.Perigee, gravityElements.OrbitType);

        //Calculate GlobalRotationAngle
        gravityElements.GlobalRotationAngle = OrbitalHelper.calculateGlobalRotationAngle(gravityElements.Eccentricity, gravityElements.OrbitType);

        //Find orbital directions
        gravityElements.Clockwise      = OrbitalHelper.clockwiseOrbit(gravityElements.Position, gravityElements.velocity);
        gravityElements.TowardsPerigee = OrbitalHelper.towardsPerigeeOrbit(gravityElements.velocity, gravityElements.Eccentricity, gravityElements.OrbitType);

        //Calculate trueAnomaly
        gravityElements.TrueAnomaly = OrbitalHelper.calculateTrueAnomaly(gravityElements.Eccentricity, gravityElements.Position, gravityElements.TowardsPerigee, gravityElements.Clockwise, gravityElements.OrbitType);

        //Calculate Eccentric Anomaly
        gravityElements.EccentricAnomaly = OrbitalHelper.calculateEccentricAnomaly(gravityElements.Eccentricity, gravityElements.TrueAnomaly, gravityElements.TowardsPerigee, gravityElements.OrbitType);

        //Calculate Anomaly at current epoch
        gravityElements.AnomalyAtEpoch = OrbitalHelper.calculateAnomalyAtCurrentEpoch(gravityElements.Eccentricity, gravityElements.EccentricAnomaly, gravityElements.Clockwise, gravityElements.OrbitType);
        gravityElements.MeanAnomaly    = gravityElements.AnomalyAtEpoch;

        //Calculate Angular Momentum
        gravityElements.AngularMomentum = OrbitalHelper.calculateAngularMomentum(gravityElements.Eccentricity, gravityElements.Perigee, gravityElements.SemiMajorAxis, gravityElements.SemiLatusRectum,
                                                                                 gravityElements.Mu, gravityElements.OrbitType);

        //Calculate time at epoch
        gravityElements.TimeAtEpoch = OrbitalHelper.calculateTimeAtEpoch(gravityElements.Eccentricity, gravityElements.EccentricAnomaly, gravityElements.SemiMajorAxis, gravityElements.Mu,
                                                                         gravityElements.Clockwise, gravityElements.TowardsPerigee, gravityElements.OrbitType);

        return(gravityElements);
    }
示例#10
0
    //Takes in the ships current gravity elements according to its last encounter, current massive body elements as they are at tiem 0 and current massivebodyelements as they are at time 0
    private void predictAnEncounter(Encounter currentEncounter, ref List <Encounter> encounters)
    {
        encounters.Add(currentEncounter);

        //data sources
        MassiveBodyElements  currentMassiveBody             = currentEncounter.GravElements.massiveBody.GetComponent <MassiveBodyElements>();
        GravityElementsClass currentMassiveBodyGravElements = currentEncounter.GravElements.massiveBody.GetComponent <GravityElements>().getClassVersion();

        iterations++;
        double     time = 0;
        double     currentOrbitalPeriod   = calculatePeriod(currentEncounter.GravElements.OrbitType, currentEncounter.GravElements.SemiMajorAxis, currentEncounter.GravElements.Mu);
        bool       foundNewEncounter      = false;
        GameObject encounteredMassiveBody = null;

        while (time < currentOrbitalPeriod && !foundNewEncounter)
        {
            time += 0.01;

            //have we exited the current soi?
            double altitude = currentEncounter.GravElements.calculateLocalPositionAtFutureTime(time).magnitude; //the ships massive body is always at time 0
            if (currentMassiveBody.SphereOfInfluence < altitude)
            {
                foundNewEncounter      = true;
                encounteredMassiveBody = currentEncounter.GravElements.massiveBody.GetComponent <GravityElements>().massiveBody;
                break;
            }

            //have we entered a new soi?
            foreach (GameObject satelite in currentMassiveBody.satelites)
            {
                double  sateliteSphereOfInfluence = satelite.GetComponent <MassiveBodyElements>().SphereOfInfluence;
                Vector2 sateliteLocalPosition     = satelite.GetComponent <GravityElements>().calculateLocalPositionAtFutureTime(time + currentEncounter.TimeOfEncounter);
                Vector2 shipsLocalPosition        = currentEncounter.GravElements.calculateLocalPositionAtFutureTime(time);
                if (Vector2.Distance(shipsLocalPosition, sateliteLocalPosition) < sateliteSphereOfInfluence)
                {
                    foundNewEncounter      = true;
                    encounteredMassiveBody = satelite;
                    break;
                }
            }

            if (time > 100) //hyperbolic orbit with infinite periode, this prevents infinite loops
            {
                break;
            }
        }

        //We have encountered nothing, just a regular eliptical orbit, or a hyperbolic one that's really long
        if (encounteredMassiveBody == null)
        {
            return;
        }

        //We have encountered a massive body, time to assemble a new encounter
        Tuple <Vector2, Vector2> returnInfo;

        returnInfo = currentEncounter.GravElements.calculateLocalPositionAndVelocityAtFutureTime(time);
        Vector2 shipPredictedLocalPosition = returnInfo.item1;
        Vector2 shipPredictedLocalVelocity = returnInfo.item2;

        returnInfo = currentMassiveBodyGravElements.calculateGlobalPositionAndVelocityAtFutureTime(time + currentEncounter.TimeOfEncounter);
        Vector2 currentMassiveBodyPredictedGlobalPosition = returnInfo.item1;
        Vector2 currentMassiveBodyPredictedGlobalVelocity = returnInfo.item2;

        returnInfo = encounteredMassiveBody.GetComponent <GravityElements>().calculateGlobalPositionAndVelocityAtFutureTime(time + currentEncounter.TimeOfEncounter);
        Vector2 encounteredMassiveBodyPredictedGlobalPosition = returnInfo.item1;
        Vector2 encounteredmassiveBodyPredictedGlobalVelocity = returnInfo.item2;

        Vector2 shipPositionRelativeToEncounter = (shipPredictedLocalPosition + currentMassiveBodyPredictedGlobalPosition) - encounteredMassiveBodyPredictedGlobalPosition;
        Vector2 shipVelocityRelativeToEncounter = (shipPredictedLocalVelocity + currentMassiveBodyPredictedGlobalVelocity) - encounteredmassiveBodyPredictedGlobalVelocity;

        GravityElementsClass newShipsGravityElements = calculateInitialOrbitalElements(shipPositionRelativeToEncounter, shipVelocityRelativeToEncounter, encounteredMassiveBody); //massive body is inputed in its state at time 0

        //Change the ending true anomaly of the last encounter
        double startingTrueAnomaly = newShipsGravityElements.TrueAnomaly;
        double endingTrueAnomaly   = MiscHelperFuncs.AngleBetweenVector2(currentEncounter.GravElements.Eccentricity, shipPredictedLocalPosition);

        encounters[encounters.Count - 1].EndingTrueAnomaly = endingTrueAnomaly;

        if (iterations < MAX_ITERATIONS)
        {
            GameObject tempPerigeeIcon = Instantiate(perigeeIcon);
            OrbitalPOI perigeePOI      = new OrbitalPOI(tempPerigeeIcon, newShipsGravityElements.Perigee);

            Encounter newEncounter = new Encounter(newShipsGravityElements, startingTrueAnomaly, double.PositiveInfinity, time + currentEncounter.TimeOfEncounter, perigeePOI);

            predictAnEncounter(newEncounter, ref encounters);
        }
    }