Calcul de la position du soleil (déclinaison, angle horaire, altitude et azimut) : altaz solaire

Contenu du snippet

Salut,

il s'agit d'un code qui peut vous aider si vous aimez l'astronomie et plus particulièrement le soleil.
Il permet de connaître à la seconde près la position du soleil.
Je vous laisse essayer.
Il a été fait sous Borland C++builder6.

A+!

Source / Exemple :


//-----------------------------bibliothèques------------------------------------
//------------------------------------------------------------------------------

#include <iostream.h>
#include <conio.h>
#include <math.h>
#include <iomanip>
#include <windows.h>

//-----------------------------déclaration--------------------------------------
//------------------------------------------------------------------------------

const HANDLE MaConsoleEcran=GetStdHandle(STD_OUTPUT_HANDLE);

//-----------------------------fonction d'attente-------------------------------
//------------------------------------------------------------------------------

void wait(long sec)
{
    long start, courante;
    time(&start) ;
    time(&courante) ;

    while((courante-start)<sec)
    {
        time(&courante) ;
    }
}

//-----------------------------calcul du jour julien----------------------------
//------------------------------------------------------------------------------

long double calcul_jour_julien(long double jour, long double mois, long double annee, long double heure, long double minute, long double seconde)
{
        long double month, year, day, a, b, jour_julien;

        day=jour+heure/24.0+minute/1440.0+seconde/86400.0;
        year=annee;
        month=mois;

        if(month==1 || month==2)
        {
                year=year-1.0;
                month=month+12.0;
        }

        a=int(year/100.0);
        b=2-a+int(a/4.0);

        jour_julien=int(365.25*(year+4716.0))+int(30.6001*(month+1.0))+day+b-1524.5;
        return jour_julien;
}

int texte;
int fond;

void CouleurTexte( int CouleurTexte )
{
	texte = CouleurTexte;
	SetConsoleTextAttribute (MaConsoleEcran, texte | fond);
}

void CouleurFond(int CouleurFond)
{

	fond = CouleurFond << 4 ;

	SetConsoleTextAttribute (MaConsoleEcran, texte | fond);
}

void AfficherCurseur(int mode)
{
 	CONSOLE_CURSOR_INFO curseur;

	GetConsoleCursorInfo(MaConsoleEcran, &curseur);

		if (mode == TRUE)
		curseur.bVisible = TRUE;
		else
		curseur.bVisible = FALSE;

	SetConsoleCursorInfo(MaConsoleEcran, &curseur);
}

void EffaceEcran()
{
	CONSOLE_SCREEN_BUFFER_INFO MesInfosEcran;

	if (GetConsoleScreenBufferInfo (MaConsoleEcran, &MesInfosEcran))

	{
		COORD origine = { 0, 0 };

		DWORD nbCaractEcrit;

		DWORD taille = MesInfosEcran.dwSize.X * MesInfosEcran.dwSize.Y;

		FillConsoleOutputCharacter (MaConsoleEcran, ' ', taille, origine, &nbCaractEcrit);

		FillConsoleOutputAttribute (MaConsoleEcran, MesInfosEcran.wAttributes, taille, origine, &nbCaractEcrit);

		SetConsoleCursorPosition    (MaConsoleEcran, origine);
          }
}

//-----------------------------programme principal------------------------------
//------------------------------------------------------------------------------

