Librerie C

Le seguenti librerie sono state sviluppate dal sottoscritto per risolvere problemi di realizzazione dei programmi qui di seguito illustrati, sono quindi concesse in uso a chiunque volesse utilizzarle per i propri programmi, con l’unica indicazione che non possono essere vendute separatamente o all’interno di programmi di tipo commerciale. Si richiede inoltre che appaia il loro autore all’interno del software con esse sviluppato e comunque di comunicare all’autore il loro utilizzo al fine di essere informati sui successivi aggiornamenti e sviluppi. Grazie e Buon Lavoro.

ELENCO LIBRERIE:

* MieMath Lib: Librerie sviluppate in linguaggio C che utilizzo in qualsiasi tipo di programma. Sono piccole funzioni ed utility di tipo matematico.
* SunDial Lib: Librerie sviluppate in linguaggio C (matematiche, ed astronomiche) utilizzate per la realizzazione del programma SunDial Pro. Fanno uso di MieMath.
* Matrix Lib: Librerie sviluppate in linguaggio C che servono per risolvere problemi di matematica delle matrici.
* Alpha Lib: Librerie sviluppate in linguaggio C utilizzate per la realizzazione di AlphaSimulation. Fanno uso di MieMath e Matrix.
* 3DFun Lib: Librerie sviluppate in linguaggio C per sviluppare problemi di grafica tridimensionale. Fanno uso di MieMath e Matrix.

 

FILE: Miemath.c
INCLUDE: Miemath.h
 
Download: Miemath.zip
 

DEFINIZIONI:
TRUE 1
FALSE 0
OK 0
NOK -1
IS ==
ISNOT !
NOT !
OR ||
AND &&
COSTANTI: pi
VARIABILI: Angmax, Velmax

DESCRIZIONE e LISTA

GtoR ->Routine di conversione da Gradi a Radianti
double GtoR (double gradi);

RtoG ->Routine di conversione da Radianti a Gradi
double RtoG (double radianti);

GtoH ->Routine di conversione da Gradi in Ore
double GtoH (double gradi);

HtoG ->Routine di conversione da Ore in Gradi
double HtoG (double ore);

DECtoGRAD ->Conversione da gg.dddddd° -> gg° mm’ ss”
int DECtoGRAD (double gradi, int *gg,int *mm,int *ss);

GRADtoDEC ->conversione da ggø mm’ ss”-> gg.ddddddø
double GRADtoDEC (int gg,int mm, int ss);

IMin ->Restituisce il minore fra 2 valori interi
int IMin (int val1, int val2);

IMax ->Restituisce il maggiore fra 2 valori interi
int IMax (int val1, int val2);

Dmin ->Restituisce il minore fra 2 valori double
double DMin (double val1, double val2);

Dmax ->Restituisce il maggiore fra 2 valori double
double DMax (double val1, double val2);

Trunc ->Restituisce la parte intera di un double
double Trunc(double val);

Round ->Restituisce l’orrotondamento di un double a un long int
long Round(double val);

Sign ->Restituisce il segno di un double
int Sign(double val);

Cube ->Restituisce il cubo di un double
double Cube (double arg);

Power ->Routile elevamento a potenza val^pwr
double Power(double val, double pwr);

Modulus ->Restituisce un numero compreso fra 0 e 360 o 0 e piGreco (Tipo Riduci)
double Modulus(double arg1,double arg2);

Fmod2p ->Restituisce un numero compreso fra 0 e piGreco (Tipo Riduci ma con radianti)
double Fmod2p(double arg);

Riduci ->Routile di riduzione dell’ angolo ad uno compreso fra -360 e 360 gradi
double Riduci (register double gradi);

cambia_quadr ->Restituisce l’angolo nel giusto quadrante in gradi
double cambia_quadr(double a,double a1,double a2);

AcTan ->Restituisce la tangente di un angolo nel giusto quadrante senza problemi di infiniti
double AcTan(double sinx,double cosx);

rotate -> Routile di rotazione degli assi 2D
void rotate (double *x,double *y,double *angle);

TraXY ->Routine di TRASLAZIONE degli assi x,y
void TraXY (double *OldX,double *OldY,double TraslaX,double TraslaY);

clipping ->Routile di Clipping o taglio di una retta per mostrarne o prenderne in considerazione solo la parte contenuta all’interno di un riquadro
NB le funzioni: Code, ClipDX,ClipSX,ClipTOP,ClipBOT sono di supporto
int Code (double *x,double *y,double *Minx,double *Maxx,double *Miny,double *Maxy);
double ClipDX(double *Maxx,double *x,double *y,double *x0,double *y0);
double ClipSX(double *Minx,double *x,double *y,double *x0,double *y0);
double ClipTOP(double *Maxy,double *x,double *y,double *x0,double *y0);
double ClipBOT(double *Miny,double *x,double *y,double *x0,double *y0);
int clipping (double *x1,double *y1,double *x2,double *y2,double *Minx,double *Maxx,double *Miny,double *Maxy);

