📄 scat.c
字号:
if(ramin > ramax) min -= circle; for(x=min; x<=ramax; x+=250*60*60){ xx = x; if(xx < 0) xx += circle; for(y=decmin; y<=decmax; y+=250*60*60) if(-circle/4 < y && y < circle/4) loadpatch(patcha(angle(xx), angle(y))); } sort(); cull(nil, 1, 1); return 1;}voidpplate(char *flags){ int i; long c; int na, rah, ram, d1, d2; double r0; int ra, dec; long ramin, ramax, decmin, decmax; /* all in degrees */ Record *r; int folded; Angle racenter, deccenter, rasize, decsize, a[4]; Picture *pic; rasize = -1.0; decsize = -1.0; na = 0; for(;;){ while(*flags==' ') flags++; if(('0'<=*flags && *flags<='9') || *flags=='+' || *flags=='-'){ if(na >= 3) goto err; a[na++] = getra(flags); while(*flags && *flags!=' ') flags++; continue; } if(*flags){ err: Bprint(&bout, "syntax error in plate\n"); return; } break; } switch(na){ case 0: break; case 1: rasize = a[0]; decsize = rasize; break; case 2: rasize = a[0]; decsize = a[1]; break; case 3: case 4: racenter = a[0]; deccenter = a[1]; rasize = a[2]; if(na == 4) decsize = a[3]; else decsize = rasize; if(rasize<0.0 || decsize<0.0){ Bprint(&bout, "negative sizes\n"); return; } goto done; } folded = 0; /* convert to milliarcsec */ c = 1000*60*60; Again: if(nrec == 0){ Bprint(&bout, "empty\n"); return; } ramin = 0x7FFFFFFF; ramax = -0x7FFFFFFF; decmin = 0x7FFFFFFF; decmax = -0x7FFFFFFF; for(r=rec,i=0; i<nrec; i++,r++){ if(r->type == Patch){ radec(r->index, &rah, &ram, &dec); ra = 15*rah+ram/4; r0 = c/cos(RAD(dec)); ra *= c; dec *= c; if(dec == 0) d1 = c, d2 = c; else if(dec < 0) d1 = c, d2 = 0; else d1 = 0, d2 = c; }else if(r->type==SAO || r->type==NGC || r->type==Abell){ ra = r->ngc.ra; dec = r->ngc.dec; d1 = 0, d2 = 0, r0 = 0; }else if(r->type==NGCN){ loadngc(r->index); continue; }else if(r->type==NamedSAO){ loadsao(r->index); continue; }else if(r->type==NamedNGC){ loadngc(r->index); continue; }else if(r->type==NamedAbell){ loadabell(r->index); continue; }else continue; if(dec+d2 > decmax) decmax = dec+d2; if(dec-d1 < decmin) decmin = dec-d1; if(folded){ ra -= 180*c; if(ra < 0) ra += 360*c; } if(ra+r0 > ramax) ramax = ra+r0; if(ra < ramin) ramin = ra; } if(!folded && ramax-ramin>270*c){ folded = 1; goto Again; } racenter = angle(ramin+(ramax-ramin)/2); deccenter = angle(decmin+(decmax-decmin)/2); if(rasize<0 || decsize<0){ rasize = angle(ramax-ramin)*cos(deccenter); decsize = angle(decmax-decmin); } done: if(DEG(rasize)>1.1 || DEG(decsize)>1.1){ Bprint(&bout, "plate too big: %s", ms(rasize)); Bprint(&bout, " x %s\n", ms(decsize)); Bprint(&bout, "trimming to 30'x30'\n"); rasize = RAD(0.5); decsize = RAD(0.5); } Bprint(&bout, "%s %s ", hms(racenter), dms(deccenter)); Bprint(&bout, "%s", ms(rasize)); Bprint(&bout, " x %s\n", ms(decsize)); Bflush(&bout); flatten(); pic = image(racenter, deccenter, rasize, decsize); if(pic == 0) return; Bprint(&bout, "plate %s locn %d %d %d %d\n", pic->name, pic->minx, pic->miny, pic->maxx, pic->maxy); Bflush(&bout); displaypic(pic);}voidlookup(char *s, int doreset){ int i, j, k; int rah, ram, deg; char *starts, *inputline=s, *t, *u; Record *r; long n; double x; Angle ra; lowercase(s); s = skipbl(s); if(*s == 0) goto Print; if(t = alpha(s, "flat")){ if(*t){ fprint(2, "flat takes no arguments\n"); return; } if(nrec == 0){ fprint(2, "no records\n"); return; } flatten(); goto Print; } if(t = alpha(s, "print")){ if(*t){ fprint(2, "print takes no arguments\n"); return; } for(i=0,r=rec; i<nrec; i++,r++) prrec(r); return; } if(t = alpha(s, "add")){ lookup(t, 0); return; } if(t = alpha(s, "sao")){ n = strtoul(t, &u, 10); if(n<=0 || n>NSAO) goto NotFound; t = skipbl(u); if(*t){ fprint(2, "syntax error in sao\n"); return; } if(doreset) reset(); if(!loadsao(n)) goto NotFound; goto Print; } if(t = alpha(s, "ngc")){ n = strtoul(t, &u, 10); if(n<=0 || n>NNGC) goto NotFound; t = skipbl(u); if(*t){ fprint(2, "syntax error in ngc\n"); return; } if(doreset) reset(); if(!loadngc(n)) goto NotFound; goto Print; } if(t = alpha(s, "ic")){ n = strtoul(t, &u, 10); if(n<=0 || n>NIC) goto NotFound; t = skipbl(u); if(*t){ fprint(2, "syntax error in ic\n"); return; } if(doreset) reset(); if(!loadngc(n+NNGC)) goto NotFound; goto Print; } if(t = alpha(s, "abell")){ n = strtoul(t, &u, 10); if(n<=0 || n>NAbell) goto NotFound; if(doreset) reset(); if(!loadabell(n)) goto NotFound; goto Print; } if(t = alpha(s, "m")){ n = strtoul(t, &u, 10); if(n<=0 || n>NM) goto NotFound; mopen(); for(j=n-1; mindex[j].m<n; j++) ; if(doreset) reset(); while(mindex[j].m == n){ if(mindex[j].ngc){ grow(); cur->type = NGCN; cur->index = mindex[j].ngc; } j++; } goto Print; } for(i=1; i<=Ncon; i++) if(t = alpha(s, constel[i])){ if(*t){ fprint(2, "syntax error in constellation\n"); return; } constelopen(); seek(condb, 4L*conindex[i-1], 0); j = conindex[i]-conindex[i-1]; Eread(condb, "con", con, 4*j); if(doreset) reset(); for(k=0; k<j; k++){ grow(); cur->type = PatchC; cur->index = Long(&con[k]); } goto Print; } if(t = alpha(s, "expand")){ n = 0; if(*t){ if(*t<'0' && '9'<*t){ Expanderr: fprint(2, "syntax error in expand\n"); return; } n = strtoul(t, &u, 10); t = skipbl(u); if(*t) goto Expanderr; } coords(n); goto Print; } if(t = alpha(s, "plot")){ if(nrec == 0){ Bprint(&bout, "empty\n"); return; } plot(t); return; } if(t = alpha(s, "astro")){ astro(t, 0); return; } if(t = alpha(s, "plate")){ pplate(t); return; } if(t = alpha(s, "gamma")){ while(*t==' ') t++; u = t; x = strtod(t, &u); if(u > t) gam.gamma = x; Bprint(&bout, "%.2f\n", gam.gamma); return; } if(t = alpha(s, "keep")){ if(!cull(t, 1, 0)) return; goto Print; } if(t = alpha(s, "drop")){ if(!cull(t, 0, 0)) return; goto Print; } for(i=0; planet[i].name[0]; i++){ if(t = alpha(s, planet[i].name)){ if(doreset) reset(); loadplanet(i, nil); goto Print; } } for(i=0; names[i].name; i++){ if(t = alpha(s, names[i].name)){ if(*t){ fprint(2, "syntax error in type\n"); return; } if(doreset) reset(); loadtype(names[i].type); goto Print; } } switch(s[0]){ case '"': starts = ++s; while(*s != '"') if(*s++ == 0){ fprint(2, "bad star name\n"); return; } *s = 0; if(doreset) reset(); j = nrec; saoopen(); starts = fromgreek(starts); for(i=0; i<NName; i++) if(equal(starts, name[i].name)){ grow(); if(name[i].sao){ rec[j].type = NamedSAO; rec[j].index = name[i].sao; } if(name[i].ngc){ rec[j].type = NamedNGC; rec[j].index = name[i].ngc; } if(name[i].abell){ rec[j].type = NamedAbell; rec[j].index = name[i].abell; } strcpy(rec[j].named.name, name[i].name); j++; } if(parsename(starts)) for(i=0; i<NBayer; i++) if(bayer[i].name[0]==parsed[0] && (bayer[i].name[1]==parsed[1] || parsed[1]==0) && bayer[i].name[2]==parsed[2]){ grow(); rec[j].type = NamedSAO; rec[j].index = bayer[i].sao; strncpy(rec[j].named.name, starts, sizeof(rec[j].named.name)); j++; } if(j == 0){ *s = '"'; goto NotFound; } break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': strtoul(s, &t, 10); if(*t != 'h'){ BadCoords: fprint(2, "bad coordinates %s\n", inputline); break; } ra = DEG(getra(s)); while(*s && *s!=' ' && *s!='\t') s++; rah = ra/15; ra = ra-rah*15; ram = ra*4; deg = strtol(s, &t, 10); if(t == s) goto BadCoords; /* degree sign etc. is optional */ if((uchar)*t == L'°') deg = DEG(getra(s)); if(doreset) reset(); if(abs(deg)>=90 || rah>=24) goto BadCoords; if(!loadpatch(patch(rah, ram, deg))) goto NotFound; break; default: fprint(2, "unknown command %s\n", inputline); return; } Print: if(nrec == 0) Bprint(&bout, "empty\n"); else if(nrec <= 2) for(i=0; i<nrec; i++) prrec(rec+i); else Bprint(&bout, "%ld items\n", nrec); return; NotFound: fprint(2, "%s not found\n", inputline); return;}char *ngctypes[] ={[Galaxy] "Gx",[PlanetaryN] "Pl",[OpenCl] "OC",[GlobularCl] "Gb",[DiffuseN] "Nb",[NebularCl] "C+N",[Asterism] "Ast",[Knot] "Kt",[Triple] "***",[Double] "D*",[Single] "*",[Uncertain] "?",[Nonexistent] "-",[Unknown] " ",[PlateDefect] "PD",};char*ngcstring(int d){ if(d<Galaxy || d>PlateDefect) return "can't happen"; return ngctypes[d];}short descindex[NINDEX];voidprintnames(Record *r){ int i, ok, done; done = 0; for(i=0; i<NName; i++){ /* stupid linear search! */ ok = 0; if(r->type==SAO && r->index==name[i].sao) ok = 1; if(r->type==NGC && r->ngc.ngc==name[i].ngc) ok = 1; if(r->type==Abell && r->abell.abell==name[i].abell) ok = 1; if(ok){ if(done++ == 0) Bprint(&bout, "\t"); Bprint(&bout, " \"%s\"", togreek(name[i].name)); } } if(done) Bprint(&bout, "\n");}intequal(char *s1, char *s2){ int c; while(*s1){ if(*s1==' '){ while(*s1==' ') s1++; continue; } while(*s2==' ') s2++; c=*s2; if('A'<=*s2 && *s2<='Z') c^=' '; if(*s1!=c) return 0; s1++, s2++; } return 1;}intparsename(char *s){ char *blank; int i; blank = strchr(s, ' '); if(blank==0 || strchr(blank+1, ' ') || strlen(blank+1)!=3) return 0; blank++; parsed[0] = parsed[1] = parsed[2] = 0; if('0'<=s[0] && s[0]<='9'){ i = atoi(s); parsed[0] = i; if(i > 100) return 0; }else{ for(i=1; i<=24; i++) if(strncmp(greek[i], s, strlen(greek[i]))==0){ parsed[0]=100+i; goto out; } return 0; out: if('0'<=s[strlen(greek[i])] && s[strlen(greek[i])]<='9') parsed[1]=s[strlen(greek[i])]-'0'; } for(i=1; i<=88; i++) if(strcmp(constel[i], blank)==0){ parsed[2] = i; return 1; } return 0;}char*dist_grp(int dg){ switch(dg){ default: return "unknown"; case 1: return "13.3-14.0"; case 2: return "14.1-14.8"; case 3: return "14.9-15.6"; case 4: return "15.7-16.4"; case 5: return "16.5-17.2"; case 6: return "17.3-18.0"; case 7: return ">18.0"; }}char*rich_grp(int dg){ switch(dg){ default: return "unknown"; case 0: return "30-40"; case 1: return "50-79"; case 2: return "80-129"; case 3: return "130-199"; case 4: return "200-299"; case 5: return ">=300"; }}char*nameof(Record *r){ NGCrec *n; SAOrec *s; Abellrec *a; static char buf[128]; int i; switch(r->type){ default: return nil; case SAO: s = &r->sao; if(s->name[0] == 0) return nil; if(s->name[0] >= 100){ i = snprint(buf, sizeof buf, "%C", greeklet[s->name[0]-100]); if(s->name[1]) i += snprint(buf+i, sizeof buf-i, "%d", s->name[1]); }else i = snprint(buf, sizeof buf, " %d", s->name[0]); snprint(buf+i, sizeof buf-i, " %s", constel[s->name[2]]); break; case NGC: n = &r->ngc; if(n->type >= Uncertain) return nil; if(n->ngc <= NNGC) snprint(buf, sizeof buf, "NGC%4d ", n->ngc); else snprint(buf, sizeof buf, "IC%4d ", n->ngc-NNGC); break; case Abell: a = &r->abell; snprint(buf, sizeof buf, "Abell%4d", a->abell); break; } return buf;}voidprrec(Record *r){ NGCrec *n; SAOrec *s; Abellrec *a; Planetrec *p; int i, rah, ram, dec, nn; long key; if(r) switch(r->type){ default: fprint(2, "can't prrec type %d\n", r->type); exits("type"); case Planet: p = &r->planet; Bprint(&bout, "%s", p->name); Bprint(&bout, "\t%s %s", hms(angle(p->ra)), dms(angle(p->dec))); Bprint(&bout, " %3.2f° %3.2f°", p->az/(double)MILLIARCSEC, p->alt/(double)MILLIARCSEC); Bprint(&bout, " %s", ms(angle(p->semidiam))); if(r->index <= 1) Bprint(&bout, " %g", p->phase); Bprint(&bout, "\n"); break; case NGC: n = &r->ngc; if(n->ngc <= NNGC) Bprint(&bout, "NGC%4d ", n->ngc); else Bprint(&bout, "IC%4d ", n->ngc-NNGC); Bprint(&bout, "%s ", ngcstring(n->type)); if(n->mag == UNKNOWNMAG) Bprint(&bout, "----"); else Bprint(&bout, "%.1f%c", n->mag/10.0, n->magtype); Bprint(&bout, "\t%s %s\t%c%.1f'\n", hm(angle(n->ra)), dm(angle(n->dec)), n->diamlim, DEG(angle(n->diam))*60.); prdesc(n->desc, desctab, descindex); printnames(r); break; case Abell: a = &r->abell; Bprint(&bout, "Abell%4d %.1f %.2f° %dMpc", a->abell, a->mag10/10.0, DEG(angle(a->rad)), a->dist); Bprint(&bout, "\t%s %s\t%.2f %.2f\n", hm(angle(a->ra)), dm(angle(a->dec)), DEG(angle(a->glat)), DEG(angle(a->glong))); Bprint(&bout, "\tdist grp: %s rich grp: %s %d galaxies/°²\n", dist_grp(a->distgrp), rich_grp(a->richgrp), a->pop); printnames(r); break; case SAO: s = &r->sao; Bprint(&bout, "SAO%6ld ", r->index); if(s->mag==UNKNOWNMAG) Bprint(&bout, "---"); else Bprint(&bout, "%.1f", s->mag/10.0); if(s->mpg==UNKNOWNMAG) Bprint(&bout, ",---"); else Bprint(&bout, ",%.1f", s->mpg/10.0); Bprint(&bout, " %s %s %.4fs %.3f\"", hms(angle(s->ra)), dms(angle(s->dec)), DEG(angle(s->dra))*(4*60), DEG(angle(s->ddec))*(60*60)); Bprint(&bout, " %.3s %c %.2s %ld %d", s->spec, s->code, s->compid, s->hd, s->hdcode); if(s->name[0]) Bprint(&bout, " \"%s\"", nameof(r)); Bprint(&bout, "\n"); printnames(r); break; case Patch: radec(r->index, &rah, &ram, &dec); Bprint(&bout, "%dh%dm %d°", rah, ram, dec); key = r->patch.key[0]; Bprint(&bout, " %s", constel[key&0xFF]); if((key>>=8) & 0xFF) Bprint(&bout, " %s", constel[key&0xFF]); if((key>>=8) & 0xFF) Bprint(&bout, " %s", constel[key&0xFF]); if((key>>=8) & 0xFF) Bprint(&bout, " %s", constel[key&0xFF]); for(i=1; i<r->patch.nkey; i++){ key = r->patch.key[i]; switch(key&0x3F){ case SAO: Bprint(&bout, " SAO%ld", (key>>8)&0xFFFFFF); break; case Abell: Bprint(&bout, " Abell%ld", (key>>8)&0xFFFFFF); break; default: /* NGC */ nn = (key>>16)&0xFFFF; if(nn > NNGC) Bprint(&bout, " IC%d", nn-NNGC); else Bprint(&bout, " NGC%d", nn); Bprint(&bout, "(%s)", ngcstring(key&0x3F)); break; } } Bprint(&bout, "\n"); break; case NGCN: if(r->index <= NNGC) Bprint(&bout, "NGC%ld\n", r->index); else Bprint(&bout, "IC%ld\n", r->index-NNGC); break; case NamedSAO: Bprint(&bout, "SAO%ld \"%s\"\n", r->index, togreek(r->named.name)); break; case NamedNGC: if(r->index <= NNGC) Bprint(&bout, "NGC%ld \"%s\"\n", r->index, togreek(r->named.name)); else Bprint(&bout, "IC%ld \"%s\"\n", r->index-NNGC, togreek(r->named.name)); break; case NamedAbell: Bprint(&bout, "Abell%ld \"%s\"\n", r->index, togreek(r->named.name)); break; case PatchC: radec(r->index, &rah, &ram, &dec); Bprint(&bout, "%dh%dm %d\n", rah, ram, dec); break; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -