bool Nebula::readRCW(QString record) { QStringList list=record.split("\t", QString::KeepEmptyParts); float radeg=list.at(0).toFloat(); float dedeg=list.at(1).toFloat(); RCW_nb=list.at(2).toInt(); mag = 99.; // Calc the angular size in degrees float size=list.at(3).toFloat(); angularSize = size/60.0f; if (angularSize<0) angularSize=0; rcwBrightnessType = (Nebula::HaBrightnessType)list.at(5).toInt(); float RaRad=radeg*M_PI/180.f; // Convert from degrees to rad float DecRad=dedeg*M_PI/180.f; // Convert from degrees to rad // Calc the Cartesian coord with RA and DE StelUtils::spheToRect(RaRad,DecRad,XYZ); Q_ASSERT(fabs(XYZ.lengthSquared()-1.)<0.000000001); nType=NebHa; pointRegion = SphericalRegionP(new SphericalPoint(getJ2000EquatorialPos(NULL))); return true; }
bool Nebula::readLBN(QString record) { QStringList list=record.split("\t", QString::KeepEmptyParts); float radeg=list.at(0).toFloat(); float dedeg=list.at(1).toFloat(); LBN_nb=list.at(2).toInt(); // Area in square degrees angularSize = list.at(3).toFloat()/60.f; if (angularSize<0) angularSize=0; brightnessClass = list.at(4).toInt(); float RaRad=radeg*M_PI/180.f; // Convert from degrees to rad float DecRad=dedeg*M_PI/180.f; // Convert from degrees to rad // Calc the Cartesian coord with RA and DE StelUtils::spheToRect(RaRad,DecRad,XYZ); Q_ASSERT(fabs(XYZ.lengthSquared()-1.)<0.000000001); nType=NebHII; pointRegion = SphericalRegionP(new SphericalPoint(getJ2000EquatorialPos(NULL))); return true; }
bool Nebula::readSharpless(QString record) { QStringList list=record.split("\t", QString::KeepEmptyParts); //qDebug() << "RA:" << list.at(0) << " DE:" << list.at(1) << " Sh2:" << list.at(2) << " size:" << list.at(3) << " F:" << list.at(4) << " S:" << list.at(5) << " B:" << list.at(6); float radeg=list.at(0).toFloat(); float dedeg=list.at(1).toFloat(); Sh2_nb=list.at(2).toInt(); float RaRad=radeg*M_PI/180.f; // Convert from degrees to rad float DecRad=dedeg*M_PI/180.f; // Convert from degrees to rad // Calc the Cartesian coord with RA and DE StelUtils::spheToRect(RaRad,DecRad,XYZ); Q_ASSERT(fabs(XYZ.lengthSquared()-1.)<0.000000001); mag=99.0f; // Calc the angular size in degrees int size=list.at(3).toFloat(); angularSize = size/60.0f; formType = (Nebula::HIIFormType)list.at(4).toInt(); structureType = (Nebula::HIIStructureType)list.at(5).toInt(); brightnessType = (Nebula::HIIBrightnessType)list.at(6).toInt(); nType=NebHII; pointRegion = SphericalRegionP(new SphericalPoint(getJ2000EquatorialPos(NULL))); return true; }
bool Nebula::readBarnard(QString record) { // Line Format: "<B>\t<RAh>\t<RAm>\t<RAs>\t[+-]DD MM\t<size>\t<obs>\t<comment>... ..." int rahr; float ramin; int dedeg; int demin; QStringList list=record.split("\t", QString::KeepEmptyParts); //qDebug() << "Barnard: " << list.at(0) << "RA " << list.at(1) << list.at(2) << list.at(3) << // "Dec" << list.at(4) << "opac" << list.at(6) << "size" << list.at(5); B_nb=list.at(0).toInt(); rahr=list.at(1).toInt(); ramin=list.at(2).toInt() + list.at(3).toInt() / 60.0f; float RaRad = (double)rahr+ramin/60; QString degString=list.at(4); dedeg=degString.mid(1,2).toInt(); demin=degString.mid(4,2).toInt(); float DecRad = (float)dedeg+(float)demin/60.0f; if (degString.at(0) == '-') DecRad *= -1.f; RaRad*=M_PI/12.f; // Convert from hours to rad DecRad*=M_PI/180.f; // Convert from deg to rad // Calc the Cartesian coord with RA and DE StelUtils::spheToRect(RaRad,DecRad,XYZ); Q_ASSERT(fabs(XYZ.lengthSquared()-1.)<0.000000001); // "mag" will receive opacity for dark nebulae. QString opacityStr=list.at(6); if (opacityStr.contains('?')) mag=99; else mag=opacityStr.toFloat(); // Calc the angular size in degrees float size=list.at(5).toFloat(); angularSize = size/60.0f; // Barnard are dark nebulae only, so at least type is easy: nType=NebDn; pointRegion = SphericalRegionP(new SphericalPoint(getJ2000EquatorialPos(NULL))); // // Dark nebulae. Not sure how to assess visibility from opacity and size? --GZ // float lim; // // GZ: ad-hoc visibility formula: assuming good visibility if objects of mag9 are visible, "usual" opacity 5 and size 30', better visibility (discernability) comes with higher opacity and larger size, // // 9-(opac-5)-2*(angularSize-0.5) // if (angularSize>0 && mag<50) // lim = 15.0f - mag - 2.0f*angularSize; // else // lim = 9.0f; // qDebug() << "LIMIT:" << angularSize << "*" << mag << "=" << lim; return true; }
void Nebula::readNGC(QDataStream& in) { bool isIc; int nb; float ra, dec; unsigned int type; in >> isIc >> nb >> ra >> dec >> mag >> angularSize >> type; if (isIc) { IC_nb = nb; } else { NGC_nb = nb; } StelUtils::spheToRect(ra,dec,XYZ); Q_ASSERT(fabs(XYZ.lengthSquared()-1.)<0.000000001); nType = (Nebula::NebulaType)type; //if (type >= 5) { // qDebug()<< (isIc?"IC" : "NGC") << nb << " type " << type ; //} // This confirms there are currently no dark nebulae in the NGC list. Q_ASSERT(type!=5); pointRegion = SphericalRegionP(new SphericalPoint(getJ2000EquatorialPos(NULL))); }
void Nebula::readNGC(QDataStream& in) { bool isIc; int nb; float ra, dec; unsigned int type; in >> isIc >> nb >> ra >> dec >> mag >> angularSize >> type; if (isIc) { IC_nb = nb; } else { NGC_nb = nb; } StelUtils::spheToRect(ra,dec,XYZ); Q_ASSERT(fabs(XYZ.lengthSquared()-1.)<0.000000001); nType = (Nebula::NebulaType)type; // GZ: Trace the undefined entries... //if (type >= 5) { // qDebug()<< (isIc?"IC" : "NGC") << nb << " type " << type ; //} if (type == 5) { qDebug()<< (isIc?"IC" : "NGC") << nb << " type " << type ; } pointRegion = SphericalRegionP(new SphericalPoint(getJ2000EquatorialPos(NULL))); }
// 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; }
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 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&Extra1) { 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, false), 'f', 2), QString::number(getVMagnitude(core, true), 'f', 2)) << "<br>"; else oss << q_("Magnitude: <b>%1</b>").arg(getVMagnitude(core, false), 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) { double distanceAu = getJ2000EquatorialPos(core).length(); if (distanceAu < 0.1) { double distanceKm = AU * distanceAu; // xgettext:no-c-format oss << QString(q_("Distance: %1AU (%2 km)")) .arg(distanceAu, 0, 'f', 8) .arg(distanceKm, 0, 'f', 0); } else { // xgettext:no-c-format oss << q_("Distance: %1AU").arg(distanceAu, 0, 'f', 8); } 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&Extra1) && (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; }
// 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-centered galactic position Vec3d StelObject::getJ2000GalacticPos(const StelCore *core) const { return core->j2000ToGalactic(getJ2000EquatorialPos(core)); }
// Get observer-centered alt/az position Vec3d StelObject::getAltAzPosAuto(const StelCore* core) const { return core->j2000ToAltAz(getJ2000EquatorialPos(core)); }
// Get observer-centered alt/az position Vec3d StelObject::getAltAzPosApparent(const StelCore* core) const { return core->j2000ToAltAz(getJ2000EquatorialPos(core), StelCore::RefractionOn); }
Vec3d StelObject::getAltAzPosGeometric(const StelCore* core) const { return core->j2000ToAltAz(getJ2000EquatorialPos(core), StelCore::RefractionOff); }
Vec3d StelObject::getEquinoxEquatorialPos(const StelCore* core) const { return core->j2000ToEquinoxEqu(getJ2000EquatorialPos(core)); }