Rambler's Top100Astronet    
  po tekstam   po klyuchevym slovam   v glossarii   po saitam   perevod   po katalogu
 

Na pervuyu stranicu << 9. Prilozhenie S | Oglavlenie | 11. Prilozhenie E >>

Razdely


10. Prilozhenie D

10.1. Teksty programm na yazyke C

Listing D 3.1. Modul' chteniya kataloga Hipparcos

Fail hipmain.h
// Chtenie kataloga Hipparcos. Zagolovochnyi fail
// Raspolozhenie polnoi versii kataloga Hipparcos
#define HipparcosName "D:/CATALOGS/HIPARCOS/hip_main.dat"
#define HipNumOfStars 118218
typedef struct
{
long HIP; // Nomer zvezdy po Hipparcos
// Astrometricheskaya informaciya
double RAdeg,DEdeg; // Ekvatorial'nye koordinaty v gradusah
double Plx; // Trigonometricheskii parallaks v mas
double pmRA,pmDE; // Sobstv. dvizh. ma*cos(d) i md mas/god
char AstroRef; // Flag dlya kratnyh sistem
// Fotometricheskaya informaciya
float VMag; // Zvezdnaya vel. po shkale Dzhonsona
float B_V ; // Pokazatel' cveta B-V po shkale Dzhonsona
struct // oshibki sootv. velichin
{ double RAdeg,DEdeg, Plx, pmRA,pmDE;
} sigma;
char Sp[10+1]; // Razvernutyi spektral'nyi klass
struct // Bitovaya struktura otsutstviya informacii
{ unsigned NoRaDe:1; // Net dannyh o tochnyh koordinatah
unsigned NoPlx :1; // Net dannyh o parallakse
unsigned NoPM :1; // Netdannyh o sobstvennyh dvizheniyah
unsigned NoVMag:1; // Net dannyh o zvezdnoi velichine
unsigned NoB_V :1; // Net dannyh o pokazatele cveta
} Info;
}
THipparcos;
// Prototipy funkcii
bool OpenHipparcosMain(); // Otkrytie faila kataloga
void CloseHipparcosMain(); // Zakrytie faila kataloga
// Chtenie odnoi stroki kataloga: rezul'tat pomeshaetsya v s,
// vozvrashaet false pri dostizhenii konca faila.
bool ReadHipparcosMain(THipparcos *s);
Fail hipmain.c
// Chtenie kataloga Hipparcos
#include <stdio.h>
#include <stdlib>
#include <string.h>
#include "hipmain.h"
#define HipRecSize 451 // dlina stroki kataloga, vklyuchaya CR,LF
// Vozvrashaet true, esli s sostoit tol'ko iz probelov
bool IsBlank(char *s)
{ while (*s) if (*s++ != ' ') return false;
return true;
}
FILE *f; // Failovaya peremennaya kataloga
// Otkrytie faila kataloga v rezhime "tol'ko chtenie"
bool OpenHipparcosMain()
{ f=fopen(HipparcosName,"rt");
if (f) return true; elsereturn false;
}
// Zakrytie faila kataloga
void CloseHipparcosMain() { fclose(f); };
// Chtenie odnoi zapisi
bool ReadHipparcosMain(THipparcos *s)
{
// Lokal'nye peremennye funkcii
char hs[HipRecSize]; // Stroka kataloga
char st[16]; // Vspomogatel'nyi bufer
if feof(f) return false; //Esli konec faila, to False
fread(hs,HipRecSize,1,f); // Chtenie odnoi stroki
s->Info.NoRaDe=0; // Obnulenie vseh bitov flaga
s->Info.NoPlx =0; s->Info.NoPM =0;
s->Info.NoVMag=0; s->Info.NoB_V =0;
// My ne ispol'zuem formatnyi vvod operatorom scnaf, s tem,
// chtoby polnost'yu kontrolirovat' process chteniya polei (v tom
// chisle i pustyh). Funkcii atoi i atof vozvrashayut nulevye
// znacheniya v sluchae oshibki preobrazovaniya, poetomu nado
// proveryat' polya na probely otdel'no.
// Interpretaciya 12 bait, nachinaya s 3-go - eto nomer HIP.
s->HIP=atoi(strncpy(st,hs+3-1,12));
// Chtenie koordinat: po 12 bait s 52 i s 65 pozicii.
strncpy(st,hs+52-1,12); st[12]=0; s->RAdeg=atof(st);
if (IsBlank(st)) s->Info.NoRaDe=1;
strncpy(st,hs+65-1,12); st[12]=0; s->DEdeg=atof(st);
if (IsBlank(st)) s->Info.NoRaDe=1;
// Chtenie parallaksa - 7 bait s 80-i pozicii
strncpy(st,hs+80-1,7); st[7]=0; s->Plx=atof(st);
if (IsBlank(st)) s->Info.NoPlx=1;
// Chtenie sobstvennyh dvizhenii: po 8 bait s 88 i s 97 pozicii
strncpy(st,hs+88-1,7); st[7]=0; s->pmRA=atof(st);
if (IsBlank(st)) s->Info.NoPM=1;
strncpy(st,hs+97-1,7); st[7]=0; s->pmDE=atof(st);
if (IsBlank(st)) s->Info.NoPM=1;
s->AstroRef=hs[78-1]; // Flag kratnoi zvezdy
// Chtenie zv.velichiny i pokazatelya cveta B-V po Dzhonsonu
strncpy(st,hs+42-1,5); st[5]=0; s->VMag=atof(st);
if (IsBlank(st)) s->Info.NoVMag=1;
strncpy(st,hs+246-1,6); st[6]=0; s->B_V=atof(st);
if (IsBlank(st)) s->Info.NoB_V=1;
if (!s->Info.NoRaDe)
{ // Dannye ob oshibkah vsegda prisutstvuyut,
// esli prisutstvuyut i sami koordinaty.
strncpy(st,hs+106-1,6); st[6]=0; s->sigma.RAdeg=atof(st);
strncpy(st,hs+113-1,6); st[6]=0; s->sigma.DEdeg=atof(st);
}
if (!s->Info.NoPlx)
{ strncpy(st,hs+120-1,6); st[6]=0; s->sigma.Plx=atof(st);}
if (!s->Info.NoPM)
{ strncpy(st,hs+127-1,6); st[6]=0; s->sigma.pmRA=atof(st);
strncpy(st,hs+134-1,6); st[6]=0; s->sigma.pmDE=atof(st);
}
// Chtenie dannyh o spektral'nom klasse
strncpy(s->Sp,hs+436-1,10); st[10]=0;
return true;
}

