float Nebula::getSurfaceBrightnessWithExtinction(const StelCore* core) const { if (getVMagnitudeWithExtinction(core)<99 && angularSize>0 && nType!=NebDn && nType!=NebHII) return getVMagnitudeWithExtinction(core) + 2.5*log10(M_PI*pow((angularSize*M_PI/180.)*1800,2)); else return 99; }
void Nova::draw(StelCore* core, StelPainter* painter) { StelSkyDrawer* sd = core->getSkyDrawer(); StarMgr* smgr = GETSTELMODULE(StarMgr); // It's need for checking displaying of labels for stars Vec3f color = Vec3f(1.f,1.f,1.f); RCMag rcMag; float size, shift; double mag; StelUtils::spheToRect(RA, Dec, XYZ); mag = getVMagnitudeWithExtinction(core); sd->preDrawPointSource(painter); float mlimit = sd->getLimitMagnitude(); if (mag <= mlimit) { sd->computeRCMag(mag, &rcMag); sd->drawPointSource(painter, Vec3f(XYZ[0],XYZ[1],XYZ[2]), rcMag, color, false); painter->setColor(color[0], color[1], color[2], 1.f); size = getAngularSize(NULL)*M_PI/180.*painter->getProjector()->getPixelPerRadAtCenter(); shift = 6.f + size/1.8f; if (labelsFader.getInterstate()<=0.f && (mag+5.f)<mlimit && smgr->getFlagLabels()) { QString name = novaName.isEmpty() ? designation : novaName; painter->drawText(XYZ, name, 0, shift, shift, false); } } sd->postDrawPointSource(painter); }
void Comet::drawComa(StelCore* core, StelProjector::ModelViewTranformP transfo) { // Find rotation matrix from 0/0/1 to viewdirection! crossproduct for axis (normal vector), dotproduct for angle. Vec3d eclposNrm=eclipticPos - core->getObserverHeliocentricEclipticPos() ; eclposNrm.normalize(); Mat4d comarot=Mat4d::rotation(Vec3d(0.0, 0.0, 1.0)^(eclposNrm), std::acos(Vec3d(0.0, 0.0, 1.0).dot(eclposNrm)) ); StelProjector::ModelViewTranformP transfo2 = transfo->clone(); transfo2->combine(comarot); StelPainter* sPainter = new StelPainter(core->getProjection(transfo2)); glEnable(GL_BLEND); glBlendFunc(GL_ONE, GL_ONE); glDisable(GL_CULL_FACE); // GZ: For the coma, we can use extinction via atmosphere. // In addition, light falloff is a bit reduced for better visibility. Power basis should be 0.4, we use 0.6. float minSkyMag=core->getSkyDrawer()->getLimitMagnitude(); float mag100pct=minSkyMag-6.0f; // should be 5, but let us draw it a bit brighter. float magDrop=getVMagnitudeWithExtinction(core)-mag100pct; float magFactor=std::pow(0.6f , magDrop); magFactor=qMin(magFactor, 2.0f); // Limit excessively bright display. comaTexture->bind(); sPainter->setColor(magFactor,magFactor,0.6f*magFactor); sPainter->setArrays((Vec3d*)comaVertexArr.constData(), (Vec2f*)comaTexCoordArr.constData()); sPainter->drawFromArray(StelPainter::Triangles, comaVertexArr.size()/3); glDisable(GL_BLEND); if (sPainter) delete sPainter; sPainter=NULL; }
void Exoplanet::draw(StelCore* core, StelPainter *painter) { bool visible; StelSkyDrawer* sd = core->getSkyDrawer(); StarMgr* smgr = GETSTELMODULE(StarMgr); // It's need for checking displaying of labels for stars Vec3f color = exoplanetMarkerColor; if (hasHabitableExoplanets) color = habitableExoplanetMarkerColor; StelUtils::spheToRect(RA, DE, XYZ); double mag = getVMagnitudeWithExtinction(core); painter->setBlending(true, GL_ONE, GL_ONE); painter->setColor(color[0], color[1], color[2], 1); if (timelineMode) { visible = isDiscovered(core); } else { visible = true; } if (habitableMode) { if (!hasHabitableExoplanets) return; } Vec3d win; // Check visibility of exoplanet system if(!visible || !(painter->getProjector()->projectCheck(XYZ, win))) {return;} float mlimit = sd->getLimitMagnitude(); if (mag <= mlimit) { Exoplanet::markerTexture->bind(); float size = getAngularSize(Q_NULLPTR)*M_PI/180.*painter->getProjector()->getPixelPerRadAtCenter(); float shift = 5.f + size/1.6f; painter->drawSprite2dMode(XYZ, distributionMode ? 4.f : 5.f); float coeff = 4.5f + std::log10(sradius + 0.1f); if (labelsFader.getInterstate()<=0.f && !distributionMode && (mag+coeff)<mlimit && smgr->getFlagLabels() && showDesignations) { painter->drawText(XYZ, getNameI18n(), 0, shift, shift, false); } } }
QString Nova::getInfoString(const StelCore* core, const InfoStringGroup& flags) const { QString str; QTextStream oss(&str); double mag = getVMagnitude(core); if (flags&Name) { QString name = novaName.isEmpty() ? QString("<h2>%1</h2>").arg(designation) : QString("<h2>%1 (%2)</h2>").arg(novaName).arg(designation); oss << name; } if (flags&ObjectType) oss << q_("Type: <b>%1</b> (%2)").arg(q_("nova")).arg(novaType) << "<br />"; if (flags&Magnitude) { if (core->getSkyDrawer()->getFlagHasAtmosphere()) oss << q_("Magnitude: <b>%1</b> (extincted to: <b>%2</b>)").arg(QString::number(mag, 'f', 2), QString::number(getVMagnitudeWithExtinction(core), 'f', 2)) << "<br>"; else oss << q_("Magnitude: <b>%1</b>").arg(mag, 0, 'f', 2) << "<br>"; } // Ra/Dec etc. oss << getPositionInfoString(core, flags); if (flags&Extra) { oss << q_("Maximum brightness: %1").arg(getMaxBrightnessDate(peakJD)) << "<br>"; if (distance>0) { //TRANSLATORS: Unit of measure for distance - Light Years oss << q_("Distance: %1 ly").arg(distance*1000) << "<br>"; } } postProcessInfoString(str, flags); return str; }
QString MinorPlanet::getInfoString(const StelCore *core, const InfoStringGroup &flags) const { //Mostly copied from Planet::getInfoString(): QString str; QTextStream oss(&str); double az_app, alt_app; StelUtils::rectToSphe(&az_app,&alt_app,getAltAzPosApparent(core)); Q_UNUSED(az_app); if (flags&Name) { oss << "<h2>"; if (minorPlanetNumber) oss << QString("(%1) ").arg(minorPlanetNumber); if (nameIsProvisionalDesignation) oss << provisionalDesignationHtml; else oss << getNameI18n(); // UI translation can differ from sky translation oss.setRealNumberNotation(QTextStream::FixedNotation); oss.setRealNumberPrecision(1); if (sphereScale != 1.f) oss << QString::fromUtf8(" (\xC3\x97") << sphereScale << ")"; oss << "</h2>"; if (!nameIsProvisionalDesignation && !provisionalDesignationHtml.isEmpty()) { oss << QString(q_("Provisional designation: %1")).arg(provisionalDesignationHtml); oss << "<br>"; } } if (flags&ObjectType && getPlanetType()!=isUNDEFINED) { oss << q_("Type: <b>%1</b>").arg(q_(getPlanetTypeString())) << "<br />"; } if (flags&Magnitude) { if (core->getSkyDrawer()->getFlagHasAtmosphere() && (alt_app>-3.0*M_PI/180.0)) // Don't show extincted magnitude much below horizon where model is meaningless. oss << q_("Magnitude: <b>%1</b> (extincted to: <b>%2</b>)").arg(QString::number(getVMagnitude(core), 'f', 2), QString::number(getVMagnitudeWithExtinction(core), 'f', 2)) << "<br>"; else oss << q_("Magnitude: <b>%1</b>").arg(getVMagnitude(core), 0, 'f', 2) << "<br>"; } if (flags&AbsoluteMagnitude) { //TODO: Make sure absolute magnitude is a sane value //If the H-G system is not used, use the default radius/albedo mechanism if (slopeParameter < 0) { oss << q_("Absolute Magnitude: %1").arg(getVMagnitude(core) - 5. * (std::log10(getJ2000EquatorialPos(core).length()*AU/PARSEC)-1.), 0, 'f', 2) << "<br>"; } else { oss << q_("Absolute Magnitude: %1").arg(absoluteMagnitude, 0, 'f', 2) << "<br>"; } } oss << getPositionInfoString(core, flags); if (flags&Distance) { double distanceAu = getJ2000EquatorialPos(core).length(); double distanceKm = AU * distanceAu; if (distanceAu < 0.1) { // xgettext:no-c-format oss << QString(q_("Distance: %1AU (%2 km)")) .arg(distanceAu, 0, 'f', 6) .arg(distanceKm, 0, 'f', 3); } else { // xgettext:no-c-format oss << QString(q_("Distance: %1AU (%2 Mio km)")) .arg(distanceAu, 0, 'f', 3) .arg(distanceKm / 1.0e6, 0, 'f', 3); } oss << "<br>"; } float aSize = 2.*getAngularSize(core)*M_PI/180.; if (flags&Size && aSize>1e-6) oss << q_("Apparent diameter: %1").arg(StelUtils::radToDmsStr(aSize, true)) << "<br>"; // If semi-major axis not zero then calculate and display orbital period for asteroid in days double siderealPeriod = getSiderealPeriod(); if ((flags&Extra) && (siderealPeriod>0)) { // TRANSLATORS: Sidereal (orbital) period for solar system bodies in days and in Julian years (symbol: a) oss << q_("Sidereal period: %1 days (%2 a)").arg(QString::number(siderealPeriod, 'f', 2)).arg(QString::number(siderealPeriod/365.25, 'f', 3)) << "<br>"; } postProcessInfoString(str, flags); return str; }
QString MinorPlanet::getInfoString(const StelCore *core, const InfoStringGroup &flags) const { //Mostly copied from Planet::getInfoString(): QString str; QTextStream oss(&str); if (flags&Name) { oss << "<h2>"; if (minorPlanetNumber) oss << QString("(%1) ").arg(minorPlanetNumber); if (nameIsProvisionalDesignation) oss << provisionalDesignationHtml; else oss << q_(properName); // UI translation can differ from sky translation oss.setRealNumberNotation(QTextStream::FixedNotation); oss.setRealNumberPrecision(1); if (sphereScale != 1.f) oss << QString::fromUtf8(" (\xC3\x97") << sphereScale << ")"; oss << "</h2>"; if (!nameIsProvisionalDesignation && !provisionalDesignationHtml.isEmpty()) { oss << QString(q_("Provisional designation: %1")).arg(provisionalDesignationHtml); oss << "<br>"; } } if (flags&ObjectType) { if (pType.length()>0) oss << q_("Type: <b>%1</b>").arg(q_(pType)) << "<br />"; } if (flags&Magnitude) { if (core->getSkyDrawer()->getFlagHasAtmosphere()) oss << q_("Magnitude: <b>%1</b> (extincted to: <b>%2</b>)").arg(QString::number(getVMagnitude(core), 'f', 2), QString::number(getVMagnitudeWithExtinction(core), 'f', 2)) << "<br>"; else oss << q_("Magnitude: <b>%1</b>").arg(getVMagnitude(core), 0, 'f', 2) << "<br>"; } if (flags&AbsoluteMagnitude) { //TODO: Make sure absolute magnitude is a sane value //If the H-G system is not used, use the default radius/albedo mechanism if (slopeParameter < 0) { oss << q_("Absolute Magnitude: %1").arg(getVMagnitude(core) - 5. * (std::log10(getJ2000EquatorialPos(core).length()*AU/PARSEC)-1.), 0, 'f', 2) << "<br>"; } else { oss << q_("Absolute Magnitude: %1").arg(absoluteMagnitude, 0, 'f', 2) << "<br>"; } } oss << getPositionInfoString(core, flags); if (flags&Distance) { double distanceAu = getJ2000EquatorialPos(core).length(); double distanceKm = AU * distanceAu; if (distanceAu < 0.1) { // xgettext:no-c-format oss << QString(q_("Distance: %1AU (%2 km)")) .arg(distanceAu, 0, 'f', 6) .arg(distanceKm, 0, 'f', 3); } else { // xgettext:no-c-format oss << QString(q_("Distance: %1AU (%2 Mio km)")) .arg(distanceAu, 0, 'f', 3) .arg(distanceKm / 1.0e6, 0, 'f', 3); } oss << "<br>"; } if (flags&Size) oss << q_("Apparent diameter: %1").arg(StelUtils::radToDmsStr(2.*getAngularSize(core)*M_PI/180., true)) << "<br>"; // If semi-major axis not zero then calculate and display orbital period for asteroid in days double siderealPeriod = getSiderealPeriod(); if ((flags&Extra) && (siderealPeriod>0)) { // TRANSLATORS: Sidereal (orbital) period for solar system bodies in days and in Julian years (symbol: a) oss << q_("Sidereal period: %1 days (%2 a)").arg(QString::number(siderealPeriod, 'f', 2)).arg(QString::number(siderealPeriod/365.25, 'f', 3)) << "<br>"; } //This doesn't work, even if setOpenExternalLinks(true) is used in InfoPanel /* if (flags&Extra) oss << QString("<br><a href=\"http://ssd.jpl.nasa.gov/sbdb.cgi?sstr=%1\">JPL Small-Body Database Browser</a>").arg( (minorPlanetNumber) ? QString::number(minorPlanetNumber) : englishName ); */ postProcessInfoString(str, flags); return str; }
QString Nebula::getInfoString(const StelCore *core, const InfoStringGroup& flags) const { QString str; QTextStream oss(&str); if ((flags&Name) || (flags&CatalogNumber)) oss << "<h2>"; if (nameI18!="" && flags&Name) { oss << getNameI18n(); } if (flags&CatalogNumber) { if (nameI18!="" && flags&Name) oss << " ("; QStringList catIds; if ((M_nb > 0) && (M_nb < 111)) catIds << QString("M %1").arg(M_nb); if ((C_nb > 0) && (C_nb < 110)) catIds << QString("C %1").arg(C_nb); if (NGC_nb > 0) catIds << QString("NGC %1").arg(NGC_nb); if (IC_nb > 0) catIds << QString("IC %1").arg(IC_nb); if ((B_nb > 0) && (B_nb <= 370)) catIds << QString("B %1").arg(B_nb); if ((Sh2_nb > 0) && (Sh2_nb <= 313)) catIds << QString("Sh 2-%1").arg(Sh2_nb); if ((VdB_nb > 0) && (VdB_nb <= 158)) catIds << QString("VdB %1").arg(VdB_nb); if ((RCW_nb > 0) && (RCW_nb <= 182)) catIds << QString("RCW %1").arg(RCW_nb); if ((LDN_nb > 0) && (LDN_nb <= 1802)) catIds << QString("LDN %1").arg(LDN_nb); if ((LBN_nb > 0) && (LBN_nb <= 1125)) catIds << QString("LBN %1").arg(LBN_nb); if ((Cr_nb > 0) && (Cr_nb <= 471)) catIds << QString("Cr %1").arg(Cr_nb); if ((Mel_nb > 0) && (Mel_nb <= 245)) catIds << QString("Mel %1").arg(Mel_nb); oss << catIds.join(" - "); if (nameI18!="" && flags&Name) oss << ")"; } if ((flags&Name) || (flags&CatalogNumber)) oss << "</h2>"; if (flags&ObjectType) oss << q_("Type: <b>%1</b>").arg(getTypeString()) << "<br>"; if (mag < 50 && flags&Magnitude) { if (nType == NebDn) { oss << q_("Opacity: <b>%1</b>").arg(getVMagnitude(core), 0, 'f', 2) << "<br>"; } else { if (core->getSkyDrawer()->getFlagHasAtmosphere()) oss << q_("Magnitude: <b>%1</b> (extincted to: <b>%2</b>)").arg(QString::number(getVMagnitude(core), 'f', 2), QString::number(getVMagnitudeWithExtinction(core), 'f', 2)) << "<br>"; else oss << q_("Magnitude: <b>%1</b>").arg(getVMagnitude(core), 0, 'f', 2) << "<br>"; } } if (nType != NebDn && mag < 50 && flags&Extra) { if (core->getSkyDrawer()->getFlagHasAtmosphere()) { if (getSurfaceBrightness(core)<99 && getSurfaceBrightnessWithExtinction(core)<99) oss << q_("Surface brightness: <b>%1</b> (extincted to: <b>%2</b>)").arg(QString::number(getSurfaceBrightness(core), 'f', 2), QString::number(getSurfaceBrightnessWithExtinction(core), 'f', 2)) << "<br>"; } else { if (getSurfaceBrightness(core)<99) oss << q_("Surface brightness: <b>%1</b>").arg(QString::number(getSurfaceBrightness(core), 'f', 2)) << "<br>"; } } if (flags&Extra) { if (nType==NebHII) { if (LBN_nb!=0) oss << q_("Brightness: %1").arg(brightnessClass) << "<br>"; else { oss << qc_("Form: %1","HII Region").arg(getHIIFormTypeString()) << "<br>"; oss << qc_("Structure: %1","HII Region").arg(getHIIStructureTypeString()) << "<br>"; oss << q_("Brightness: %1").arg(getHIIBrightnessTypeString()) << "<br>"; } } if (nType==NebHa) { oss << q_("Brightness: %1").arg(getHaBrightnessTypeString()) << "<br>"; } } oss << getPositionInfoString(core, flags); if (angularSize>0 && flags&Size) oss << q_("Size: %1").arg(StelUtils::radToDmsStr(angularSize*M_PI/180.)) << "<br>"; postProcessInfoString(str, flags); return str; }
QString Comet::getInfoString(const StelCore *core, const InfoStringGroup &flags) const { //Mostly copied from Planet::getInfoString(): QString str; QTextStream oss(&str); if (flags&Name) { oss << "<h2>"; oss << q_(englishName); // UI translation can differ from sky translation oss.setRealNumberNotation(QTextStream::FixedNotation); oss.setRealNumberPrecision(1); if (sphereScale != 1.f) oss << QString::fromUtf8(" (\xC3\x97") << sphereScale << ")"; oss << "</h2>"; } if (flags&ObjectType) { if (pType.length()>0) oss << q_("Type: <b>%1</b>").arg(q_(pType)) << "<br />"; } if (flags&Magnitude) { if (core->getSkyDrawer()->getFlagHasAtmosphere()) oss << q_("Magnitude: <b>%1</b> (extincted to: <b>%2</b>)").arg(QString::number(getVMagnitude(core), 'f', 2), QString::number(getVMagnitudeWithExtinction(core), 'f', 2)) << "<br>"; else oss << q_("Magnitude: <b>%1</b>").arg(getVMagnitude(core), 0, 'f', 2) << "<br>"; } if (flags&AbsoluteMagnitude) { //TODO: Make sure absolute magnitude is a sane value //If the two parameter magnitude system is not use, don't display this //value. (Using radius/albedo doesn't make any sense for comets.) if (slopeParameter >= 0) oss << q_("Absolute Magnitude: %1").arg(absoluteMagnitude, 0, 'f', 2) << "<br>"; } oss << getPositionInfoString(core, flags); if (flags&Distance) { // GZ: Distance from sun should be added to all planets IMHO. double distanceAu = getHeliocentricEclipticPos().length(); double distanceKm = AU * distanceAu; if (distanceAu < 0.1) { // xgettext:no-c-format oss << QString(q_("Distance from Sun: %1AU (%2 km)")) .arg(distanceAu, 0, 'f', 6) .arg(distanceKm, 0, 'f', 3); } else { // xgettext:no-c-format oss << QString(q_("Distance from Sun: %1AU (%2 Mio km)")) .arg(distanceAu, 0, 'f', 3) .arg(distanceKm / 1.0e6, 0, 'f', 3); } oss << "<br>"; distanceAu = getJ2000EquatorialPos(core).length(); distanceKm = AU * distanceAu; if (distanceAu < 0.1) { // xgettext:no-c-format oss << QString(q_("Distance: %1AU (%2 km)")) .arg(distanceAu, 0, 'f', 6) .arg(distanceKm, 0, 'f', 3); } else { // xgettext:no-c-format oss << QString(q_("Distance: %1AU (%2 Mio km)")) .arg(distanceAu, 0, 'f', 3) .arg(distanceKm / 1.0e6, 0, 'f', 3); } oss << "<br>"; // GZ: Add speed. I don't know where to place that bit of information. // xgettext:no-c-format oss << QString(q_("Speed: %1 km/s")) .arg(((CometOrbit*)userDataPtr)->getVelocity().length()*AU/86400.0, 0, 'f', 3); oss << "<br>"; } /* if (flags&Size) oss << q_("Apparent diameter: %1").arg(StelUtils::radToDmsStr(2.*getAngularSize(core)*M_PI/180., true)); */ // If semi-major axis not zero then calculate and display orbital period for comet in days double siderealPeriod = getSiderealPeriod(); if ((flags&Extra) && (siderealPeriod>0)) { // TRANSLATORS: Sidereal (orbital) period for solar system bodies in days and in Julian years (symbol: a) oss << q_("Sidereal period: %1 days (%2 a)").arg(QString::number(siderealPeriod, 'f', 2)).arg(QString::number(siderealPeriod/365.25, 'f', 3)) << "<br>"; } postProcessInfoString(str, flags); return str; }
QString Nebula::getInfoString(const StelCore *core, const InfoStringGroup& flags) const { QString str; QTextStream oss(&str); if ((flags&Name) || (flags&CatalogNumber)) oss << "<h2>"; if (nameI18!="" && flags&Name) { oss << getNameI18n(); } if (flags&CatalogNumber) { if (nameI18!="" && flags&Name) oss << " ("; QStringList catIds; if ((M_nb > 0) && (M_nb < 111)) catIds << QString("M %1").arg(M_nb); if (NGC_nb > 0) catIds << QString("NGC %1").arg(NGC_nb); if (IC_nb > 0) catIds << QString("IC %1").arg(IC_nb); if ((C_nb > 0) && (C_nb < 110)) catIds << QString("C %1").arg(C_nb); oss << catIds.join(" - "); if (nameI18!="" && flags&Name) oss << ")"; } if ((flags&Name) || (flags&CatalogNumber)) oss << "</h2>"; if (flags&ObjectType) oss << q_("Type: <b>%1</b>").arg(getTypeString()) << "<br>"; if (mag < 50 && flags&Magnitude) { if (core->getSkyDrawer()->getFlagHasAtmosphere()) { oss << q_("Magnitude: <b>%1</b> (extincted to: <b>%2</b>)").arg(QString::number(getVMagnitude(core), 'f', 2), QString::number(getVMagnitudeWithExtinction(core), 'f', 2)) << "<br>"; if (getSurfaceBrightness(core)<99 && getSurfaceBrightnessWithExtinction(core)<99) oss << q_("Surface brightness: <b>%1</b> (extincted to: <b>%2</b>)").arg(QString::number(getSurfaceBrightness(core), 'f', 2), QString::number(getSurfaceBrightnessWithExtinction(core), 'f', 2)) << "<br>"; } else { oss << q_("Magnitude: <b>%1</b>").arg(getVMagnitude(core), 0, 'f', 2) << "<br>"; if (getSurfaceBrightness(core)<99) oss << q_("Surface brightness: <b>%1</b>").arg(QString::number(getSurfaceBrightness(core), 'f', 2)) << "<br>"; } } oss << getPositionInfoString(core, flags); if (angularSize>0 && flags&Size) oss << q_("Size: %1").arg(StelUtils::radToDmsStr(angularSize*M_PI/180.)) << "<br>"; postProcessInfoString(str, flags); return str; }