main()
{
SYSTEMTIME    si;
long double sd, jour2, mois2, heure2, minute2, annee2, seconde2, correction_heure;
long double jour_nouveau, g, q, l, e, ascension_droite, declinaison, heure_siderale1, heure_siderale2, nb_siecle;
long double latitude, longitude, angle, angleT, angleH, angle_horaire, altitude, azimut, sinazimut;

CouleurFond(FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
EffaceEcran();
AfficherCurseur(0);

//-----------------------------en-tête de la fenêtre----------------------------
//------------------------------------------------------------------------------

COORD         dwTaille = {80, 25};
HANDLE        hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

SetConsoleScreenBufferSize(hConsole, dwTaille);
SetConsoleTitle("AltAz Solaire - version 2                                                                            ------ --------");

//-----------------------------avertissement------------------------------------
//------------------------------------------------------------------------------

CouleurTexte(FOREGROUND_RED | FOREGROUND_INTENSITY);
cout<<" Attention! Vous ne pourrez plus me contacter pour avoir des infos sur les calculs."<<endl;
cout<<" Merci d'avoir choisi AltAz Solaire !"<<endl;
cout<<"----------------------------------------------------------------------------------------------------------------------------------------------------------------"<<endl;

//-----------------------------coordonnées du lieu d'observation----------------
//------------------------------------------------------------------------------

CouleurTexte(FOREGROUND_RED |FOREGROUND_BLUE);
cout<<"                                                                               "<<endl;
cout<<"Entrez la latitude du lieu d'observation (positive vers le Nord):      ";
cin>>latitude; //42.93627 ° N pour la LJR
cout<<"Entrez sa longitude (positive vers l'Est)                       :       ";
cin>>longitude; //0.14291 ° E pour la LJR

//-----------------------------heure d'hiver ou d'été---------------------------
//------------------------------------------------------------------------------

correction_heure=0;
while(correction_heure!=1 && correction_heure!=2)
{
        CouleurTexte(FOREGROUND_GREEN);
        cout<<"                                                                               "<<endl;
        cout<<"Tapez 1 si vous etes a l'heure d'hiver, et 2 si vous etes a l'heure d'ete :   ";
        cin>>correction_heure;
}

//-----------------------------boucle de calculs--------------------------------
//------------------------------------------------------------------------------

while(1)
{

 GetLocalTime(&si);
  jour2 = si.wDay;
  mois2 = si.wMonth;
  annee2 = si.wYear;
  heure2 = si.wHour;
  minute2 = si.wMinute;
  seconde2 = si.wSecond;

//-----------------------------affichages date et heure-------------------------
//------------------------------------------------------------------------------

CouleurFond(FOREGROUND_BLUE);
EffaceEcran();
AfficherCurseur(0);
CouleurTexte(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
cout<<"Date                                     : "<<int(jour2)<<" "<<int(mois2)<<" "<<int(annee2)<<endl;
cout<<"Heure                                    : "<<int(heure2)<<":";
if(minute2<10) cout<<"0";
cout<<int(minute2)<<":";
if(seconde2<10) cout<<"0";
cout<<int(seconde2)<<endl<<endl<<endl;

//-----------------------------affichages jour julien et jour julien nouveau----
//------------------------------------------------------------------------------

CouleurTexte(FOREGROUND_GREEN | FOREGROUND_INTENSITY);
cout<<"Jour julien                              : "<<setiosflags(std::ios::fixed)<<calcul_jour_julien(jour2, mois2, annee2, heure2, minute2, seconde2)-correction_heure/24.0<<endl;
jour_nouveau=calcul_jour_julien(jour2, mois2, annee2, heure2, minute2, seconde2)-correction_heure/24.0-2451545.0;
cout<<"Jour julien nouveau                      : "<<jour_nouveau<<endl<<endl<<endl;

//-------------calculs et affichages ascension droite et délinaison-------------
//------------------------------------------------------------------------------

g=357.529+0.98560028*jour_nouveau;
q=280.459+0.98564736*jour_nouveau;
l=q+1.915*sin(g*M_PI/180.0)+0.020*sin(2*g*M_PI/180.0);
e=23.439-0.00000036*jour_nouveau;

ascension_droite=atan(cos(e*M_PI/180.0)*sin(l*M_PI/180.0)/cos(l*M_PI/180.0))*(180.0/M_PI)/15.0;
if(cos(l*M_PI/180.0)<0)
{
        ascension_droite=12.0+ascension_droite;
}
if(cos(l*M_PI/180.0)>0 && sin(l*M_PI/180.0)<0)
{
        ascension_droite=ascension_droite+24.0;
}

CouleurTexte(FOREGROUND_RED | FOREGROUND_INTENSITY);
cout<<"Ascension droite                         : "<<ascension_droite<<" h"<<endl;
cout<<"                                        ou "<<int(ascension_droite)<<" h "<<int((ascension_droite-int(ascension_droite))*60)<<" min "<<((ascension_droite-int(ascension_droite))*60-int((ascension_droite-int(ascension_droite))*60))*60<<" s"<<endl<<endl;

declinaison=asin(sin(e*M_PI/180.0)*sin(l*M_PI/180.0))*180.0/M_PI;
cout<<"Declinaison                              : "<<declinaison<<" deg"<<endl;
cout<<"                                        ou "<<int(declinaison)<<" deg "<<int((declinaison-int(declinaison))*60)<<" min "<<((declinaison-int(declinaison))*60-int((declinaison-int(declinaison))*60))*60<<" s"<<endl<<endl<<endl;

//-----------------------------calculs heure sidérale et angle horaire----------
//------------------------------------------------------------------------------

nb_siecle=jour_nouveau/36525.0;
heure_siderale1=(24110.54841+(8640184.812866*nb_siecle)+(0.093104*(nb_siecle*nb_siecle))-(0.0000062*(nb_siecle*nb_siecle*nb_siecle)))/3600.0;
heure_siderale2=((heure_siderale1/24.0)-int(heure_siderale1/24.0))*24.0;

angleH=360.0*heure_siderale2/23.9344;
angleT=(heure2-correction_heure-12.0+minute2/60.0+seconde2/3600.0)*360.0/23.9344;
angle=angleT+angleH;

angle_horaire=angle-ascension_droite*15.0+longitude;

//-------------calculs et affichages altitude et azimut-------------------------
//------------------------------------------------------------------------------

altitude=asin(sin(declinaison*M_PI/180.0)*sin(latitude*M_PI/180.0)-cos(declinaison*M_PI/180.0)*cos(latitude*M_PI/180.0)*cos(angle_horaire*M_PI/180.0))*180.0/M_PI;

CouleurTexte(FOREGROUND_BLUE | FOREGROUND_GREEN  | FOREGROUND_RED | FOREGROUND_INTENSITY);
cout<<"Altitude                                 : "<<altitude<<" deg"<<endl;
cout<<"                                        ou "<<int(altitude)<<" deg "<<int((altitude-int(altitude))*60)<<" min "<<int(((altitude-int(altitude))*60-int((altitude-int(altitude))*60))*60)<<" s"<<endl<<endl;

azimut=acos((sin(declinaison*M_PI/180.0)-sin(latitude*M_PI/180.0)*sin(altitude*M_PI/180.0))/(cos(latitude*M_PI/180.0)*cos(altitude*M_PI/180.0)))*180.0/M_PI;
sinazimut=(cos(declinaison*M_PI/180.0)*sin(angle_horaire*M_PI/180.0))/cos(altitude*M_PI/180.0);
if(sinazimut<0)
        {
        azimut=360-azimut;
        }

cout<<"Azimut                                   : "<<azimut<<" deg"<<endl;
cout<<"                                        ou "<<int(azimut)<<" deg "<<int((azimut-int(azimut))*60)<<" min "<<int(((azimut-int(azimut))*60-int((azimut-int(azimut))*60))*60)<<" s"<<endl<<endl;

wait(1);

}

}

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.