/* * This file is part of the uniformdistr project. * Copyright 2022 Edward V. Emelianov . * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include "cmdlnopts.h" #include "uniform.h" // return sign of angle (+1 - positive, -1 - negative, 0 - error) static int deg2dms(double deg, int *d, int *m, int *s){ if(!d || !m || !s) return 0; int sign = 1; if(deg < 0.){ sign = -1; deg = -deg; } // add 0.5'' for right roundness deg += 0.5/3600.; *d = (int) deg; deg = (deg - *d) * 60.; // minutes *m = (int) deg; deg = (deg - *m) * 60.; *s = (int)deg; return sign; } /* // for hour angle in hour format static int deg2hms(double deg, int *d, int *m, int *s){ // if(deg < 0.) deg += 360.; deg /= 15.; return deg2dms(deg, d, m, s); }*/ static void tee(FILE *f, const char *fmt, ...){ va_list ar; va_start(ar, fmt); vprintf(fmt, ar); va_end(ar); if(f){ va_start(ar, fmt); vfprintf(f, fmt, ar); va_end(ar); } } /** * @brief savepoints - print points and save to file (if f!=NULL) * @param f - file * @param pts - points * @param N - amount * @param delim - angle delimeter string * @param mask - bit mask of columns (e.g. 1100 - show A/Z and hile HA/Dec) */ static void savepoints(FILE *f, point *pts, int N, char *delim, int mask){ char str[4][32]; if(!pts || !delim || N < 1) return; const char *headers[4] = {"A", "Z", "HA", "Dec"}; int show[4] = {0}; for(int i = 0; i < 4; ++i) if(mask & (1<A, &d[0], &m[0], &s[0]) < 0) sgn[0] = "-"; if(deg2dms(pts->Z, &d[1], &m[1], &s[1]) < 0) sgn[1] = "-"; if(deg2dms(pts->HA/15., &d[2], &m[2], &s[2]) < 0) sgn[2] = "-"; if(deg2dms(pts->Dec, &d[3], &m[3], &s[3]) < 0) sgn[3] = "-"; for(int i = 0; i < 4; ++i) if(show[i]) snprintf(str[i], 31, "%s%02d%s%02d%s%02d", sgn[i], d[i], delim, m[i], delim, s[i]); tee(f, "%-6d", i); for(int i = 0; i < 4; ++i){ if(show[i]) tee(f, "%14s", str[i]); } tee(f, "\n"); } } int main(int argc, char **argv){ initial_setup(); glob_pars *G = parse_args(argc, argv); FILE *f = NULL; if(G->outfile){ f = fopen(G->outfile, "w"); if(!f) ERR("Can't open %s", G->outfile); } if(G->Npts < 10) ERRX("Need at least 10 points"); if(!set_Zlimits(G->Zmin, G->Zmax)) ERRX("Wrong Z limits"); if(G->sorting && !set_sorting(G->sorting, G->sortcoord)){ show_sorting_help(); return 1; } int mask = 0x0f; for(int i = 0; i < 4; ++i){ if(G->hide[i]) mask &= ~(1<Npts; point *points = getPoints(&N); if(!points) ERRX("Can't calculate"); green("%d -> %d\n", G->Npts, N); savepoints(f, points, N, G->delimeter, mask); if(f) fclose(f); return 0; }