Listing D 3.2. Podschet zvezd bez dannyh o koordinatah, sobstvennyh dvizheniyah i parallaksah

#include <stdio.h>
#include "hipmain.h"
main()
{
THipparcos s; // Struktura dannyh o zvezde
long NoCoord = 0; // Schetchik zvezd bez tochnyh koordinat
long NoProp = 0; // Schetchik zvezd bez sobstv. dvizhenii
long NoPar = 0; // Schetchik zvezd bez parallaksov
int k; // bitovaya maska
OpenHipparcosMain(); // Otkrytie kataloga
while (ReadHipparcosMain(&s)) // Cikl chteniya kataloga
{
// Sravnenie bitov v maske s konstantami
if (s.Info.NoRaDe) NoCoord++;
if (s.Info.NoPM) NoProp++;
if (s.Info.NoPlx) NoPar++;
}
CloseHipparcosMain(); // Zakrytie kataloga
// Vyvod rezul'tatov
printf("Zvezd bez tochnyh koordinat %ld::/n",NoCoord);
printf("Zvezd bez sobstvennyh dvizhenii %ld::/n",NoProp);
printf("Zvezd bez parallaksov %ld::/n", NoPar);
}

Listing D 3.3. Vychislenie raspredeleniya zvezd po absolyutnoi zvezdnoi velichine