stat ->Routile che restituisce le possibilita’ che si verifichi una situazione anziche un altra.NB Leggersi Bene il commento alla funzione
int stat(int ran,int stat[]);

AngPerturbation ->Generatore casuale di 3 angoli all’interno dell’intervallo specificato. L’angolo max di variazione attorno a ciascun valore definito da CHI,TETA,FI Vale + o – Angmax (gradi), mentre la velocita’ max di variazione vale Velmax (gradi); Dt=intervallo di tempo nel quale vengono fatte le misure
void AngPerturbation(float Dt,float *CHI,float *TETA,float *FI);

Intersez ->Restituisce il punto di intersezione fra 2 rette, inoltre se 3 e 4 e’ il lato opposto di un triangolo con vertice 1 restituisce TRUE se il punto 2 e’ all’interno del triangolo 134, FALSE se No
int Intersez(float x1,float y1,float x2,float y2,float x3,float y3, float x4,float y4,float *xi, float *yi);

AngTwoLine ->Restituisce l’angolo fra due rette con origine comune Pt
double AngTwoLine(float Pt[3],float Pt1[3],float Pt2[3]);

LUNG ->Funzione per calcolare la lunghezza di un arco di una conica generica y=f(x) espressa in coordinate polariVAR.PASSATE : alfa,beta,gamma=(double) parametri della conica
CERCHIO : alfa=1 beta=1 gamma=-2*Raggio (concava) + (convessa)
ELLISSE : alfa=Semiasseminore^2 beta=Semiassemaggiore^2
gamma=-2*Semiasseminore*Semiassemaggiore^2 (concava) + (convessa)
IPERBOLE: alfa=-Semiasseminore^2 beta=Semiassemaggiore^2
gamma=-2*Semiassemaggiore^2 (concava) + (convessa)
PARABOLA: alfa=1/(2*Fuoco) beta=0 gamma=-1 (concava) + (convessa)
double LUNG(alfa,beta,gamma,Xini,Xfin,DELTA);

 

FILE: Miesun.c
INCLUDE: Miesun.h
(Attenzione! Utilizzano anche Miemath.h)

Download: Miesun.zip

 
VARIABILI:
DSun declinazione del sole in radianti
latitud; latitudine in gradi
longitud; longitudine in gradi
FusoOrario; Fuso Orario (italia -1) in ore
ET; Equazione del tempo in minuti
alfa; Ascensione Retta del Sole
DSun; Declinazione del Sole
HOrario; Angolo Orario del Sole

DESCRIZIONE e LISTA

JD ->restituisce il giorno giuliano
double JD (double dat,double mese,double giorno);

jtog -> Routile di calcolo di anno, mese, giorno, ora, minuti noto il giorno giuliano
void jtog(double jd,int *m,int *g,int *h,int *mi);

sortra ->Routile di CALCOLO DELL’ ORA DEL SORGERE E DEL TRAMONTO:Valori inseriti nelle variabili sorge, tramonta
void sortra(float Year,float Month,float Day,float *sorge,float *tramonta);

calcola_posizione_sole -> Calcolo delle coordinate del sole e dell’Equazione del tempo del sole in un determinato istante
FUNZIONI DI SUPPORTO: CalcT, LongMed, AnoMed, Centro, CalcOmega, LongApp, CalcObli, Eccentric, CalcSidTime, ConvHO
void calcola_posizione_sole(register double jday,double ora,int f_ET);

double CalcT (double jday);
double LongMed (register double T);
double AnoMed (register double T);
double Eccentric (register double T);
double Centro (register double AM,register double T);
double CalcOmega (register double T);
double LongApp (register double LVs, register double omega);
double CalcObli (register double omega, register double T);
void ConvHO(double ora);

CalcSidTime -> Calcolo dl tempo siderale per l’ora desiderata
double CalcSidTime (register double T, double ora);

 

FILE: Matrix.c
INCLUDE: Matrix.h

 

Download: Matrix.zip

 

DESCRIZIONE e LISTA
Descrizione: matrix mathematics header file
by: ko shu pui, patrick
date: 24 nov 91 v0.1b
revi: 24 lug 97 v0.2 by Diego Bonata
ref:

[1] Mary L.Boas, “Mathematical Methods in the Physical Sciene,”
John Wiley & Sons, 2nd Ed., 1983. Chap 3.
[2] Kendall E.Atkinson, “An Introduction to Numberical Analysis,”
John Wiley & Sons, 1978.

mat_creat -> crea una matrice (alloca spazio in memoria)
MATRIX mat_creat( row, col, type );

