void SolarSystemCreator::setPlanetModifiers(Planet& planet)
{
    if (planet.planetType() == ptGasGiant) {
        int nSize = SSGX::d6();
        if (nSize  <4)
            planet.setDiameter(planet.diameter()*2);
        if (nSize  <3)
            planet.setDiameter(planet.diameter()*2);
        if (nSize  <2)
            planet.setDiameter(planet.diameter()*2);
        if (planet.diameter() < 30000)
            planet.setDiameter(15000 +SSGX::d10()*10000+SSGX::dn(5000));
    }

    if (planet.planetType() == ptGarden) {
        int nSize = SSGX::d10() + _nMod;
        if ( nSize < 3)
            planet.setPlanetType(ptPreGarden);
        if ( nSize >=3 && nSize < 6)
            planet.setPlanetType(ptGlacier);
        if (nSize >= 10)
            planet.setPlanetType(ptPostGarden);
    }
}
void SolarSystemCreator::makeDiameterAndDensity(bool isSatellite, Planet& planet, double currentDistance, Planet& planetTop)
{
    int d = SSGX::d6();

    if (currentDistance > _star->outerLifeZone()) {
        if (d < 5) {
            planet.setCoreType(NSPlanet::ctIcy);
            planet.setDensity( ((double)(SSGX::dn(400)))/1000*5520.0);
            if (!isSatellite)
                planet.setDiameter(SSGX::icyDiameter());
            else
                planet.setDiameter(SSGX::satDiameter());

        }
        else {
            if (!isSatellite)
                planet.setDiameter(SSGX::rockyDiameter());
            else
                planet.setDiameter(SSGX::satDiameter());

            planet.setDensity( ((double)(400+SSGX::dn(600)))/1000*5520.0);
        }
    }
    else {
        if (!isSatellite)
            planet.setDiameter(SSGX::rockyDiameter());
        else
            planet.setDiameter(SSGX::satDiameter());
        planet.setDensity( ((double)(400+SSGX::dn(900)))/1000*5520.0);
    }

    int divFactor = (planetTop.planetType() == ptGasGiant) ? 6 : 3;

    while (isSatellite && (planet.diameter() > planetTop.diameter() / divFactor || planet.diameter() > 14000))
        planet.setDiameter(planet.diameter()/1.5);
}
Planet SolarSystemCreator::createPlanet(
        double currentDistance,
        bool isSatellite,
        Planet& planetTop,
        double *prevDistance)
{
    Planet planet;
    if (isSatellite)
        planet.setParent(&planetTop);

    Orbit orbit;

    makeOrbit(orbit);
    makeDiameterAndDensity(isSatellite, planet, currentDistance, planetTop);


    double dTemp = 255 / sqrt(( currentDistance / sqrt (_star->luminosity())));
    planet.setTemperature(dTemp);
    double dmmwr = (0.02783 * dTemp) / ( pow(planet.gravEarth(),2) );
    planet.setMmwr(dmmwr);
    if (dmmwr < 120)
        planet.setAtmosphere(atVeryThin);
    if (dmmwr < 80)
        planet.setAtmosphere(atThin);
    if (dmmwr < 40)
        planet.setAtmosphere(atStandard);
    if (dmmwr < 20)
        planet.setAtmosphere(atDense);
    if (dmmwr < 5) {
        if (planet.diameter() > 20000 )
            planet.setAtmosphere(atMassive);
        else
            planet.setAtmosphere(atDense);
    }

    this->setPlanetType(planet,currentDistance);

    if (!isSatellite) {
        this->setPlanetModifiers(planet);
        planet.setPlanetFlag();
    }
    else {
        planet.setSatelliteFlag();
        //qDebug() << "Satellite flag set: " << planet.isSatellite();
    }

    if (!isSatellite) {
        orbit.setDistance(currentDistance);
        orbit.setYear(_star->mass());
    }
    else {
        double sSatDist = *prevDistance;
        if (sSatDist <= 0)
            if (planetTop.planetType() != ptGasGiant)
                sSatDist = 105000+(double)((SSGX::dn(20)+10) * planetTop.diameter());
            else
                sSatDist = 105000+(double)((SSGX::floatRand()*1.8+2.0) * planetTop.diameter());
        else
            sSatDist += 80000.0+(double)((SSGX::dn(50)+25) * planet.diameter());
        *prevDistance = sSatDist;

        orbit.setDistance(sSatDist);  //in km

        double d1 = orbit.distance() / 40000.0;
        d1 = (pow(d1,3) * 793.64) / (planetTop.massEarth() + planet.massEarth());
        double dYear = sqrt(d1);

        orbit.setFixedYear(dYear);
    }

    planet.setOrbit(orbit);

    int w = rand() % 10;
    switch (w) {
    case 1:
        planet.setName(_onomastikon->fakeNomen());
        break;
    case 2:
        planet.setName(_onomastikon->fakeNomen());
        break;
    case 3:
        planet.setName(_onomastikon->nomen());
        break;
    case 4:
        planet.setName(_onomastikon->nomen());
        break;
    case 5:
        planet.setName(_onomastikon->sigla());
        break;
    default:
        planet.setName(_onomastikon->pseudoNomen());
        break;

    }


    return planet;
}
示例#4
0
Planet SolarSystemCreator::createPlanet(
        double currentDistance,
        bool isSatellite,
        Planet& planetTop,
        double *prevDistance)
{
    Planet planet;

    Orbit orbit;
    int d = SSGX::d6();

    if (d == 3)
        orbit.setEccentricity( (double)SSGX::dn(1000) / 10000.0);
    else
        orbit.setEccentricity( (double)SSGX::dn(300) / 10000.0);

    if (d == 4)
        orbit.setInclination( (double)(SSGX::d100() -50)/30);
    else
        orbit.setInclination( (double)(SSGX::d100() -50)/5);

    if (d == 4)
        orbit.setObliquity( (double)(SSGX::d100() -50)/2);
    else
        orbit.setInclination( (double)(SSGX::d100() -50));

    d = SSGX::d6();

    if (currentDistance > _star->outerLifeZone()) {
        if (d < 5) {
            planet.setCoreType(NSPlanet::ctIcy);
            planet.setDensity( ((double)(SSGX::dn(400)))/1000*5520.0);
            if (!isSatellite)
                planet.setDiameter(SSGX::icyDiameter());
            else
                planet.setDiameter(SSGX::satDiameter());

        }
        else {
            if (!isSatellite)
                planet.setDiameter(SSGX::rockyDiameter());
            else
                planet.setDiameter(SSGX::satDiameter());

            planet.setDensity( ((double)(400+SSGX::dn(600)))/1000*5520.0);
        }
    }
    else {
        if (!isSatellite)
            planet.setDiameter(SSGX::rockyDiameter());
        else
            planet.setDiameter(SSGX::satDiameter());
        planet.setDensity( ((double)(400+SSGX::dn(900)))/1000*5520.0);
    }



    while (isSatellite && planet.diameter() > planetTop.diameter() / 3)
        planet.setDiameter(planet.diameter()/2);


    double dTemp = 255 / sqrt(( currentDistance / sqrt (_star->luminosity())));
    planet.setTemperature(dTemp);
    double dmmwr = (0.02783 * dTemp) / ( pow(planet.gravEarth(),2) );
    planet.setMmwr(dmmwr);
    if (dmmwr < 120)
        planet.setAtmosphere(atVeryThin);
    if (dmmwr < 80)
        planet.setAtmosphere(atThin);
    if (dmmwr < 40)
        planet.setAtmosphere(atStandard);
    if (dmmwr < 20)
        planet.setAtmosphere(atDense);
    if (dmmwr < 5) {
        if (planet.diameter() > 20000 )
            planet.setAtmosphere(atMassive);
        else
            planet.setAtmosphere(atDense);
    }

    this->setPlanetType(planet,currentDistance);

    if (!isSatellite) {
        this->setPlanetModifiers(planet);
        planet.setPlanetFlag();
    }
    else {
        planet.setSatelliteFlag();
        //qDebug() << "Satellite flag set: " << planet.isSatellite();
    }

    if (!isSatellite) {
        orbit.setDistance(currentDistance);
        orbit.setYear(_star->mass());
    }
    else {
        double sSatDist = *prevDistance;
        if (sSatDist <= 0)
            sSatDist = 35000+(double)((SSGX::dn(90)+30) * planet.diameter());
        else
            sSatDist += (double)((SSGX::dn(70)+10) * planet.diameter());
        *prevDistance = sSatDist;

        orbit.setDistance(sSatDist);  //in km

        double d1 = orbit.distance() / 40000.0;
        d1 = (pow(d1,3) * 793.64) / (planetTop.massEarth() + planet.massEarth());
        double dYear = sqrt(d1);

        orbit.setFixedYear(dYear);
    }

    planet.setOrbit(orbit);

    int w = rand() % 10;
    switch (w) {
    case 1:
        planet.setName(_onomastikon->fakeNomen());
        break;
    case 2:
        planet.setName(_onomastikon->fakeNomen());
        break;
    case 3:
        planet.setName(_onomastikon->nomen());
        break;
    case 4:
        planet.setName(_onomastikon->nomen());
        break;
    case 5:
        planet.setName(_onomastikon->sigla());
        break;
    default:
        planet.setName(_onomastikon->pseudoNomen());
        break;

    }


    return planet;
}