#include <stdio.h>
#include <math.h>
#include "hipmain.h"
main()
{ THipparcos s;
long a[25]; // statistika
int i; // vspomogatel'naya peremennaya
double r; // rasstoyanie
double m; // absolyutnaya zvezdnaya velichina
for (i=0; i<=24; i++) a[i]=0; // obnulenie statistiki
OpenHipparcosMain();
while (ReadHipparcosMain(&s))
{ if (s.Info.NoPlx)continue; // net dannyh o parall.
if (s.Plx<=0.0) continue; // nepolozhitel'nyi parallaks
if (s.sigma.Plx/s.Plx>0.5) continue; // tochnost' huzhe 50%
r=1000.0/s.Plx; // Vychislenie rasstoyaniya v pk
m=s.VMag-5.0*log10(r)+5.0;//Vychislenie absolyutnoi zv. velichiny
i=floor(m+0.5)+12; // Opredelenie indeksa yacheiki massiva
if ( (i>=0) && (i<=24)) a[i]++; // uv.na 1
}
CloseHipparcosMain();
for (i=0; i<=24; i++) printf("%4d %6d::/n",i-12,a[i]);
}

Listing D 3.4. Vychislenie srednei absolyutnoi zvezdnoi velichiny zvezd, spisok kotoryh nahoditsya v faile lumin.txt

main()
{
THipparcos s;
double r; // rasstoyanie
double m; // absolyutnaya zvezdnaya velichina
double mav=0; // srednyaya absolyutnaya zvezdnaya velichina
long n=0 ; // kolichestvo podhodyashih zvezd
int k; // bitovaya maska
OpenHipparcosMain();
// Inicializaciya kriteriya
printf("%ld zvezd v spiske.::/n",InitCriteria("lumin.txt"));
while (ReadHipparcosMain(&s))
{
k=s.Info & NoPlx;
if (!k) continue; // net dannyh o parallakse
if (s.Plx<=0.0) continue; // nepolozhitel'nyi parallaks
r=1000.0/s.Plx; // Vychislenie rasstoyaniya v pk
m=s.VMag-5.0*log10(r)+5.0; // Vychisl. abs. zvezd. velichiny
if (InCelestia(s.HIP)) // Zvezda v spiske Celestia?
{
mav+=m; // nakoplenie summy abs. zv. velichin
n++; // summirovanie chisla zvezd
}
} // while
ClearCriteria(); // Ochistka kriteriya
CloseHipparcosMain();
mav/=n; // Vychislenie srednego znacheniya
printf("M (av) = %6.2f::/n",mav);
printf("Obrabotano %ld zvezd.::/n",n);
scanf("::/n");
}

Listing D 3.5. Ishodnyi tekst funkcii InitCriteria, InCelestia, ClearCriteria

