58 void h3c_init_poly(h3c_poly *qp,
int n)
60 qp->ra = malloc(n *
sizeof(h3c_coord_t));
61 qp->dec = malloc(n *
sizeof(h3c_coord_t));
63 qp->ax = malloc(n *
sizeof(h3c_coord_t));
64 qp->ay = malloc(n *
sizeof(h3c_coord_t));
66 qp->x = malloc(n *
sizeof(h3c_coord_t));
67 qp->y = malloc(n *
sizeof(h3c_coord_t));
71 static void h3c_prepare_poly(h3c_poly *qp)
75 h3c_coord_t *ax = qp->ax;
76 h3c_coord_t *ay = qp->ay;
77 h3c_coord_t *x = qp->x;
78 h3c_coord_t *y = qp->y;
80 for(i = 0 ; i < n; i++)
82 ax[i] = x[i + 1] - x[i];
83 ay[i] = y[i + 1] - y[i];
91 static void ang2ipix_xy ( h3c_coord_t ra, h3c_coord_t dec,
92 char *out_face_num, h3c_coord_t *x_out,
97 h3c_coord_t x0 = 0,y0 = 0;
121 face_num = fmod ((ra + 45) / 90, 4);
123 x0 = tan (H3C_DEGRA * (ra - 90 * (h3c_coord_t)face_num));
124 y0 = tan (dec * H3C_DEGRA) /
125 cos (H3C_DEGRA * (ra - 90 * (h3c_coord_t)face_num));
131 x0 = sin (H3C_DEGRA * ra) / tan (H3C_DEGRA * dec);
132 y0 = -1*cos (H3C_DEGRA * ra) / tan (H3C_DEGRA * dec);
137 x0 = -1*sin (H3C_DEGRA * ra) / tan (H3C_DEGRA * dec);
138 y0 = -1*cos (H3C_DEGRA * ra) / tan (H3C_DEGRA * dec);
152 xi = (q3c_ipix_t)(x0 * nside);
153 yi = (q3c_ipix_t)(y0 * nside);
165 i1 = 1 << (Q3C_INTERLEAVED_NBITS);
169 *ipix = ((q3c_ipix_t)face_num) * nside * nside + xbits[xi % i1] +
174 *ipix = ((q3c_ipix_t)face_num) * nside * nside + xbits[xi % i1] +
175 ybits[yi % i1] + (xbits[(xi >> Q3C_INTERLEAVED_NBITS) % i1] +
176 ybits[(yi >> Q3C_INTERLEAVED_NBITS) % i1]) * i1 * i1;
180 *out_face_num = face_num;
183 static int h3c_check_point_in_poly(h3c_poly *qp, h3c_coord_t x0,
188 h3c_coord_t *y = qp->y;
189 h3c_coord_t *x = qp->x;
190 h3c_coord_t *ax = qp->ax;
191 h3c_coord_t *ay = qp->ay;
192 int result = !H3C_DISJUNCT;
195 if (((y0<=y[i])==(y0>y[(i+1)%n])) &&
196 ((x0-x[i])<(y0-y[i])*ax[i]/ay[i]))
204 static void h3c_get_minmax_poly(h3c_poly *qp, h3c_coord_t *xmin,
205 h3c_coord_t *xmax, h3c_coord_t *ymin,
210 h3c_coord_t *x = qp->x, *y = qp->y, t;
211 h3c_coord_t xmi, xma, ymi, yma;
218 for(i = 1; i < n; i++)
249 static char h3c_get_facenum(h3c_coord_t ra, h3c_coord_t dec)
266 face_num = fmod ((ra + 45) / 90, 4);
269 y0 = tan(dec * H3C_DEGRA) /
270 cos(H3C_DEGRA * (ra - 90 * (h3c_coord_t)face_num));
287 static char h3c_xy2facenum(h3c_coord_t x, h3c_coord_t y,
char face_num0)
292 h3c_coord_t ra = 0, dec = 0;
298 if ((face_num0 >= 1) && (face_num0 <= 4))
301 dec = H3C_RADEG * atan(y * cos(ra));
302 ra = ra * H3C_RADEG + ((h3c_coord_t)face_num0 - 1) * 90;
305 ra += (h3c_coord_t)360;
312 ra = H3C_RADEG * atan2(x, -y);
313 dec = H3C_RADEG * atan(1 / sqrt(x * x + y * y));
316 ra += (h3c_coord_t)360;
321 ra = H3C_RADEG * atan2(x, y);
322 dec = -H3C_RADEG * atan(1 / sqrt(x * x + y * y));
325 ra += (h3c_coord_t)360;
332 return h3c_get_facenum(ra,dec);
335 static char h3c_get_facenum_poly(h3c_poly *qp)
337 return h3c_get_facenum(qp->ra[0], qp->dec[0]);
340 static void h3c_project_poly(h3c_poly *qp,
char face_num)
342 h3c_coord_t ra1, dec1, tmp0;
343 h3c_coord_t *ra = qp->ra, *dec = qp->dec;
344 h3c_coord_t *x = qp->x, *y = qp->y, x0, y0;
347 if ((face_num > 0) && (face_num < 5))
350 for (i = 0; i < n; i++)
352 ra1 = H3C_DEGRA * (ra[i] - 90 * (h3c_coord_t)face_num);
353 dec1 = H3C_DEGRA * dec[i];
354 x[i] = (tan(ra1)) / 2;
355 y[i] = (tan(dec1) / cos(ra1)) / 2;
359 else if (face_num == 0)
361 for (i = 0; i < n; i++)
363 ra1 = H3C_DEGRA * ra[i];
364 dec1 = H3C_DEGRA * dec[i];
366 tmp0 = 1 / tan(dec1);
368 sincos(ra1, &x0, &y0);
381 for (i = 0; i < n; i++)
383 ra1 = H3C_DEGRA * ra[i];
384 dec1 = H3C_DEGRA * dec[i];
386 tmp0 = 1 / tan(dec1);
388 sincos(ra1, &x0, &y0);
403 static char h3c_poly_intersection_check(h3c_poly *qp,
404 h3c_coord_t xl, h3c_coord_t xr,
405 h3c_coord_t yb, h3c_coord_t yt,
406 h3c_coord_t cur_size)
409 h3c_coord_t *ax = qp->ax;
410 h3c_coord_t *ay = qp->ay;
411 h3c_coord_t *x = qp->x;
412 h3c_coord_t *y = qp->y;
413 h3c_coord_t txl, txr, tyb, tyt, axi, ayi, xi, yi, tmp, tmp1;
415 for( i = 0; i <n ; i++)
427 tmp1 = axi * tmp - txl;
428 if ((tmp >= 0) && (tmp <= 1) && (tmp1 >= 0) && (tmp1 <= cur_size))
435 tmp1 = axi * tmp - txl;
436 if ((tmp >= 0) && (tmp <= 1) && (tmp1 >= 0) && (tmp1 <= cur_size))
443 tmp1 = ayi * tmp - tyb;
444 if ((tmp >= 0) && (tmp <= 1) && (tmp1 >= 0) && (tmp1 <= cur_size))
451 tmp1 = ayi * tmp - tyb;
452 if ((tmp >= 0) && (tmp <= 1) && (tmp1 >= 0) && (tmp1 <= cur_size))
464 int h3c_poly_cover_check(h3c_poly *qp, h3c_coord_t xc_cur,
465 h3c_coord_t yc_cur, h3c_coord_t cur_size)
467 h3c_coord_t xl_cur, xr_cur, yb_cur, yt_cur;
474 xl_cur = xc_cur - cur_size / 2;
475 xr_cur = xc_cur + cur_size / 2;
476 yb_cur = yc_cur - cur_size / 2;
477 yt_cur = yc_cur + cur_size / 2;
483 val = h3c_check_point_in_poly(qp, xl_cur, yb_cur);
484 if (val != H3C_DISJUNCT)
486 goto PARTUNDEF_CHECK01;
489 val = h3c_check_point_in_poly(qp, xr_cur, yb_cur);
490 if (val != H3C_DISJUNCT)
495 val = h3c_check_point_in_poly(qp, xr_cur, yt_cur);
496 if (val != H3C_DISJUNCT)
501 val = h3c_check_point_in_poly(qp, xl_cur, yt_cur);
503 if (val != H3C_DISJUNCT)
509 if (h3c_poly_intersection_check(qp, xl_cur, xr_cur, yb_cur, yt_cur, cur_size)||
510 ((qp->x[0] > xl_cur) && (qp->x[0] < xr_cur) &&
511 (qp->y[0] > yb_cur) && (qp->y[0] < yt_cur)))
523 val = h3c_check_point_in_poly(qp, xr_cur, yb_cur);
524 if (val == H3C_DISJUNCT)
530 val = h3c_check_point_in_poly(qp, xr_cur, yt_cur);
531 if (val == H3C_DISJUNCT)
538 val = h3c_check_point_in_poly(qp, xl_cur, yt_cur);
539 if (val == H3C_DISJUNCT)
550 int h3c_check_sphere_point_in_poly(
int n,
551 h3c_coord_t in_ra[], h3c_coord_t in_dec[],
552 h3c_coord_t ra0, h3c_coord_t dec0)
554 h3c_coord_t xmin,xmax,ymin, ymax;
555 static char faces[6], multi_flag;
557 h3c_coord_t points[4];
558 char face_num, face_num0, cur_face_num;
559 static h3c_coord_t x[3][H3C_MAX_N_POLY_VERTEX], y[3][H3C_MAX_N_POLY_VERTEX],
560 ax[3][H3C_MAX_N_POLY_VERTEX], ay[3][H3C_MAX_N_POLY_VERTEX], x0, y0;
562 int face_count = -1, i;
566 ang2ipix_xy( ra0, dec0, &cur_face_num,&x0, &y0);
572 face_num = h3c_get_facenum_poly(&qp);
580 h3c_project_poly(&qp, face_num);
581 h3c_prepare_poly(&qp);
583 h3c_get_minmax_poly(&qp, &xmin, &xmax, &ymin, &ymax);
590 if (xmin < -H3C_HALF)
592 if (ymin < -H3C_HALF)
617 points[1] = (ymin + ymax) / 2;
627 if (ymin < -H3C_HALF)
652 points[1] = (ymin + ymax) / 2;
660 if (ymin < -H3C_HALF)
662 points[0] = (xmin + xmax) / 2;
671 points[0] = (xmin + xmax) / 2;
684 face_num0 = face_num;
686 for(face_count = 0; face_count <= multi_flag; face_count++)
693 face_num = h3c_xy2facenum(2 * points[2 * face_count - 2],
694 2 * points[2 * face_count - 1], face_num0);
696 faces[face_count] = face_num;
698 qp.x = x[face_count];
699 qp.y = y[face_count];
700 qp.ax = ax[face_count];
701 qp.ay = ay[face_count];
703 h3c_project_poly(&qp, faces[face_count]);
704 h3c_prepare_poly(&qp);
708 for (i = 0; i <= multi_flag; i++)
710 if (faces[i] == cur_face_num)
717 if (i == (multi_flag + 1))
722 qp.x = x[face_count];
723 qp.y = y[face_count];
724 qp.ax = ax[face_count];
725 qp.ay = ay[face_count];
727 return h3c_check_point_in_poly(&qp, x0, y0);