<< 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 >> |