Dobavleniya v zagolovochnyi fail hipmain.h
// Inicializaciya kriteriya s ispol'zovaniem vyhodnogo faila
// programmy Celestia 2000. name - imya faila.
// Vozvrashaet chislo zvezd v spiske.
long InitCriteria(char * );
// Funkciya proveryaet, est' li zvezda v spiske.
bool InCelestia(long n);
// Ochistka kriteriya.
void ClearCriteria();
Dobavleniya v fail hipmain.c
// Global'nye peremennye dlya raboty s kriteriem
long *List; // Ukazatel' na nachalo spiska nomerov zvezd
long NList = 0; // Kolichestvo zvezd v spiske
// Inicializaciya kriteriya s ispol'zovaniem vyhodnogo faila
// programmy Celestia 2000. name - imya faila.
// Vozvrashaet chislo zvezd v spiske
long InitCriteria(char * name)
{
FILE *t; // failovaya peremennaya
char s[512]; // stroka-bufer dlya chteniya
char q[16]; // dopolnitel'nyi bufer
long i; // indeks dlya cikla for
t=fopen(name,"rt"); // Otkryvaem fail
if (!t) return 0;
for (i=0; i<2; i++)
fgets(s,512,t); // Propusk dvuh pervyh strok
fscanf(t,"%d",&NList); // V tret'ei stroke - kolichestvo zvezd
// Vydelenie pamyati pod spisok
List=(long *) malloc(NList*sizeof(long));
for (i=3; i<=12; i++)
fgets(s,512,t); // Propusk s ostatka 3 po 12 stroku
for (i=0; i<NList; i++) // chtenie s 3-go baita 12 bait nomera
{ fgets(s,512,t);
strncpy(q,s+2,12); q[12]=0;
List[i]=atoi(q);
}
fclose(t);
return NList;
}
// Funkciya proveryaet, est' li zvezda v spiske
bool InCelestia(long n)
{
long i;
// esli kriterii ne ustanovlen - vyhod
if (NList==0) returnfalse;
for (i=0; i<NList; i++) // obhod zvezd v cikle for
{ // esli zvezda naidena v spiske - vyhod c true
if (List[i]==n) return true;
}
return false; // Syuda popadaem, tol'ko esli zvezda ne naidena
}
// Ochistka kriteriya
void ClearCriteria()
{
free(List);
NList=0;
}

Listing D 4.1. Procedury perevoda koordinat

void Aitoff
(double l, double b, // Sfericheskie koordinaty v radianah
double &x, double &y) // Dekartovy koordinaty
{ double s;
if (l>M_PI) l=l-2*M_PI; // Privedenie l v diapazon -PI do +PI
s=sqrt(1.0+cos(b)*cos(l/2.0)); // Znamenatel' formul 4.1
x=-2.0*cos(b)*sin(l/2.0)/s; y=sin(b)/s;
}
void Screen
(double x, double y, // Dekartovy koordinaty
int X0, int Y0, // Ekrannyekoordinatynachaladekartovoisistemy
double Scale, // Masshtab - tochek ekrana na edinicu dliny
int &u, int &v) // Ekrannye koordinaty
{
u=X0+floor(Scale*x+0.5); v=Y0-floor(Scale*y+0.5);
}

Listing D 4.2. Procedura, risuyushaya koordinatnuyu setku