mat_free -> libera o spazio di memoria occupato
int mat_free(MATRIX A);

mat_copy -> duplica una matrice
MATRIX mat_copy(MATRIX A);

mat_error -> restituisce un messagio d’errore se viene commesso un errore
MATRIX mat_error(int errno);

mat_lsolve -> Risolve un sistema di equazioni lineari con il metodo delle matrici (quadrate)
MATRIX mat_lsolve(MATRIX a,MATRIX b);

mat_tran -> restituisce la trasposta di una matrice
MATRIX mat_tran( A );

 

FILE: Satmath.c
INCLUDE: Satmath.h
(Utilizza anche MATRIX.H & MIEMATH.H)

 

Download: AlphaLib.zip

 

VARIABILI:
Solar_Pos,RadialSun,ARSun,DECSun;

DESCRIZIONE e LISTA:

SGP ->Procedura generale che seleziona da sola il modello fra SGP4 e SDP4
void SGP (double time, MATRIX Pos, MATRIX Vel);

SGP4 ->Modello SGP4 Per satelli tipo Near Earth
void SGP4(double tsince,int *iflag, MATRIX Pos, MATRIX Vel);

SDP4 ->Modello SDP4 Per satelli tipo Deep Space Orbit
void SDP4(double tsince,int *iflag, MATRIX Pos, MATRIX Vel);

Calculate_User_PosVel ->Date le Coord. Latitudine,Longitudine,Altitudine calcola le coord.ECI
void Calculate_User_PosVel(MATRIX geodetic, double time, MATRIX obs_pos, MATRIX obs_vel);

Calculate_LatLonAlt ->Date le Coord.ECI Calcola Latitudine,Longitudine,Altitudine
void Calculate_LatLonAlt(MATRIX pos, double time, MATRIX geodetic);

Calculate_Obs ->Date le Coord.ECI Calcola Azimut e Altezza sull’Orizzonte
ATTENZIONE: la longitudine va passata non con Est(+) Ovest(-) come normale ma viceversa (Log. contenuta in geodetic[2][0])
void Calculate_Obs(MATRIX pos,MATRIX vel,MATRIX geodetic,double time,MATRIX obs_set);

Calculate_RADec ->Date le Coord.ECI Calcola Ascensione Retta e Declinazione
ATTENZIONE: la longitudine va passata non con Est(+) Ovest(-) come normale ma viceversa (Log. contenuta in geodetic[2][0])
void Calculate_RADec(MATRIX pos,MATRIX vel,MATRIX geodetic,double time,MATRIX obs_set);

Calendar_Date ->Preleva jd e restituisce la stringa contenente ANNO/MESE/GIORNO
void Calendar_Date(double jd,date data);

Time_of_Day ->Preleva da jd l’ora e restituisce nel formato (Stringa) HH:MM:SS (se full=1) oppure nel formato (Stringa) HHMMSS…(se full=0)
void Time_of_Day(double jd,unsigned int full,clock_time ora);

Julian_Date_of_Year ->Restituisce il giorno giuliano dell’anno
double Julian_Date_of_Year(double year);

Julian_Date_of_Epoch ->Restituisce il giorno giuliano dell’anno
double Julian_Date_of_Epoch(double epoch);

Delta_ET ->Restituisce l’equazione del tempo
double Delta_ET(double year);

Fraction_of_Day ->Restituisce la frazione di giorno decimale
double Fraction_of_Day(unsigned int hr,unsigned int mi, unsigned int se,unsigned int hu);

Eclipse_Sat1_Sat2 ->Visibilita’ di un satellite SAT1=Osservatore del satellite SAT2=Osservato (verifica che l’obbiettivo non sia occultato dalla terra. Vale anche per due oggetti generici di coordinate ECI di cui almeno l’obbiettivo si trova nello spazio)
void Eclipse_Sat1_Sat2(MATRIX Sat1, MATRIX Sat2);

Eclipse_Sat_Star ->Visibilita’ di una stella SAT1=Osservatore SAT2=Stella (vale anche per due oggetti generici di cui uno si trova all’infinito il primo ha coordinate ECI mentre l’obbiettivo Ascensione Retta e declinazione)
Eclipse_Sat_Star(MATRIX Sat1, MATRIX Sat2);

Eclipse_Sat_Sun ->Visibilita’ di un satellite SAT1=Osservatore SAT2=Sun
void Eclipse_Sat_Sun(MATRIX Sat1);

Cal_Solar_Pos ->Calcola La posizione del Sole in ECI che inserisco in Solar_Pos e RadialSun
void Cal_Solar_Pos(double time,MATRIX Solar_Vector);

FUNZIONI STRINGA

FILE: Satwrite.c
INCLUDE: Satwrite.h

DESCRIZIONE e LISTA:

