From d46d43f863908e38a9cda7e9d50e8eb39cb6cc13 Mon Sep 17 00:00:00 2001 From: Liam Girdwood Date: Sat, 5 Jul 2008 11:56:04 +0100 Subject: [PATCH] sky: grid - working fast EQU grid. Zoom broken at low FOV. --- src/sky/grid.c | 680 +++++++++++---------------------------------------- src/sky/projection.c | 4 +- src/sky/projection.h | 6 + 3 files changed, 149 insertions(+), 541 deletions(-) diff --git a/src/sky/grid.c b/src/sky/grid.c index 7c189dc..bbafc4c 100644 --- a/src/sky/grid.c +++ b/src/sky/grid.c @@ -67,503 +67,87 @@ static const gdouble grid_dms_dec[] = { 1.0, }; -/* get grid RA step size for projection in arcsecs */ -static gdouble get_ra_step_delta(struct projection *proj) -{ - gint i; - - for (i = 0; i < nsize(grid_hms_ra); i++) { - if (proj->fov / 1.1 > grid_hms_ra[i] / 3600.0) - return grid_hms_ra[i] / 3600.0; - } - return grid_hms_ra[i] / 3600.0; -} - -/* get grid DEC step size for projection in arcsecs */ -static gdouble get_dec_step_delta(struct projection *proj) -{ - gint i; - - for (i = 0; i < nsize(grid_dms_dec); i++) { - if (proj->fov / 1.1 > grid_dms_dec[i] / 3600.0) - return grid_dms_dec[i] / 3600.0; - } - return grid_dms_dec[i] / 3600.0; -} - -/* clip DEC grid to current projection FOV */ -static void clip_dec_equ_grid(struct projection *proj, gdouble step_size, - gdouble *south, gdouble *north) -{ - *south = proj->centre_dec - proj->fov / 2.0; - if (*south <= -90.0) - *south = -90.0 + step_size; - else - *south = floor(*south / step_size) * step_size; - - *north = proj->centre_dec + proj->fov / 2.0; - if (*north >= 90.0) - *north = 90.0 - step_size; - else - *north = floor(*north / step_size) * step_size; -} - -/* clip RA grid to current projection FOV */ -static void clip_ra_equ_grid(struct projection *proj, gdouble step_size, - gdouble *start, gdouble *end) +static inline int is_tile_visible(struct projection *proj, gint ra, gint dec) { struct render_object robject; - struct ln_equ_posn pos[4]; - gdouble start_, end_; - gint i; - - /* get RA at each projection corner */ - robject.coord[0].x = 0; - robject.coord[0].y = 0; - robject.coord[0].posn = &pos[0]; - proj->trans->proj_to_sky_hrz(proj, &robject.coord[0]); - if (pos[0].ra < 0.0) - pos[0].ra += 360.0; - else if (pos[0].ra >= 360.0) - pos[0].ra -= 360.0; - - robject.coord[0].x = proj->sky_width; - robject.coord[0].y = 0; - robject.coord[0].posn = &pos[1]; - proj->trans->proj_to_sky_hrz(proj, &robject.coord[0]); - if (pos[1].ra < 0.0) - pos[1].ra += 360.0; - else if (pos[1].ra >= 360.0) - pos[1].ra -= 360.0; - - robject.coord[0].x = 0; - robject.coord[0].y = proj->sky_height; - robject.coord[0].posn = &pos[2]; - proj->trans->proj_to_sky_hrz(proj, &robject.coord[0]); - if (pos[2].ra < 0.0) - pos[2].ra += 360.0; - else if (pos[2].ra >= 360.0) - pos[2].ra -= 360.0; - - robject.coord[0].x = proj->sky_width; - robject.coord[0].y = proj->sky_height; - robject.coord[0].posn = &pos[3]; - proj->trans->proj_to_sky_hrz(proj, &robject.coord[0]); - if (pos[3].ra < 0.0) - pos[3].ra += 360.0; - else if (pos[3].ra >= 360.0) - pos[3].ra -= 360.0; - - /* get highest and lowest RA from corners */ - start_ = 360.0; - end_ = 0.0; - for (i = 0; i < 4; i++) { - printf("pos %d ra %3.2f dec %3.2f\n",i, pos[i].ra, pos[i].dec); - if (start_ > pos[i].ra) - start_ = pos[i].ra; - if (end_ < pos[i].ra) - end_ = pos[i].ra; - } - - start_ = floor(start_ / step_size) * step_size; - if (start_ < 0.0) - start_ += 360.0; - else if (start_ >= 360.0) - start_ -= 360.0; - - end_ = ceil(end_ / step_size) * step_size; - if (end_ < 0.0) - end_ += 360.0; - else if (end_ >= 360.0) - end_ -= 360.0; - - if (start_ > end_) { - *start = end_; - *end = start_; - } else { - *start = start_; - *end = end_; - } + struct ln_equ_posn pos; -printf("start %3.2f end %3.2f\n", *start, *end); + pos.ra = ra * 15.0; + pos.dec = -90 + dec * 10.0; + robject.coord[0].posn = &pos; + proj->trans->sky_to_proj_equ(proj, &robject.coord[0]); + return projection_is_visible0(proj, &robject); } -/* should we render a line of this radius as an arc or a straight line */ -static inline gint is_arc_line(struct projection *proj, gdouble radius) +static inline void mark_neighbour_tiles(struct projection *proj, + gint ra, gint dec) { - /* magic number - must refine */ - if (radius > proj->sky_width * ARC_MAGIC || - radius < proj->sky_width * -ARC_MAGIC) { - //printf("%s rad %f\n", __func__, radius); - return 1; - } - return 0; + gint ra_start = ra - 1, ra_end = ra + 1; + gint dec_start = dec - 1, dec_end = dec + 1; + + if (ra_start < 0) + ra_start = GRID_RA_TILES -1; + if (ra_end == GRID_RA_TILES) + ra_end = 0; + if (dec_start < 0) + dec_start = 0; + if (dec_end == GRID_DEC_TILES) + dec_end = GRID_DEC_TILES - 1; + + proj->grid_tile[ra_start][dec_start] = 1; + proj->grid_tile[ra_end][dec_start] = 1; + proj->grid_tile[ra_start][dec_end] = 1; + proj->grid_tile[ra_end][dec_end] = 1; + proj->grid_tile[ra][dec_start] = 1; + proj->grid_tile[ra][dec_end] = 1; + proj->grid_tile[ra_start][dec] = 1; + proj->grid_tile[ra_end][dec] = 1; } -/* is this arc visible in projection */ -static gint is_arc_visible(struct projection *proj, gdouble x, gdouble y, - gdouble radius) +static void get_visible_tiles(struct projection *proj) { - gdouble x1, y1, x2, y2; + gint ra, dec; - /* sanity check */ - if (radius == FP_NAN - || radius == FP_INFINITE - || radius == -FP_INFINITE) { - return 0; + /* clear all tiles first */ + for (ra = 0; ra < GRID_RA_TILES; ra++) { + for (dec = 0; dec < GRID_DEC_TILES; dec++) { + proj->grid_tile[ra][dec] = 0; + } } - - /* create clip area sky size + radius */ - x1 = -radius; - y1 = -radius; - x2 = proj->sky_width + radius; - y2 = proj->sky_height + radius; - - /* are we inside ? */ - if (x >= x1 && x <= x2 && y >= y1 && y <= y2) - return 1; - - return 0; -} - -static inline void do_ra_line(struct render_object *robject, - struct projection *proj, gdouble x, gdouble y, gdouble my) -{ - gdouble x1, y1, x2, y2; - - x1 = x - my * y; - y1 = 0; - x2 = my * (proj->sky_height - y) + x; - y2 = proj->sky_height; - - cairo_move_to(robject->cr, x1, y1); - cairo_line_to(robject->cr, x2, y2); -} - -/* draw a straight RA grid line */ -static inline void draw_ra_line(struct render_object *robject, - struct projection *proj, gdouble step) -{ - struct ln_equ_posn pos1, pos2; - gdouble my; - - /* calc based on small RA line */ - pos1.dec = proj->centre_dec + 1.0; - pos2.dec = proj->centre_dec -1.0; - - pos1.ra = step; - pos2.ra = step + 180.0; - - robject->coord[0].posn = &pos1; - robject->coord[1].posn = &pos2; - - proj->trans->sky_to_proj_equ(proj, &robject->coord[0]); - proj->trans->sky_to_proj_equ(proj, &robject->coord[1]); - - /* calculate line gradient */ - my = (robject->coord[1].x - robject->coord[0].x) / - (robject->coord[1].y - robject->coord[0].y); - - do_ra_line(robject, proj, - robject->coord[0].x, robject->coord[0].y, my); -} - -static inline void do_dec_line(struct render_object *robject, - struct projection *proj, gdouble x, gdouble y, gdouble mx) -{ - gdouble x1, y1, x2, y2; - - x1 = 0; - y1 = y -mx * y; - x2 = proj->sky_width; - y2 = mx * (proj->sky_width - x) + y; - - cairo_move_to(robject->cr, x1, y1); - cairo_line_to(robject->cr, x2, y2); -} - -/* draw a straight DEC grid line */ -static inline void draw_dec_line(struct render_object *robject, - struct projection *proj, gdouble step) -{ - struct ln_equ_posn pos1, pos2; - gdouble mx; - - /* calc based on small DEC line */ - pos1.ra = proj->centre_ra + 1.0; - pos2.ra = proj->centre_ra -1.0; - - pos1.dec = step; - pos2.dec = step; - - robject->coord[0].posn = &pos1; - robject->coord[1].posn = &pos2; - - proj->trans->sky_to_proj_equ(proj, &robject->coord[0]); - proj->trans->sky_to_proj_equ(proj, &robject->coord[1]); - - /* calculate line gradient */ - mx = (robject->coord[1].y - robject->coord[0].y) / - (robject->coord[1].x - robject->coord[0].x); - - do_dec_line(robject, proj, - robject->coord[0].x, robject->coord[0].y, mx); -} - -#if 0 -/* render all visible RA grid lines */ -static void equ_render_ra(struct render_object *robject, - struct projection *proj, gint labels) -{ - gdouble centre_x, centre_y, radius, x, y, step, - step_delta, ra_start, ra_end; - struct ln_equ_posn pos1, pos2; - - pos1.dec = -proj->centre_dec; - pos2.dec = -proj->centre_dec; - - step_delta = get_ra_step_delta(proj); - clip_ra_equ_grid(proj, step_delta, &ra_start, &ra_end); - - for (step = ra_start; step <= ra_end; step += step_delta) { - - pos1.ra = step; - pos2.ra = step + 180.0; - - robject->coord[0].posn = &pos1; - robject->coord[1].posn = &pos2; - - proj->trans->sky_to_proj_equ(proj, &robject->coord[0]); - proj->trans->sky_to_proj_equ(proj, &robject->coord[1]); - centre_x = robject->coord[0].x + - ((robject->coord[1].x - robject->coord[0].x) / 2.0); - centre_y = robject->coord[0].y + - ((robject->coord[1].y - robject->coord[0].y) / 2.0); - x = centre_x - robject->coord[0].x; - y = centre_y - robject->coord[0].y; - radius = sqrt(x * x + y * y); - - if (!is_arc_visible(proj, centre_x, centre_y, radius) && - step != proj->centre_ra) - continue; - -/* need cairo_arc_to() */ -#if 0 - if (step == 0.0 || step == 90.0 || - step == 180.0 || step == 270.0) { - struct ln_equ_posn pos1, pos2; - - pos1.dec = 80.0; - pos2.dec = -80.0; - pos1.ra = step; - pos2.ra = step; - robject->num_coords = 2; - - robject->coord[0].posn = &pos1; - robject->coord[1].posn = &pos2; - proj->trans->sky_to_proj_equ(proj, robject); - - cairo_new_sub_path(robject->cr); - cairo_arc_to(robject->cr, - robject->coord[0].x, robject->coord[0].y, - robject->coord[1].x, robject->coord[1].y, - radius); - } else { - if (is_arc_line(proj, centre_x)) - draw_ra_line(robject, proj, step); - else { - cairo_new_sub_path(robject->cr); - cairo_arc(robject->cr, centre_x, centre_y, - radius, circle_start, circle_end); + for (ra = 0; ra < GRID_RA_TILES; ra++) { + for (dec = 0; dec < GRID_DEC_TILES; dec++) { + + if (is_tile_visible(proj, ra, dec)) { + proj->grid_tile[ra][dec] = 1; + mark_neighbour_tiles(proj, ra, dec); } } -#else - if (is_arc_line(proj, centre_x)) - draw_ra_line(robject, proj, step); - else { - cairo_new_sub_path(robject->cr); - cairo_arc(robject->cr, centre_x, centre_y, - radius, 0, 2 * M_PI); - } -#endif - } -} -#endif - -#if 0 -/* render all visible DEC grid lines */ -static void equ_render_dec(struct render_object *robject, - struct projection *proj, gint labels) -{ - gdouble centre_x, centre_y, radius, x, y, step, - step_delta, dec_start, dec_end; - struct ln_equ_posn pos1, pos2; - - pos1.ra = proj->centre_ra; - pos2.ra = proj->centre_ra + 180.0; - - step_delta = get_dec_step_delta(proj); - clip_dec_equ_grid(proj, step_delta, &dec_start, &dec_end); - - for (step = dec_start; step <= dec_end; step += step_delta) { - - pos1.dec = step; - pos2.dec = step; - - robject->coord[0].posn = &pos1; - robject->coord[1].posn = &pos2; - - proj->trans->sky_to_proj_equ(proj, &robject->coord[0]); - proj->trans->sky_to_proj_equ(proj, &robject->coord[1]); - - centre_x = robject->coord[0].x + - ((robject->coord[1].x - robject->coord[0].x) / 2.0); - centre_y = robject->coord[0].y + - ((robject->coord[1].y - robject->coord[0].y) / 2.0); - x = centre_x - robject->coord[0].x; - y = centre_y - robject->coord[0].y; - radius = sqrt(x * x + y * y); - - if (!is_arc_visible(proj, centre_x, centre_y, radius) && - step != proj->centre_dec) - continue; - - cairo_new_sub_path(robject->cr); - - if (is_arc_line(proj, centre_x)) - draw_dec_line(robject, proj, step); - else - cairo_arc(robject->cr, centre_x, centre_y, - radius, 0, 2 * M_PI); } } -#endif -/* render all visible RA grid lines */ -static void hrz_render_ra(struct render_object *robject, - struct projection *proj, gint labels) +/* get grid RA step size for projection in arcsecs */ +static gdouble get_ra_step_delta(struct projection *proj) { - gdouble centre_x, centre_y, radius, x, y, step, - step_delta, ra_start, ra_end; - struct ln_equ_posn pos1, pos2; - - pos1.dec = -proj->centre_dec; - pos2.dec = -proj->centre_dec; - - step_delta = get_ra_step_delta(proj); - clip_ra_equ_grid(proj, step_delta, &ra_start, &ra_end); - - for (step = ra_start; step <= ra_end; step += step_delta) { - - pos1.ra = step; - pos2.ra = step + 180.0; - - robject->coord[0].posn = &pos1; - robject->coord[1].posn = &pos2; + gint i; - proj->trans->sky_to_proj_hrz(proj, &robject->coord[0]); - proj->trans->sky_to_proj_hrz(proj, &robject->coord[1]); - - centre_x = robject->coord[0].x + - ((robject->coord[1].x - robject->coord[0].x) / 2.0); - centre_y = robject->coord[0].y + - ((robject->coord[1].y - robject->coord[0].y) / 2.0); - x = centre_x - robject->coord[0].x; - y = centre_y - robject->coord[0].y; - radius = sqrt(x * x + y * y); - - if (!is_arc_visible(proj, centre_x, centre_y, radius) && - step != proj->centre_ra) - continue; - -/* need cairo_arc_to() */ -#if 0 - if (step == 0.0 || step == 90.0 || - step == 180.0 || step == 270.0) { - struct ln_equ_posn pos1, pos2; - - pos1.dec = 80.0; - pos2.dec = -80.0; - pos1.ra = step; - pos2.ra = step; - robject->num_coords = 2; - - robject->coord[0].posn = &pos1; - robject->coord[1].posn = &pos2; - proj->trans->sky_to_proj_hrz(proj, robject); - - cairo_new_sub_path(robject->cr); - cairo_arc_to(robject->cr, - robject->coord[0].x, robject->coord[0].y, - robject->coord[1].x, robject->coord[1].y, - radius); - } else { - if (is_arc_line(proj, centre_x)) - draw_ra_line(robject, proj, step); - else { - cairo_new_sub_path(robject->cr); - cairo_arc(robject->cr, centre_x, centre_y, - radius, circle_start, circle_end); - } - } -#else - if (is_arc_line(proj, centre_x)) - draw_ra_line(robject, proj, step); - else { - cairo_new_sub_path(robject->cr); - cairo_arc(robject->cr, centre_x, centre_y, - radius, 0, 2 * M_PI); - } -#endif + for (i = 0; i < nsize(grid_hms_ra); i++) { + if (proj->fov / 1.1 > grid_hms_ra[i] / 3600.0) + return grid_hms_ra[i] / 3600.0; } + return grid_hms_ra[i] / 3600.0; } -/* render all visible DEC grid lines */ -static void hrz_render_dec(struct render_object *robject, - struct projection *proj, gint labels) +/* get grid DEC step size for projection in arcsecs */ +static gdouble get_dec_step_delta(struct projection *proj) { - gdouble centre_x, centre_y, radius, x, y, step, - step_delta, dec_start, dec_end; - struct ln_equ_posn pos1, pos2; - - pos1.ra = proj->centre_ra; - pos2.ra = proj->centre_ra + 180.0; - - step_delta = get_dec_step_delta(proj); - clip_dec_equ_grid(proj, step_delta, &dec_start, &dec_end); - - for (step = dec_start; step <= dec_end; step += step_delta) { - - pos1.dec = step; - pos2.dec = step; - - robject->coord[0].posn = &pos1; - robject->coord[1].posn = &pos2; + gint i; - proj->trans->sky_to_proj_hrz(proj, &robject->coord[0]); - proj->trans->sky_to_proj_hrz(proj, &robject->coord[1]); - - centre_x = robject->coord[0].x + - ((robject->coord[1].x - robject->coord[0].x) / 2.0); - centre_y = robject->coord[0].y + - ((robject->coord[1].y - robject->coord[0].y) / 2.0); - x = centre_x - robject->coord[0].x; - y = centre_y - robject->coord[0].y; - radius = sqrt(x * x + y * y); - - if (!is_arc_visible(proj, centre_x, centre_y, radius) && - step != proj->centre_dec) - continue; - - cairo_new_sub_path(robject->cr); - - if (is_arc_line(proj, centre_x)) - draw_dec_line(robject, proj, step); - else - cairo_arc(robject->cr, centre_x, centre_y, - radius, 0, 2 * M_PI); + for (i = 0; i < nsize(grid_dms_dec); i++) { + if (proj->fov / 1.1 > grid_dms_dec[i] / 3600.0) + return grid_dms_dec[i] / 3600.0; } + return grid_dms_dec[i] / 3600.0; } static void render_dec_labels_at(struct projection *proj, @@ -727,7 +311,7 @@ void equ_render_dec_labels(struct render_object *robject, struct projection *pro pos1.ra = proj->centre_ra; step_delta = get_dec_step_delta(proj); - clip_dec_equ_grid(proj, step_delta, &dec_start, &dec_end); + //clip_dec_equ_grid(proj, step_delta, &dec_start, &dec_end); robject->coord[0].posn = &pos1; for (step = dec_start; step <= dec_end; step += step_delta) { @@ -745,7 +329,7 @@ void equ_render_ra_labels(struct render_object *robject, struct projection *proj pos1.ra = proj->centre_dec; step_delta = get_ra_step_delta(proj); - clip_ra_equ_grid(proj, step_delta, &ra_start, &ra_end); + //clip_ra_equ_grid(proj, step_delta, &ra_start, &ra_end); robject->coord[0].posn = &pos1; for (step = ra_start; step <= ra_end; step += step_delta) { @@ -763,7 +347,7 @@ void hrz_render_dec_labels(struct render_object *robject, struct projection *pro pos1.ra = proj->centre_ra; step_delta = get_dec_step_delta(proj); - clip_dec_equ_grid(proj, step_delta, &dec_start, &dec_end); + //clip_dec_equ_grid(proj, step_delta, &dec_start, &dec_end); robject->coord[0].posn = &pos1; for (step = dec_start; step <= dec_end; step += step_delta) { @@ -781,7 +365,7 @@ void hrz_render_ra_labels(struct render_object *robject, struct projection *proj pos1.ra = proj->centre_dec; step_delta = get_ra_step_delta(proj); - clip_ra_equ_grid(proj, step_delta, &ra_start, &ra_end); + //clip_ra_equ_grid(proj, step_delta, &ra_start, &ra_end); robject->coord[0].posn = &pos1; for (step = ra_start; step <= ra_end; step += step_delta) { @@ -791,77 +375,92 @@ void hrz_render_ra_labels(struct render_object *robject, struct projection *proj } } -static void equ_render_dec(struct render_object *robject, - struct projection *proj, gint labels) +static inline void ra_line(struct render_object *robject, + struct projection *proj, struct ln_equ_posn *pos, + struct ln_equ_posn *end) { - gdouble step, dec_start = -90, dec_end = 90, step_delta; - struct ln_equ_posn pos1; - int start_visible, end_visible; - - step_delta = get_dec_step_delta(proj); - //clip_dec_equ_grid(proj, step_delta, &dec_start, &dec_end); - robject->coord[0].posn = &pos1; - - for (pos1.dec = dec_start; pos1.dec <= dec_end; pos1.dec += step_delta) { - - pos1.ra = 0; + gdouble divs = 5.0;//proj->pixels_per_degree + gdouble step = (end->dec - pos->dec) / divs; +//printf("step %3.2f\n", step); + /* draw to RA end */ + for (pos->dec = pos->dec + step; + pos->dec <= end->dec; pos->dec += step) { +//printf("ra %3.2f dec %3.2f\n", pos->ra, pos->dec); proj->trans->sky_to_proj_equ(proj, &robject->coord[0]); - start_visible = projection_is_visible0(proj, robject); - cairo_move_to(robject->cr, - robject->coord[0].x, - robject->coord[0].y); - - for (step = 5; step <= 360; step += 5) { - pos1.ra = step; - proj->trans->sky_to_proj_equ(proj, &robject->coord[0]); - end_visible = projection_is_visible0(proj, robject); - if (start_visible || end_visible) - cairo_line_to(robject->cr, - robject->coord[0].x, - robject->coord[0].y); - else - cairo_move_to(robject->cr, - robject->coord[0].x, - robject->coord[0].y); - start_visible = end_visible; - } + cairo_line_to(robject->cr, + robject->coord[0].x, robject->coord[0].y); } } -static void equ_render_ra(struct render_object *robject, - struct projection *proj, gint labels) +static inline void dec_line(struct render_object *robject, + struct projection *proj, struct ln_equ_posn *pos, + struct ln_equ_posn *end) { - gdouble step, ra_start =0, ra_end = 360, step_delta; - struct ln_equ_posn pos1; - int start_visible, end_visible; + gdouble divs = 5.0;//proj->pixels_per_degree + gdouble step = (end->ra - pos->ra) / divs; +//printf("step %3.2f\n", step); + /* draw to DEC end */ + for (pos->ra = pos->ra + step; + pos->ra <= end->ra; pos->ra += step) { +//printf("ra %3.2f dec %3.2f\n", pos->ra, pos->dec); + proj->trans->sky_to_proj_equ(proj, &robject->coord[0]); + cairo_line_to(robject->cr, + robject->coord[0].x, robject->coord[0].y); + } +} + +static inline void render_square(struct render_object *robject, + struct projection *proj, gint ra, gint dec) +{ + gdouble ra_step_delta, dec_step_delta; + struct ln_equ_posn pos, start_pos, end_pos; - step_delta = get_ra_step_delta(proj); - //clip_ra_equ_grid(proj, step_delta, &ra_start, &ra_end); - robject->coord[0].posn = &pos1; + ra_step_delta = get_ra_step_delta(proj); + dec_step_delta = get_dec_step_delta(proj); + robject->coord[0].posn = &pos; + + /* start corner */ + start_pos.ra = pos.ra = ra * 15.0; + start_pos.dec = pos.dec = -90.0 + dec * 10.0; - for (pos1.ra = ra_start; pos1.ra <= ra_end; pos1.ra += step_delta) { + /* end corner */ + end_pos.ra = start_pos.ra + 15.0; + end_pos.dec = start_pos.dec + 10.0; - pos1.dec = -80; + /* RA lines */ + for (; pos.ra <= end_pos.ra; pos.ra += ra_step_delta) { + + /* move to RA start */ + pos.dec = start_pos.dec; proj->trans->sky_to_proj_equ(proj, &robject->coord[0]); - start_visible = projection_is_visible0(proj, robject); cairo_move_to(robject->cr, - robject->coord[0].x, - robject->coord[0].y); + robject->coord[0].x, robject->coord[0].y); - for (step = -75; step <= 80; step += 5) { - pos1.dec = step; - proj->trans->sky_to_proj_equ(proj, &robject->coord[0]); - end_visible = projection_is_visible0(proj, robject); - if (start_visible || end_visible) - cairo_line_to(robject->cr, - robject->coord[0].x, - robject->coord[0].y); - else - cairo_move_to(robject->cr, - robject->coord[0].x, - robject->coord[0].y); - start_visible = end_visible; - } + ra_line(robject, proj, &pos, &end_pos); + } + + /* DEC lines */ + for (pos.dec = start_pos.dec; pos.dec <= end_pos.dec; + pos.dec += dec_step_delta) { + + /* move to DEC start */ + pos.ra = start_pos.ra; + proj->trans->sky_to_proj_equ(proj, &robject->coord[0]); + cairo_move_to(robject->cr, + robject->coord[0].x, robject->coord[0].y); + + dec_line(robject, proj, &pos, &end_pos); + } +} + +void equ_render_grid(struct render_object *robject, struct projection *proj) +{ + gint ra, dec; + + for (ra = 0; ra < GRID_RA_TILES; ra++) { + for (dec = 1; dec < GRID_DEC_TILES - 2; dec++) + if (proj->grid_tile[ra][dec]) + render_square(robject, proj, ra, dec); } } @@ -993,16 +592,19 @@ void grid_render(Sky *sky) if (robject->type == RT_FAST) //TODO make step size * 2.0 when fast cairo_set_tolerance (robject->cr, 1.0); + get_visible_tiles(proj); + switch (proj->grid_coords) { case PC_RA_DEC: - equ_render_ra(robject, proj, labels); - equ_render_dec(robject, proj, labels); + //equ_render_ra(robject, proj, labels); + //equ_render_dec(robject, proj, labels); + equ_render_grid(robject, proj); equ_render_dec_labels(robject, proj); equ_render_ra_labels(robject, proj); break; case PC_ALT_AZ: - hrz_render_ra(robject, proj, labels); - hrz_render_dec(robject, proj, labels); + //hrz_render_ra(robject, proj, labels); + //hrz_render_dec(robject, proj, labels); hrz_render_dec_labels(robject, proj); hrz_render_ra_labels(robject, proj); break; diff --git a/src/sky/projection.c b/src/sky/projection.c index b4b4ab3..15ec8ab 100644 --- a/src/sky/projection.c +++ b/src/sky/projection.c @@ -230,8 +230,8 @@ static void move_rel_pixels_hrz(struct projection *projection, dec_offset / projection->pixels_per_degree; break; } - printf("hrz ra %3.2f dec %3.2f\n",projection->centre_ra, - projection->centre_dec); + //printf("hrz ra %3.2f dec %3.2f\n",projection->centre_ra, + // projection->centre_dec); projection_check_bounds(projection); } diff --git a/src/sky/projection.h b/src/sky/projection.h index 25c9626..f26644b 100644 --- a/src/sky/projection.h +++ b/src/sky/projection.h @@ -26,6 +26,9 @@ #include "render.h" #include "settings.h" +#define GRID_DEC_TILES 19 +#define GRID_RA_TILES 24 + enum projection_flip { PF_NONE, PF_TB, @@ -95,6 +98,9 @@ struct projection { gdouble observer_lat_sin; gdouble observer_lat_cos; gdouble hour_angle; + + /* grid */ + int grid_tile[GRID_RA_TILES][GRID_DEC_TILES]; /*!< Visible grid subtiles */ }; extern struct transform transform_flip_none; -- 2.11.4.GIT