double rad(double x) // Perevod gradusov v radiany
{ return x/180.0*M_PI;
}
void AitoffGrid
(int Step, // Shag setki v gradusah
int X0, int Y0, // Ekrannye koordinaty centra proekcii
double Scale, // Masshtab - tochek na edinicu dliny
int Gr ) // Flag - v gradusah ili v chasah razmetka dolgoty
{
int i,j; // Peremennye ciklov for
double l,b; // Galakticheskie koordinaty
double x,y; // Dekartovy koordinaty
int u,v; // Ekrannye koordinaty
char s[6]; // Stroka dlya podpisei
int h; // Dlya razmetki osei
// Nanesenie setki meridianov
i=-180; // Pervyi meridian -180 gradusov
do { // Cikl po meridianam
l=rad(i); // Perevod v radiany
j=-90; // Pervaya tochka meridiana
do { // Cikl postroeniya vdol' meridiana
// Vychislenie tochki meridiana
b=rad(j); // Perevod v radiany shiroty
Aitoff(l,b,x,y); // Perevod v dekartovy koordinaty
Screen(x,y,X0,Y0,Scale,u,v); // Perevod v ekrannye koord.
// Esli tochka pervaya (j=-90), to pomeshaem graficheskii kursor
// v tochku (u,v) funkciei moveto, esli tochka ne pervaya, to
// "procherchivaem" kursorom liniyu iz predydushei tochki
// v tochku (u,v) funkciei lineto.
if (j==-90) moveto(u,v); else lineto(u,v);
j+=5; // Shag 5 gradusov obespechivayut gladkii vid meridiana
} while (j<=90);
i+=Step; // Perehod k sleduyushemu meridianu
} while (i<=180);
// Nanesenie setki parallelei - analogichno predydushemu
j=-90;
do { // cikl po parallelyam
b=rad(j);
i=-180;
do { // cikl postroeniya vdol' paralleli
l=rad(i);
Aitoff(l,b,x,y); Screen(x,y,X0,Y0,Scale,u,v);
if (i==-180) moveto(u,v); else lineto(u,v);
i=i+5;
} while (i<=180);
j+=Step;
} while (j<=90);
// Zadanie svoistv shrifta (mozhet zaviset' ot graf.bibl.)
settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
settextjustify(LEFT_TEXT,BOTTOM_TEXT);
// Podpisi meridianov vdol' ekvatora
i=-180;
do {
// Vychislenie koordinaty tochki vyvoda nadpisi
l=rad(i);
Aitoff(l,0,x,y); Screen(x,y,X0,Y0,Scale,u,v);
// Esli Gr istina, to razmetka v gradusah, inache - v chasah
if (Gr) h=i;
else { h=i/15; if (h<0) h+=24;
};
itoa(h,s,10); // Preobrazovanie znacheniya h v tekstovuyu stroku
outtextxy(u+5,v-5,s); // Vyvod tekstovoi stroki
i+=Step; // Perehod k sleduyushemu meridianu
} while (i<=180);
// Izmenenie vyravnivaniya teksta
settextjustify(RIGHT_TEXT,BOTTOM_TEXT);
// Podpisi parallelei vdol' nulevogo meridiana - analogichno
j=-90+Step;
do {
if (j!=0) // Ekvator ne podpisyvaem
{
b=rad(j);
Aitoff(0,b,x,y); Screen(x,y,X0,Y0,Scale,u,v);
itoa(j,s,10);
outtextxy(u-5,v-5,s);
}
j+=Step;
} while (j<=90-Step);
}

Listing D 4.3. Perevod ekvatorial'nyh koordinat v galakticheskie

// Perevod ekvatorial'nyh koordinat v galakticheskie
void Galaxy(
double a, double d, // Ekvatorial'nye koordinaty
double &l, double &b) // Galakticheskie
{
double sa,ca,sd,cd;
doubleconst Leo = 4.936829261; // 282.85948083
doubleconst L0 = 0.57477039907; // 32.931918056
doubleconst si = 0.88998807641; // sin 62.871748611
doubleconst ci = 0.45598379779; // cos 62.871748611
a=a-Leo;
sa=sin(a); ca=cos(a);
sd=sin(d); cd=cos(d);
b=asin(sd*ci-cd*si*sa);
l=atan2(sd*si+cd*ci*sa,cd*ca)+L0;
}

