/****************************************************************/ /* */ /* FILE: qsvd.c */ /* */ /* OROLOGIO SOLARE VERTICALE DECLINANTE */ /* Stefano Iacus */ /* versione 1.0 (16.Feb.94) */ /* Traduzione C dalla versione originale scritta in GWBASIC da: */ /* Alberto Cintio, A.P. per "l'Astronomia", n.110, Media Presse */ /* */ /* NB: i nomi delle variabili sono rimasti inalterati rispetto */ /* a quelli utilizzati nel programma orginale. */ /* */ /* Opzioni di compilazione e linking del sorgente: */ /* */ /* Amiga -> Sas C 6.51 : sc qsvd.c math=stadard link */ /* MS-DOS -> BC++ 3.1 : come da default */ /* -> Turbo C 1.5 : come da default */ /* UNIX -> AIX 3.2.5 RISC : cc -o qsvd qsvd.c -lm */ /* -> SCO UNIX 3.2.4 : cc -o qsvd qsvd.c -lm */ /* -> B.O.S. DPX/2 : cc -o qsvd -O -V qsvd.c */ /* Macintosh -> Think C 5.04 : linkare con librerie ANSI */ /* */ /* */ /* Ringraziamenti per il test sotto i vari sistemi operativi a: */ /* */ /* MS-DOS -> Antonio Pennino, Paolo Ciraci */ /* Macintosh -> Alberto Ripanucci, Stefano Carlotto */ /* UNIX -> Paolo Cecchini, Riccardo Orfei */ /* */ /* N.B.:E` possibile modificare il programma purche` se ne citi */ /* la stesura C originale. Si prega di segnalare ogni bug */ /* trovato o modifica effettuata all'autore: */ /* */ /* Stefano Iacus */ /* Via del Serafico, 185 */ /* 00142 - Roma */ /* E-Mail: mc7414@mclink.it */ /* */ /****************************************************************/ #ifdef THINK_C /*** Necessario per 'echo2file' del Think C, Macintosh ***/ #include #endif #include #include #include #define TITLE_STR "\n*** OROLOGIO SOLARE VERTICALE DECLINANTE ***\n(c) Alberto Cintio 1991 - Stefano Iacus 1994\n" #ifndef PI /*** Non definito in math.h del Think C, Macintosh ***/ #define PI 3.14159265359 #endif /* variabili globali */ double L, L1, R, R1, Z, Z1, P, GN, IOI, A1, A2, A3, G, FU, H; double U, E, D, D1, X, Y, J, Q0, Q1, Q2, Q3, Q4, Q7, Q8, Q9; char str[10]; /* prototipi delle funzioni */ void GetLocalData(void); void CartCoord(void); void GiveMeasure(void); void GiveXY(void); void Left(void); void Right(void); void main(void) { #ifdef THINK_C /*** Echo su file per Think C, Macintosh ***/ cecho2file("Log file",0,stdout); #endif GetLocalData(); CartCoord(); GiveMeasure(); printf("\n\nBuon Lavoro!!!\n\n"); } /**********************************************/ /* Funzione GetLocalData(): */ /* si occupa della raccolta dei dati relativi */ /* al sito che ospitera` il quadrante solare. */ /**********************************************/ void GetLocalData(void) { printf("\n"TITLE_STR"\nInserire le variabili:"); printf("\nInserire i dati angolari in gradi e frazioni decimali, le altre misure in cm"); printf("\nes: 41g15'36\" --> 41.26 = 41 + 15/60 + 36/3600"); printf("\nLatitudine Nord (es:Roma=41.92) :"); scanf("%lf",&L1); printf("Longitudine Est (es:Roma=-12.45):"); scanf("%lf",&G); printf("Fuso orario ad Est (es:Italia=1):"); scanf("%lf",&FU); G = -G; printf("Azimut parete :"); scanf("%lf",&Z1); printf("Lunghezza gnomone perpendicolare:"); scanf("%lf",&GN); P = PI / 180; L = L1 * P; Z = Z1 * P; } /****************************************/ /* Funzione CartCoord(): */ /* si occupa di calcolare le coordinate */ /* cartesiane dei punti del quadrante */ /* solare relativi alle ore. Tali punti */ /* serviranno poi per il tracciamento */ /* delle linee orarie. */ /****************************************/ void CartCoord(void) { printf("\n"TITLE_STR"\nCoordinate cartesiane\n\nLo (0,0) degli assi e` il piede dello gnomone perpendicolare alla parete\n"); U = GN / sin(Z) * tan(L); E = 0; if( Z1 != 90 ) E = GN / tan( Z ); printf("\nGnomone perpendicolare:%6.2lf\nGnomone obliquo :%6.2lf", GN, IOI = sqrt( GN * GN + U * U + E * E ) ); printf("\nLatidudine :%6.2lf\nLongitudine :%6.2lf\nAzimut parete :%6.2lf", L1, -G, Z1 ); printf("\nPunto radiale coord. : ( X = %6.2lf, Y = %6.2lf )\n", E, U ); printf("\n i n v e r n o e q u i n o z i e s t a t e"); printf("\n ora ascissa ordinata ascissa ordinata ascissa ordinata"); printf("\n --- -------- -------- -------- -------- -------- --------"); for( H = 6; H <= 18; ++H ) { R1 = G + 15 * ( H - 12 - FU ); R = R1 * P; printf("\n %2.0lf ",H); for( D1 = -1; D1 <=1 ; ++D1 ) { D = D1 * P * 23.5; J = 23 * D1 + 37; if( (Z1 == 90) && (D1 == 0) && (R1 == -90) ) printf("\n -infin 0.00"); else if( (Z1 == 90) && (D1 == 0) && (R1 == 90) ) printf("\n +infin 0.00"); else GiveXY(); if( fabs( X * GN ) > 999 ) printf(" ---.-- "); else printf("%8.2lf ", X * GN ); if( fabs( Y * GN ) > 999 ) printf(" ---.-- "); else printf("%8.2lf ", Y * GN ); } } } /************************************************/ /* Funzione GiveMeasure(): */ /* si occupa di calcolare le distanze dei punti */ /* orari su un rettangolo di dimensioni fissate */ /************************************************/ void GiveMeasure(void) { printf("\n"TITLE_STR"\nMisure lungo i lati di un rettangolo\n"); printf("\nAltezza del rettangolo :"); scanf("%lf",&Q0); printf("Parte sinistra della base:"); scanf("%lf",&Q1); printf("Parte destra della base :"); scanf("%lf",&Q2); printf("\nLatitudine :%6.2lf\nLongitudine :%6.2lf", L1, -G ); printf("\nAzimut parete :%6.2lf\nGnomone perpendicolare:%6.2lf\nGnomone obliquo :%6.2lf",Z1 ,GN ,IOI ); printf("\nBase rettangolo :%6.2lf + %6.2lf\nAltezza rettangolo :%6.2lf", Q1, Q2, Q0 ); Q8 = -Q0 * E / U; Q7 = Q1 + Q8; strcpy(str,"BASE"); if( Q8 + Q1 < 0 ) { Q7 = Q0 - Q0 * ( Q8 + Q1 ); Left(); } if( Q8 > Q2 ) { Q7 = Q0 - Q0 * ( Q8 - Q2 ) / Q8; Right(); } printf("\nLinea substiliare :%6.2lf %s", Q7, str ); printf("\nDistanza dello gnomone perpendicolare dal Punto Radiale :%6.2lf\n", sqrt( U * U + E * E ) ); printf("\n Misure lungo i lati Distanze dal Punto Radiale"); printf("\n ~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); printf("\n ore inverno equinozi estate"); printf("\n --- -------- -------- --------"); for( H = 6; H <= 18 ; ++H ) { R1 = G + 15 * ( H - 12 - FU ); R = R1 * P; printf("\n %2.0lf", H); for( D1 =-1 ; D1 <= 1 ; ++D1 ) { D = D1 * P * 23.5; J = 15 * D1 + 50; GiveXY(); X = X * GN - E; Y = Y * GN - U; if( D1 == -1 ) { Q9 = -Q0 * X / Y; Q4 = Q1 + Q9; strcpy(str,"BASE"); if( Q9 + Q1 < 0 ) { Q4 = Q0 - Q0 * ( Q9 + Q1 ) / Q9; Left(); } if( Q9 > Q2 ) { Q4 = Q0 - Q0 * ( Q9 - Q2 ) / Q9; Right(); } if( ( (int)( Q4 * 100) == 0 ) && H < 11 ) Left(); if( ( (int)( Q4 * 100) == 0 ) && H > 13 ) Right(); printf(" %6.2lf %5.5s ",Q4,str); } Q3 = sqrt( X * X + Y * Y); if( Q3 < 999 ) printf(" %6.2lf ", Q3 ); else printf(" ---.-- "); } } } /*****************************/ /* Funzione GiveXY() */ /* si occupa di calcolare le */ /* coordinate cartesiane. */ /*****************************/ void GiveXY(void) { A1 = sin( D ) * sin( L ) + cos( D ) * cos( L ) * cos( R ); A1 = atan( A1 / sqrt ( 1 - A1 * A1 ) ); if( R1 == 0 ) A2 = PI; else { A2 = ( sin( D ) * cos( L ) - cos( D ) * sin( L ) * cos( R ) ) / cos( A1 ); A2 = PI / 2 - atan( A2 / sqrt( 1 - A2 * A2 ) ); if( R1 > 0 ) A2 = 2 * PI - A2; } A3 = A2 - Z - PI / 2; X = tan( A3 ); Y = -tan( A1 ) / cos( A3 ); } /*********************************/ /* Funzione Left() */ /* ha il solo scopo di diminuire */ /* la lunghezza dell'eseguibile. */ /*********************************/ void Left(void) { strcpy(str,"LEFT"); } /*********************************/ /* Funzione Right() */ /* ha il solo scopo di diminuire */ /* la lunghezza dell'eseguibile. */ /*********************************/ void Right(void) { strcpy(str,"RIGHT"); }