Copy-> Copia da ini per cont caratteri la stringa str[] in *s
void Copy(char str[],int ini,int cont,char *s);

Integer_Value-> Restituisce un int della stringa buffer[] partendo da start per lenght caratteri
int Integer_Value(char buffer[],int start,int length);

Real_Value ->Restituisce un double della stringa buffer[] partendo da start per lenght caratteri
double Real_Value(char buffer[],int start,int length);

ThreeDigit ->Converte numeri <999
void ThreeDigit(int arg, char *string);

TwoDigit-> Converte numeri <99
void TwoDigit(int arg,char *string);

Str ->copia il double in una stringa, con totn car(prima della virgola) e dec caratteri (dopo la virgola) il tutto va nella stringa str
void Str(double num, int totn, int dec,char str[]);

Convert_Satellite_Data -> Converte I dati del Sat da formato 2LE a quelli usabili
void Convert_Satellite_Data(int arg);

Convert_Sat_State1 ->Converte lo stato dei dati calcolati
void Convert_Sat_State1(MATRIX Pos,MATRIX Vel);

 

INCLUDE: 3DFUN.H
(Utilizza anche MIEMATH.H)
NOTE: (usare i modelli di compilazione LARGE, HUGE)

 

Download: 3Dfun.zip

DESCRIZIONE e LISTA:

Memor ->Aggiunge (non crea) un elemento (bisogna infatti mallocarlo prima)
void Memor(struct Elements *punt,int Caso);

Cancel ->Toglie (non cancella) un elemento (bisogna infatti freearlo poi)
struct Elements *Cancel(struct Elements *Prec,struct Elements *Canc,struct Elements *Cima);

Reset ->Resetta elemento (pone tutti i suoi valori a 0)
void Reset(struct Elements *punt);

clipping ->portabile algoritmo di clipping sia 2D che a 3D
int clipping (float *x1,float *y1,float *x2,float *y2, float *Minx,float *Maxx,float *Miny,float *Maxy);

int Code (float *x,float *y,float *Minx,float *Maxx,float *Miny,float *Maxy);
double ClipDX(register float *Maxx,register float *x,register float *y,register float *x0,register float *y0);
double ClipSX(register float *Minx,register float *x,register float *y, register float *x0,register float *y0);
double ClipTOP(register float *Maxy,register float *x,register float *y, Register float *x0,register float *y0);
double ClipBOT(register float *Miny,register float *x,register float *y,register float *x0,register float *y0);

ROTXYZ ->Portabile rotazione degli assi
void ROTXYZ (float X,float Y,float Z,float *XT,float *YT,float *ZT);

TRAXYZ ->Traslazione assi in 3D
void TRAXYZ (float *OldX,float *OldY,float *OldZ,float TraslaX,float TraslaY,float TraslaZ);

Point3D ->Portabile traccia un p.to in 3D in una finestra
int Point3D (float xyz[],float XC,float YC,int color);

OText3D ->Portabile inserisce un testo relativo ad un p.to in 3D in una finestra
int OText3D (float xyz[],float XC,float YC,int color,char str[]);

Circle3D ->Portabile Tracciamento di un Cerchio in 3D
int Circle3D (float xyz[],float rad,float XC,float YC,int color,int Stato);

Line3D ->Portabile traccia una retta in 3D in una finestra
int Line3D (float xyz1[],float xyz2[],float XC,float YC,int color);

Sfera3D ->Tracciamento di una sfera in 3D
int Sfera3D(float Centro[],float Ray,int Lon,int Lat,float XC,float YC,int color,int Stato);

POLtoXYZ ->Conversione da Coord.Polari->Coord.Cartesiane
void POLtoXYZ (float Lon,float Lat,float Dis,float *x,float *y,float *z);

XYZtoPOL ->Conversione da Coord.Cartesiane->Coord.Polari
void XYZtoPOL (float x,float y,float z,float *Lon,float *Lat,float *Dis);

Dist3D ->Distanza 2 p.ti nello spazio
float Dist3D (float x1,float y1,float z1,float x,float y,float z);

NDefPian ->Definizione di un piano in 3D
int NDefPian(CUBE *Elem,float LarLunAlt[3],float Centro[3]);

NPiano3D ->Tracciamento di un piano in 3D
int NPiano3D(CUBE *Elem,float XC,float YC,int color);

NDefCub ->Definizione di un parallelogramma in 3D
void NDefCub(CUBE *Elem,float LarLunAlt[3],float Centro[3]);

NCubo3D ->Tracciamento di un parallelepipedo in 3D
int NCubo3D(CUBE *Elem,float XC,float YC,int color,int Stato);

Cilindro3D ->Tracciamento di un cilindro in 3D
int Cilindro3D(float Lung[3],float Centro[3],float RayP,float RayM,float XC,float YC,int Bord,int color,int Stato);