Listing D 4.4. Postroenie raspredeleniya zvezd po nebesnoi sfere

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <graphics.h>
#include <conio.h>
#include "hipmain.h"
voidmain()
{
THipparcos s;
int driver,mode; // Dlya inicializacii grafich. rezhima
int color; // Cvet tochki
double l, b; // Galakticheskie koordinaty
double x, y; // Dekartovy koordinaty
int u, v; // Ekrannye koordinaty
int CX, CY; // Ekrannye koordinaty centra proekcii
int SC; // Masshtab perevoda dekartovyh koord. v ekrannye
// Inicializaciya graficheskogo rezhima (zavisit ot bibl.)
driver=DETECT; mode=0; initgraph(&driver,&mode,"D:/BC/BGI");
// Zadanie masshtaba i centra
// Proekciya Aitofa imeet X v diapazone ot -2 do 2, i zazor
SC=getmaxx()/4-10;
CX=getmaxx()/2; CY=getmaxy()/2;
AitoffGrid(30,CX,CY,SC,1); // Vyvod setki koordinat
OpenHipparcosMain(); // Otkrytie kataloga i
InitCriteria("I-II.txt"); // inicializaciya kriteriya
while (ReadHipparcosMain(&s)) // Cikl chteniya zvezd
if (InCelestia(s.HIP)) // Proverka kriteriya
{
switch (s.Sp[0]) // Opredelenie cveta zvezdy
{
case 'O':
case 'B': color=LIGHTBLUE; break;
case 'A': color=LIGHTCYAN; break;
case 'F':
case 'G': color=YELLOW; break;
case 'K':
case 'M': color=LIGHTRED; break;
default: color=LIGHTGRAY;
} // switch
// Perevod ekvatorial'nyh koordinat v radiany,
// a zatem v galakticheskie koordinaty
Galaxy(rad(s.RAdeg),rad(s.DEdeg),l,b);
// Vychislenie dekartovyh koordinat proekcii Aitofa
Aitoff(l,b,x,y);
Screen(x,y,CX,CY,SC,u,v); // Perevod v ekrannye koordinaty
// Postavit' tochku (mozhno zamenit' na krug, krest i t.p.)
putpixel(u,v,color);
}; // if i while
ClearCriteria();
CloseHipparcosMain();
getch();
}

Listing D 4.5. Formirovanie pryamougol'nyh koordinat zvezd

#define criteria "O-B5.TXT" // Imya faila kriteriya
#define list "O-B5.DAT" // Imya vyhodnogo faila
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include "hipmain.h"
main()
{
int n = 0; // Schetchik
THipparcos s;
double r; // Rasstoyanie
double l, b; // Galakticheskie koordinaty
double x,y,z; // Dekartovy galakticheskie koordinaty
FILE *f; // Fail vyvoda rezul'tatov
f=fopen(list,"wt");
OpenHipparcosMain();
printf("%d zvezd v kriterii.::/n",InitCriteria(criteria));
// PrintList();
while (ReadHipparcosMain(&s))
{
if (s.Info.NoPlx==1) continue; // net dannyh o parallakse
if (s.Plx<=0.0) continue; // "plohoe" znachenie parallaksa
if (s.sigma.Plx/s.Plx>0.5) continue; // nizkaya tochnost' par.
if (InCelestia(s.HIP))
{
r=1000.0/s.Plx; // Vychislenie rasstoyaniya v pk
if (r>500.0) continue; // Otbros dalekih zvezd
// Perevod v galakticheskie koordinaty
Galaxy(rad(s.RAdeg),rad(s.DEdeg),l,b);
x=r*cos(b)*cos(l); // Vychislenie pryamougol'nyh
y=r*cos(b)*sin(l); // galakticheskih koordinat
z=r*sin(b);
fprintf(f,"%10.2lf %10.2lf %10.2lf::/n",x,y,z); // Vyvod v fail
n++; // Uvelichenie schetchika na edinicu
};
}; // while
ClearCriteria();
CloseHipparcosMain();
fclose(f);
printf("%d zvezd obrabotano.::/n",n);
}



<< 9. Prilozhenie S | Oglavlenie | 11. Prilozhenie E >>

Publikacii s klyuchevymi slovami: astrometriya - katalogi - Hipparcos
Publikacii so slovami: astrometriya - katalogi - Hipparcos
Sm. takzhe:
Vse publikacii na tu zhe temu >>

Ocenka: 3.0 [golosov: 99]
 
O reitinge
Versiya dlya pechati Raspechatat'

Astrometriya - Astronomicheskie instrumenty - Astronomicheskoe obrazovanie - Astrofizika - Istoriya astronomii - Kosmonavtika, issledovanie kosmosa - Lyubitel'skaya astronomiya - Planety i Solnechnaya sistema - Solnce


Astronet | Nauchnaya set' | GAISh MGU | Poisk po MGU | O proekte | Avtoram

Kommentarii, voprosy? Pishite: info@astronet.ru ili syuda

Rambler's Top100 Yandeks citirovaniya