float Comet::getVMagnitude(const StelCore* core, bool withExtinction) const { //If the two parameter system is not used, //use the default radius/albedo mechanism if (slopeParameter < 0) { return Planet::getVMagnitude(core, withExtinction); } float extinctionMag=0.0; // track magnitude loss if (withExtinction && core->getSkyDrawer()->getFlagHasAtmosphere()) { Vec3d altAz=getAltAzPosApparent(core); altAz.normalize(); core->getSkyDrawer()->getExtinction().forward(&altAz[2], &extinctionMag); } //Calculate distances const Vec3d& observerHeliocentricPosition = core->getObserverHeliocentricEclipticPos(); const Vec3d& cometHeliocentricPosition = getHeliocentricEclipticPos(); const double cometSunDistance = std::sqrt(cometHeliocentricPosition.lengthSquared()); const double observerCometDistance = std::sqrt((observerHeliocentricPosition - cometHeliocentricPosition).lengthSquared()); //Calculate apparent magnitude //Sources: http://www.clearskyinstitute.com/xephem/help/xephem.html#mozTocId564354 //(XEphem manual, section 7.1.2.3 "Magnitude models"), also //http://www.ayton.id.au/gary/Science/Astronomy/Ast_comets.htm#Comet%20facts: double apparentMagnitude = absoluteMagnitude + 5 * std::log10(observerCometDistance) + 2.5 * slopeParameter * std::log10(cometSunDistance); return apparentMagnitude + extinctionMag; }
// Get observer local sidereal coordinates, deflected by refraction Vec3d StelObject::getSideralPosApparent(const StelCore* core) const { Vec3d v=getAltAzPosApparent(core); v = core->altAzToEquinoxEqu(v, StelCore::RefractionOff); // Hour Angle corrected to Delta-T value double dt = (core->getDeltaT(core->getJDay())/240.)*M_PI/180.; return Mat4d::zrotation(-core->getLocalSideralTime()+dt)*v; }
// Format the positional info string contain J2000/of date/altaz/hour angle positions for the object QString StelObject::getPositionInfoString(const StelCore *core, const InfoStringGroup& flags) const { bool withAtmosphere=core->getSkyDrawer()->getFlagHasAtmosphere(); QString res; if (flags&RaDecJ2000) { double dec_j2000, ra_j2000; StelUtils::rectToSphe(&ra_j2000,&dec_j2000,getJ2000EquatorialPos(core)); res += q_("RA/DE (J2000): %1/%2").arg(StelUtils::radToHmsStr(ra_j2000,true), StelUtils::radToDmsStr(dec_j2000,true)) + "<br>"; } if (flags&RaDecOfDate) { double dec_equ, ra_equ; StelUtils::rectToSphe(&ra_equ,&dec_equ,getEquinoxEquatorialPos(core)); res += q_("RA/DE (of date): %1/%2").arg(StelUtils::radToHmsStr(ra_equ), StelUtils::radToDmsStr(dec_equ)) + "<br>"; } if (flags&HourAngle) { double dec_sidereal, ra_sidereal; StelUtils::rectToSphe(&ra_sidereal,&dec_sidereal,getSideralPosGeometric(core)); ra_sidereal = 2.*M_PI-ra_sidereal; if (withAtmosphere) { res += q_("Hour angle/DE: %1/%2").arg(StelUtils::radToHmsStr(ra_sidereal), StelUtils::radToDmsStr(dec_sidereal)) + " " + q_("(geometric)") + "<br>"; StelUtils::rectToSphe(&ra_sidereal,&dec_sidereal,getSideralPosApparent(core)); ra_sidereal = 2.*M_PI-ra_sidereal; res += q_("Hour angle/DE: %1/%2").arg(StelUtils::radToHmsStr(ra_sidereal), StelUtils::radToDmsStr(dec_sidereal)) + " " + q_("(apparent)") + "<br>"; } else res += q_("Hour angle/DE: %1/%2").arg(StelUtils::radToHmsStr(ra_sidereal), StelUtils::radToDmsStr(dec_sidereal)) + " " + "<br>"; } if (flags&AltAzi) { // calculate alt az double az,alt; StelUtils::rectToSphe(&az,&alt,getAltAzPosGeometric(core)); az = 3.*M_PI - az; // N is zero, E is 90 degrees if (az > M_PI*2) az -= M_PI*2; if (withAtmosphere) { res += q_("Az/Alt: %1/%2").arg(StelUtils::radToDmsStr(az), StelUtils::radToDmsStr(alt)) + " " + q_("(geometric)") + "<br>"; StelUtils::rectToSphe(&az,&alt,getAltAzPosApparent(core)); az = 3.*M_PI - az; // N is zero, E is 90 degrees if (az > M_PI*2) az -= M_PI*2; res += q_("Az/Alt: %1/%2").arg(StelUtils::radToDmsStr(az), StelUtils::radToDmsStr(alt)) + " " + q_("(apparent)") + "<br>"; } else res += q_("Az/Alt: %1/%2").arg(StelUtils::radToDmsStr(az), StelUtils::radToDmsStr(alt)) + " " + "<br>"; } return res; }
float Quasar::getVMagnitude(const StelCore* core, bool withExtinction) const { float extinctionMag=0.0; // track magnitude loss if (withExtinction && core->getSkyDrawer()->getFlagHasAtmosphere()) { Vec3d altAz=getAltAzPosApparent(core); altAz.normalize(); core->getSkyDrawer()->getExtinction().forward(&altAz[2], &extinctionMag); } return VMagnitude + extinctionMag; }
QString Nova::getInfoString(const StelCore* core, const InfoStringGroup& flags) const { QString str; QTextStream oss(&str); if (flags&Name) { QString name = novaName.isEmpty() ? QString("<h2>%1</h2>").arg(designation) : QString("<h2>%1 (%2)</h2>").arg(getNameI18n()).arg(designation); oss << name; } if (flags&ObjectType) oss << QString("%1: <b>%2</b> (%3)").arg(q_("Type"), q_("nova"), novaType) << "<br />"; if (flags&Magnitude) { double az_app, alt_app; StelUtils::rectToSphe(&az_app,&alt_app,getAltAzPosApparent(core)); Q_UNUSED(az_app); oss << getMagnitudeInfoString(core, flags, alt_app, 2); } // Ra/Dec etc. oss << getCommonInfoString(core, flags); if (flags&Extra) { oss << QString("%1: %2").arg(q_("Maximum brightness"), getMaxBrightnessDate(peakJD)) << "<br />"; if (distance>0) { //TRANSLATORS: Unit of measure for distance - Light Years QString ly = qc_("ly", "distance"); oss << QString("%1: %2 %3").arg(q_("Distance"), QString::number(distance*1000, 'f', 2), ly) << "<br />"; } } postProcessInfoString(str, flags); return str; }
float Galaxy::getVMagnitude(const StelCore* core, bool withExtinction) const { float extinctionMag=0.0; // track magnitude loss if (withExtinction && core->getSkyDrawer()->getFlagHasAtmosphere()) { Vec3d altAz=getAltAzPosApparent(core); altAz.normalize(); core->getSkyDrawer()->getExtinction().forward(&altAz[2], &extinctionMag); } // Calculate fake visual magnitude as function by distance - minimal magnitude is 6 float vmag = distance + 6.f; if (GETSTELMODULE(POGS)->getDisplayMode()) { return 3.f; } else { return vmag + extinctionMag; } }
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; }
float Supernova::getVMagnitude(const StelCore* core, bool withExtinction) const { float extinctionMag=0.0; // track magnitude loss if (withExtinction && core->getSkyDrawer()->getFlagHasAtmosphere()) { Vec3d altAz=getAltAzPosApparent(core); altAz.normalize(); core->getSkyDrawer()->getExtinction().forward(&altAz[2], &extinctionMag); } double vmag = 20; double currentJD = core->getJDay(); double deltaJD = std::abs(peakJD-currentJD); // Use supernova light curve model from here - http://www.astronet.ru/db/msg/1188703 if (sntype.contains("II", Qt::CaseSensitive)) { // Type II if (peakJD<=currentJD) { vmag = maxMagnitude; if (deltaJD>0 && deltaJD<=30) vmag = maxMagnitude + 0.05 * deltaJD; if (deltaJD>30 && deltaJD<=80) vmag = maxMagnitude + 0.013 * deltaJD + 1.5; if (deltaJD>80) vmag = maxMagnitude + 0.05 * deltaJD + 2.15; } else { if (deltaJD<=20) vmag = maxMagnitude + 0.75 * deltaJD; } } else { // Type I if (peakJD<=currentJD) { vmag = maxMagnitude; if (deltaJD>0 && deltaJD<=25) vmag = maxMagnitude + 0.1 * deltaJD; if (deltaJD>25) vmag = maxMagnitude + 0.016 * deltaJD + 2.5; } else { if (deltaJD<=15) vmag = maxMagnitude + 1.13 * deltaJD; } } if (vmag<maxMagnitude) vmag = maxMagnitude; return vmag + extinctionMag; }
QString Exoplanet::getInfoString(const StelCore* core, const InfoStringGroup& flags) const { QString str; QTextStream oss(&str); const StelTranslator& trans = StelApp::getInstance().getLocaleMgr().getSkyTranslator(); if (flags&Name) { QString systemName = getNameI18n(); if (!starProperName.isEmpty()) systemName.append(QString(" (%1)").arg(designation)); oss << "<h2>" << systemName << "</h2>"; } if (flags&ObjectType) { oss << QString("%1: <b>%2</b>").arg(q_("Type"), q_("planetary system")) << "<br />"; } if (flags&Magnitude && Vmag<99 && !distributionMode) { double az_app, alt_app; StelUtils::rectToSphe(&az_app,&alt_app,getAltAzPosApparent(core)); Q_UNUSED(az_app); oss << getMagnitudeInfoString(core, flags, alt_app, 2); } // Ra/Dec etc. oss << getCommonInfoString(core, flags); if (flags&Extra && !stype.isEmpty()) oss << QString("%1: <b>%2</b>").arg(q_("Spectral Type"), stype) << "<br />"; if (flags&Distance && distance>0) { //TRANSLATORS: Unit of measure for distance - Light Years QString ly = qc_("ly", "distance"); oss << QString("%1: %2 %3").arg(q_("Distance"), QString::number(distance/0.306601, 'f', 2), ly) << "<br />"; } if (flags&Extra) { if (smetal!=0) { oss << QString("%1 [Fe/H]: %2").arg(q_("Metallicity"), QString::number(smetal, 'f', 3)) << "<br />"; } if (smass>0) { oss << QString("%1: %2 M<sub>%3</sub>").arg(q_("Mass"), QString::number(smass, 'f', 3), q_("Sun")) << "<br />"; } if (sradius>0) { oss << QString("%1: %2 R<sub>%3</sub>").arg(q_("Radius"), QString::number(sradius, 'f', 5), q_("Sun")) << "<br />"; } if (effectiveTemp>0) { oss << QString("%1: %2 %3").arg(q_("Effective temperature")).arg(effectiveTemp).arg(qc_("K", "temperature")) << "<br />"; } if (exoplanets.size() > 0) { QString qss = "padding: 0 2px 0 0;"; QString planetNameLabel = QString("<td style=\"%2\">%1</td>").arg(q_("Exoplanet")).arg(qss); QString planetProperNameLabel = QString("<td style=\"%2\">%1</td>").arg(q_("Name")).arg(qss); QString periodLabel = QString("<td style=\"%3\">%1 (%2)</td>").arg(q_("Period")).arg(qc_("days", "period")).arg(qss); QString massLabel = QString("<td style=\"%3\">%1 (M<sub>%2</sub>)</td>").arg(q_("Mass")).arg(q_("Jup")).arg(qss); QString radiusLabel = QString("<td style=\"%3\">%1 (R<sub>%2</sub>)</td>").arg(q_("Radius")).arg(q_("Jup")).arg(qss); QString semiAxisLabel = QString("<td style=\"%3\">%1 (%2)</td>").arg(q_("Semi-Major Axis")).arg(qc_("AU", "distance, astronomical unit")).arg(qss); QString eccentricityLabel = QString("<td style=\"%2\">%1</td>").arg(q_("Eccentricity")).arg(qss); QString inclinationLabel = QString("<td style=\"%3\">%1 (%2)</td>").arg(q_("Inclination")).arg(QChar(0x00B0)).arg(qss); QString angleDistanceLabel = QString("<td style=\"%2\">%1 (\")</td>").arg(q_("Angle Distance")).arg(qss); QString discoveredLabel = QString("<td style=\"%2\">%1</td>").arg(q_("Discovered year")).arg(qss); QString detectionMethodLabel = QString("<td style=\"%2\">%1</td>").arg(q_("Detection method")).arg(qss); QString pClassLabel = QString("<td style=\"%2\">%1</td>").arg(q_("Planetary class")).arg(qss); //TRANSLATORS: Full phrase is "Equilibrium Temperature" QString equilibriumTempLabel = QString("<td style=\"%3\">%1 (%2)</td>").arg(q_("Equilibrium temp.")).arg(getTemperatureScaleUnit()).arg(qss); //TRANSLATORS: Average stellar flux of the planet QString fluxLabel = QString("<td style=\"%2\">%1 (S<sub>E</sub>)</td>").arg(q_("Flux")).arg(qss); //TRANSLATORS: ESI = Earth Similarity Index QString ESILabel = QString("<td style=\"%2\">%1</td>").arg(q_("ESI")).arg(qss); QString row = "<td style=\"padding:0 2px;\">%1</td>"; QString emRow = "<td style=\"padding:0 2px;\"><em>%1</em></td>"; QString emptyRow = "<td style=\"padding:0 2px;\">—</td>"; for (const auto& p : exoplanets) { if (!p.planetName.isEmpty()) planetNameLabel.append(row.arg(p.planetName)); else planetNameLabel.append(emptyRow); if (!p.planetProperName.isEmpty()) planetProperNameLabel.append(row.arg(trans.qtranslate(p.planetProperName))); else planetProperNameLabel.append(emptyRow); if (p.period > -1.f) periodLabel.append(row.arg(QString::number(p.period, 'f', 2))); else periodLabel.append(emptyRow); if (p.mass > -1.f) massLabel.append(row.arg(QString::number(p.mass, 'f', 2))); else massLabel.append(emptyRow); if (p.radius > -1.f) radiusLabel.append(row.arg(QString::number(p.radius, 'f', 1))); else radiusLabel.append(emptyRow); if (p.eccentricity > -1.f) eccentricityLabel.append(row.arg(QString::number(p.eccentricity, 'f', 3))); else eccentricityLabel.append(emptyRow); if (p.inclination > -1.f) inclinationLabel.append(row.arg(QString::number(p.inclination, 'f', 1))); else inclinationLabel.append(emptyRow); if (p.semiAxis > -1.f) semiAxisLabel.append(row.arg(QString::number(p.semiAxis, 'f', 4))); else semiAxisLabel.append(emptyRow); if (p.angleDistance > -1.f) angleDistanceLabel.append(row.arg(QString::number(p.angleDistance, 'f', 6))); else angleDistanceLabel.append(emptyRow); if (p.discovered > 0) discoveredLabel.append(row.arg(QString::number(p.discovered))); else discoveredLabel.append(emptyRow); if (!p.pclass.isEmpty()) { if (!p.conservative) pClassLabel.append(emRow.arg(getPlanetaryClassI18n(p.pclass))); else pClassLabel.append(row.arg(getPlanetaryClassI18n(p.pclass))); } else pClassLabel.append(emptyRow); if (p.EqTemp > 0) { if (!p.conservative) equilibriumTempLabel.append(emRow.arg(QString::number(getTemperature(p.EqTemp), 'f', 2))); else equilibriumTempLabel.append(row.arg(QString::number(getTemperature(p.EqTemp), 'f', 2))); } else equilibriumTempLabel.append(emptyRow); if (p.flux > 0) { if (!p.conservative) fluxLabel.append(emRow.arg(QString::number(p.flux * 0.01, 'f', 2))); else fluxLabel.append(row.arg(QString::number(p.flux * 0.01, 'f', 2))); } else fluxLabel.append(emptyRow); if (p.ESI > 0) { if (!p.conservative) ESILabel.append(emRow.arg(QString::number(p.ESI * 0.01, 'f', 2))); else ESILabel.append(row.arg(QString::number(p.ESI * 0.01, 'f', 2))); } else ESILabel.append(emptyRow); if (p.detectionMethod.isEmpty()) detectionMethodLabel.append(emptyRow); else detectionMethodLabel.append(row.arg(q_(p.detectionMethod))); } oss << "<table style='margin-left: -2px;'>"; // Cosmetic fix oss << "<tr>" << planetNameLabel << "</tr>"; oss << "<tr>" << planetProperNameLabel << "</tr>"; oss << "<tr>" << periodLabel << "</tr>"; oss << "<tr>" << massLabel << "</tr>"; oss << "<tr>" << radiusLabel << "</tr>"; oss << "<tr>" << semiAxisLabel << "</tr>"; oss << "<tr>" << eccentricityLabel << "</tr>"; oss << "<tr>" << inclinationLabel << "</tr>"; oss << "<tr>" << angleDistanceLabel << "</tr>"; oss << "<tr>" << discoveredLabel << "</tr>"; oss << "<tr>" << detectionMethodLabel << "</tr>"; if (hasHabitableExoplanets) { oss << "<tr>" << pClassLabel << "</tr>"; oss << "<tr>" << equilibriumTempLabel << "</tr>"; oss << "<tr>" << fluxLabel << "</tr>"; oss << "<tr>" << ESILabel << "</tr>"; } oss << "</table>"; if (hasHabitableExoplanets) oss << QString("%1: %2%3").arg(q_("Equilibrium temperature on Earth")).arg(QString::number(getTemperature(255), 'f', 2)).arg(getTemperatureScaleUnit()) << "<br />"; } } postProcessInfoString(str, flags); return str; }
// Format the positional info string contain J2000/of date/altaz/hour angle positions for the object QString StelObject::getPositionInfoString(const StelCore *core, const InfoStringGroup& flags) const { bool withAtmosphere=core->getSkyDrawer()->getFlagHasAtmosphere(); QString res; if (flags&RaDecJ2000) { double dec_j2000, ra_j2000; StelUtils::rectToSphe(&ra_j2000,&dec_j2000,getJ2000EquatorialPos(core)); res += q_("RA/DE (J2000): %1/%2").arg(StelUtils::radToHmsStr(ra_j2000,true), StelUtils::radToDmsStr(dec_j2000,true)) + "<br>"; } if (flags&RaDecOfDate) { double dec_equ, ra_equ; StelUtils::rectToSphe(&ra_equ,&dec_equ,getEquinoxEquatorialPos(core)); res += q_("RA/DE (of date): %1/%2").arg(StelUtils::radToHmsStr(ra_equ), StelUtils::radToDmsStr(dec_equ)) + "<br>"; } if (flags&GalCoordJ2000) { double glong, glat; StelUtils::rectToSphe(&glong, &glat, getJ2000GalacticPos(core)); // Note that Gal. Coords are DEFINED in B1950 coordinates, and writing "J2000" to them does not make any sense. res += q_("Galactic longitude/latitude: %1/%2").arg(StelUtils::radToDmsStr(glong,true), StelUtils::radToDmsStr(glat,true)) + "<br>"; } if (flags&HourAngle) { double dec_sidereal, ra_sidereal; StelUtils::rectToSphe(&ra_sidereal,&dec_sidereal,getSideralPosGeometric(core)); ra_sidereal = 2.*M_PI-ra_sidereal; if (withAtmosphere) { res += q_("Hour angle/DE: %1/%2").arg(StelUtils::radToHmsStr(ra_sidereal), StelUtils::radToDmsStr(dec_sidereal)) + " " + q_("(geometric)") + "<br>"; StelUtils::rectToSphe(&ra_sidereal,&dec_sidereal,getSideralPosApparent(core)); ra_sidereal = 2.*M_PI-ra_sidereal; res += q_("Hour angle/DE: %1/%2").arg(StelUtils::radToHmsStr(ra_sidereal), StelUtils::radToDmsStr(dec_sidereal)) + " " + q_("(apparent)") + "<br>"; } else res += q_("Hour angle/DE: %1/%2").arg(StelUtils::radToHmsStr(ra_sidereal), StelUtils::radToDmsStr(dec_sidereal)) + " " + "<br>"; } if (flags&AltAzi) { // calculate alt az double az,alt; StelUtils::rectToSphe(&az,&alt,getAltAzPosGeometric(core)); az = 3.*M_PI - az; // N is zero, E is 90 degrees if (az > M_PI*2) az -= M_PI*2; if (withAtmosphere) { res += q_("Az/Alt: %1/%2").arg(StelUtils::radToDmsStr(az), StelUtils::radToDmsStr(alt)) + " " + q_("(geometric)") + "<br>"; StelUtils::rectToSphe(&az,&alt,getAltAzPosApparent(core)); az = 3.*M_PI - az; // N is zero, E is 90 degrees if (az > M_PI*2) az -= M_PI*2; res += q_("Az/Alt: %1/%2").arg(StelUtils::radToDmsStr(az), StelUtils::radToDmsStr(alt)) + " " + q_("(apparent)") + "<br>"; } else res += q_("Az/Alt: %1/%2").arg(StelUtils::radToDmsStr(az), StelUtils::radToDmsStr(alt)) + " " + "<br>"; } return res; }
// Get observer local sidereal coordinates, deflected by refraction Vec3d StelObject::getSideralPosApparent(const StelCore* core) const { Vec3d v=getAltAzPosApparent(core); v = core->altAzToEquinoxEqu(v, StelCore::RefractionOff); return Mat4d::zrotation(-core->getLocalSideralTime())*v; }