トップページ > 機能追加 > 選択した天体の太陽/母天体からの距離を表示

選択した天体の太陽/母天体からの距離を表示


選択した天体の太陽もしくは母天体からの距離を現在の視点からの隣に括弧書きで表示します。
天体が恒星および深宇宙天体の場合は太陽からの距離を表示します。
天体が惑星・衛星・小惑星・彗星・人工天体(.sscファイルで定義する天体)の場合は母天体からの距離となります。
(当然、太陽系内で太陽の周りを直接公転している天体は太陽からの距離になります。)
太陽/母天体からの距離


変更方法


ソースコードをダウンロードしたディレクトリをMyCelestiaとします。
MyCelestia\celestia\src\celestia\celestiacore.cppを編集します。

2748行目付近
以下の赤文字部分を追加
変更前

	static void displayStarInfo(Overlay& overlay,
	                            int detail,
	                            Star& star,
	                            const Universe& universe,
	                            double distance)
	{
	    overlay << _("Distance: ");
	    displayDistance(overlay, distance);
	    overlay << '\n';
変更後
	static void displayStarInfo(Overlay& overlay,
	                            int detail,
	                            Star& star,
	                            const Universe& universe,
	                            double distance,
	                            double distanceFromSol)
	{
	    overlay << _("Distance: ");
	    displayDistance(overlay, distance);

	    if (star.getCatalogNumber() != 0)
	    {
	        overlay << (" (from Sol :");
	        displayDistance(overlay, distanceFromSol);
	        overlay << ")";
	    }

	    overlay << '\n';

2800行目付近
以下の赤文字部分を追加
変更前

	static void displayDSOinfo(Overlay& overlay, const DeepSkyObject& dso, double distance)
	{
	    char descBuf[128];

	    dso.getDescription(descBuf, sizeof(descBuf));
	    overlay << descBuf << '\n';
	    if (distance >= 0)
	    {
	    	overlay << _("Distance: ");
	    	displayDistance(overlay, distance);
	    }
	    else
	    {
	        overlay << _("Distance from center: ");
	        displayDistance(overlay, distance + dso.getRadius());
	     }   	
	    overlay << '\n';
	    overlay << _("Radius: ");
	    displayDistance(overlay, dso.getRadius());
	    overlay << '\n';
変更後
	static void displayDSOinfo(Overlay& overlay, const DeepSkyObject& dso, double distance, double distanceFromSol)
	{
	    char descBuf[128];

	    dso.getDescription(descBuf, sizeof(descBuf));
	    overlay << descBuf << '\n';
	    if (distance >= 0)
	    {
	    	overlay << _("Distance: ");
	    	displayDistance(overlay, distance);
	    }
	    else
	    {
	        overlay << _("Distance from center: ");
	        displayDistance(overlay, distance + dso.getRadius());
	     }
	    overlay << " (from Sol: ";
	    displayDistance(overlay, distanceFromSol);
	    overlay << ")";

	    overlay << '\n';
	    overlay << _("Radius: ");
	    displayDistance(overlay, dso.getRadius());
	    overlay << '\n';

2831行目付近
以下の赤文字部分を追加
変更前

	static void displayPlanetInfo(Overlay& overlay,
	                              int detail,
	                              Body& body,
	                              double t,
	                              double distance,
	                              Vec3d viewVec)
	{
	    double kmDistance = astro::lightYearsToKilometers(distance);

	    overlay << _("Distance: ");
	    distance = astro::kilometersToLightYears(kmDistance - body.getRadius());
	    displayDistance(overlay, distance);
	    overlay << '\n';
変更後
	static void displayPlanetInfo(Overlay& overlay,
	                              int detail,
	                              Body& body,
	                              double t,
	                              double distance,
	                              double distanceFromParent,
	                              string parentName,
	                              Vec3d viewVec)
	{
	    double kmDistance = astro::lightYearsToKilometers(distance);

	    overlay << _("Distance: ");
	    distance = astro::kilometersToLightYears(kmDistance - body.getRadius());
	    displayDistance(overlay, distance);
		
	    overlay << (" (from ") << parentName << (": ");
	    displayDistance(overlay, distanceFromParent);
	    overlay << ")";
			
	    overlay << '\n';

3248行目付近
以下の赤文字部分を追加
変更前

    // Selection info
    Selection sel = sim->getSelection();
    if (!sel.empty() && hudDetail > 0)
    {
        glPushMatrix();
        glColor4f(0.7f, 0.7f, 1.0f, 1.0f);
        glTranslatef(0.0f, (float) (height - titleFont->getHeight()), 0.0f);

        overlay->beginText();
        Vec3d v = sel.getPosition(sim->getTime()) -
            sim->getObserver().getPosition();
        switch (sel.getType())
        {
        case Selection::Type_Star:
            {
                if (sel != lastSelection)
                {
                    lastSelection = sel;
                    selectionNames = sim->getUniverse()->getStarCatalog()->getStarNameList(*sel.star());
                }

                overlay->setFont(titleFont);
                *overlay << selectionNames;
                overlay->setFont(font);
                *overlay << '\n';
                displayStarInfo(*overlay,
                                hudDetail,
                                *(sel.star()),
                                *(sim->getUniverse()),
                                v.length() * 1e-6);
            }
            break;
変更後
    // Selection info
    Selection sel = sim->getSelection();
    if (!sel.empty() && hudDetail > 0)
    {
        glPushMatrix();
        glColor4f(0.7f, 0.7f, 1.0f, 1.0f);
        glTranslatef(0.0f, (float) (height - titleFont->getHeight()), 0.0f);

        overlay->beginText();
        Vec3d v = sel.getPosition(sim->getTime()) -
            sim->getObserver().getPosition();
        switch (sel.getType())
        {
        case Selection::Type_Star:
            {
                if (sel != lastSelection)
                {
                    lastSelection = sel;
                    selectionNames = sim->getUniverse()->getStarCatalog()->getStarNameList(*sel.star());
                }

                Selection selsol = sim->getUniverse()->getStarCatalog()->find(0);
                Vec3d vFromSol = selsol.getPosition(sim->getTime()) -
                    sel.getPosition(sim->getTime());

                overlay->setFont(titleFont);
                *overlay << selectionNames;
                overlay->setFont(font);
                *overlay << '\n';
                displayStarInfo(*overlay,
                                hudDetail,
                                *(sel.star()),
                                *(sim->getUniverse()),
                                v.length() * 1e-6,
                                vFromSol.length() * 1e-6);
            }
            break;

3281行目付近
以下の赤文字部分を追加
変更前

        case Selection::Type_DeepSky:
            {
                if (sel != lastSelection)
                {
                    lastSelection = sel;
                    selectionNames = sim->getUniverse()->getDSOCatalog()->getDSONameList(sel.deepsky());
                }

                overlay->setFont(titleFont);
                *overlay << selectionNames;
                overlay->setFont(font);
                *overlay << '\n';
                displayDSOinfo(*overlay, *sel.deepsky(),
                               v.length() * 1e-6 - sel.deepsky()->getRadius());
            }
            break;
変更後
        case Selection::Type_DeepSky:
            {
                if (sel != lastSelection)
                {
                    lastSelection = sel;
                    selectionNames = sim->getUniverse()->getDSOCatalog()->getDSONameList(sel.deepsky());
                }

                Selection selsol = sim->getUniverse()->getStarCatalog()->find(0);
                Vec3d vFromSol = selsol.getPosition(sim->getTime()) -
                    sel.getPosition(sim->getTime());

                overlay->setFont(titleFont);
                *overlay << selectionNames;
                overlay->setFont(font);
                *overlay << '\n';
                displayDSOinfo(*overlay, *sel.deepsky(),
                               v.length() * 1e-6 - sel.deepsky()->getRadius(),
                               abs(vFromSol.length() * 1e-6 - sel.deepsky()->getRadius()));
            }
            break;

3298行目付近
以下の赤文字部分を追加
変更前

        case Selection::Type_Body:
            {
                overlay->setFont(titleFont);
                *overlay << sel.body()->getName(true).c_str();
                overlay->setFont(font);
                *overlay << '\n';
                displayPlanetInfo(*overlay,
                                  hudDetail,
                                  *(sel.body()),
                                  sim->getTime(),
                                  v.length() * 1e-6,
                                  v * astro::microLightYearsToKilometers(1.0));
            }
            break;
変更後
        case Selection::Type_Body:
            {
                Selection selParent = sim->getSelection().parent();

                Vec3d vFromParent = selParent.getPosition(sim->getTime()) -
                    sel.getPosition(sim->getTime());                
                string parentName = "";
                double distanceFromSol;
                double kmDistance = astro::lightYearsToKilometers(vFromParent.length() * 1e-6);;

                switch (selParent.getType())
                {
                case Selection::Type_Body:
                    parentName = selParent.body()->getName(true).c_str();
                    distanceFromSol = astro::kilometersToLightYears(kmDistance - selParent.body()->getRadius());
                    break;
                case Selection::Type_Star:
                    parentName = sim->getUniverse()->getStarCatalog()->getStarName(*selParent.star());
                    distanceFromSol = vFromParent.length() * 1e-6;
                    break;
                default:
                    break;
                }

                overlay->setFont(titleFont);
                *overlay << sel.body()->getName(true).c_str();
                overlay->setFont(font);
                *overlay << '\n';
                displayPlanetInfo(*overlay,
                                  hudDetail,
                                  *(sel.body()),
                                  sim->getTime(),
                                  v.length() * 1e-6,
                                  distanceFromSol,
                                  parentName,
                                  v * astro::microLightYearsToKilometers(1.0));
            }
            break;

これらの変更を加えた後、保存してコンパイルします。
トップページ > 機能追加 > 選択した天体の太陽/母天体からの距離を表示