42 _h3c_vector *vect_prod;
43 h3c_coord_t center[2];
61 static void h3c_poly_center_xyz(
int n,
68 b[0] = b[1] = b[2] = 0.0;
69 for (i = 0; i < n; i++) {
92 h3c_poly_center_xyz(n, in_ra, in_dec, v);
108 static _h3c_vector *h3c_poly_vect_prod (h3c_coord_t *in_ra,
112 _h3c_vector u, v, *vecp, *p, *q = NULL;
114 vecp=(_h3c_vector *)malloc(
sizeof(_h3c_vector)*n);
115 for (i = 0; i < n; i++) {
116 if (i > 0) { p = q; q = (p==&u)?&v:&u; }
117 else { p = &u; q = &v;
h3c_2xyz(in_ra[0], in_dec[0], *p); }
118 h3c_2xyz(in_ra[(i+1)%n], in_dec[(i+1)%n], *q);
131 static int _h3c_check_sphere_point_in_poly_convex(
int n,
143 if (n<3)
return(
false);
147 h3c_poly_center_xyz(n, in_ra, in_dec,v);
153 for (i = 0; i < n; i++) {
156 if (s<=0)
return H3C_DISJUNCT;
159 if (s>0)
return H3C_DISJUNCT;
163 return !H3C_DISJUNCT;
195 vecp = h3c_poly_vect_prod(in_ra, in_dec, n);
198 ret = _h3c_check_sphere_point_in_poly_convex(n, in_ra, in_dec,
223 h3c_coord_t center[2];
226 center[0], center[1]);
227 return (ret == H3C_DISJUNCT)?0:1;
238 static h3c_ipix_t h3c_ipix2level(h3c_ipix_t ipix,
int order_in,
int order_out)
241 if (order_in < order_out) {
242 for (i = 0; i < order_out-order_in; i++)
247 for (i = 0; i < order_in-order_out; i++)
263 static int h3c_sphere_circle_intersect_poly(
struct h3c_polygon *polygon,
270 h3c_coord_t dist, dist2poly=-1;
275 for (i = 0; i < polygon->nvertex; i++) {
279 if (polygon->ra[i] == polygon->ra[(i+1)%polygon->nvertex]) {
282 dist = (polygon->ra[i])-ra;
289 if (dist < 0) dist = dist*(-1.);
290 if (dist > radius)
continue;
299 if (dist2poly < 0) dist2poly =
h3c_dist(ra, de, polygon->center[0], polygon->center[1]);
300 if (dist2poly <= (polygon->radius+radius))
return 1 ;
322 h3c_coord_t in_dec[],
327 struct h3c_polygon polygon;
331 polygon.dec = in_dec;
335 polygon.vect_prod = h3c_poly_vect_prod(in_ra, in_dec, n);
337 intersect = h3c_sphere_circle_intersect_poly(&polygon, ra0, dec0, radius);
338 free(polygon.vect_prod);
352 static int h3c_polygon_ipix_in_upper_order(
struct h3c_polygon *polygon,
356 h3c_ipix_t ipix, ipix_max;
357 h3c_coord_t theta, phi, ra, de, radius;
360 if (order == polygon->order) {
361 if (polygon->nipix > H3C_DEFAULT_MAX_IPIX)
return 0;
363 H3C_PUSH(polygon->ipix, polygon->nipix, polygon->nalloc, in_ipix)
367 nside = pow(2, order+1);
369 ipix = h3c_ipix2level(in_ipix, order, order+1);
370 ipix_max = h3c_ipix2level(in_ipix+1, order, order+1);
373 for ( ; ipix < ipix_max; ipix++) {
374 h3c_pix2ang_nest(nside, ipix, &theta, &phi);
380 if (_h3c_check_sphere_point_in_poly_convex(polygon->nvertex,
385 polygon->vect_prod) == 1 ) {
387 m = h3c_ipix2level(ipix, order+1, polygon->order);
388 M = h3c_ipix2level(ipix+1, order+1, polygon->order);
390 if (polygon->nipix+(M-m) > H3C_DEFAULT_MAX_IPIX)
return 0;
392 H3C_PUSH(polygon->ipix, polygon->nipix, polygon->nalloc, m)
399 if (h3c_sphere_circle_intersect_poly(polygon, ra, de, radius) == 1){
400 if (!h3c_polygon_ipix_in_upper_order(polygon, order+1, ipix))
432 #define H3C_MIN_NSIDE 8
435 struct h3c_polygon polygon;
436 h3c_ipix_t ipix, max_ipix;
437 h3c_log(H3C_INFO,
"h3c_polygon_ipix nside=%d", nside);
442 H3C_LIST(polygon.ipix, polygon.nalloc)
445 polygon.nside = nside;
448 polygon.dec = in_dec;
453 polygon.vect_prod = h3c_poly_vect_prod(in_ra, in_dec, n);
457 for (i=0; i<n; i++) {
458 h3c_coord_t r =
h3c_dist(polygon.center[0], polygon.center[1],
459 in_ra[i], in_dec[i]);
460 if (polygon.radius < r) polygon.radius = r;
464 for (ipix = 0; ipix < max_ipix; ipix++) {
465 if (!h3c_polygon_ipix_in_upper_order(&polygon, order, ipix)) {
466 h3c_log(H3C_ERROR,
"index needs too much ipix (%d) => abort",
467 H3C_DEFAULT_MAX_IPIX);
468 free(polygon.vect_prod);
474 h3c_log(H3C_INFO,
"(h3c_polygon_ipix) #ipix=%d (%d inside)",
475 polygon.nipix, polygon.ninside);
476 *count = polygon.nipix;
477 free(polygon.vect_prod);
490 static int h3c_big_circle_intersection(_h3c_vector v1,
498 if (v[0] ==0 && v[1] == 0 && v[2] == 0)
return 0;
505 dec[1] = dec[0]*(-1);
506 if (ra[0] >= 180) ra[1] = ra[0] - 180;
507 else ra[1] = ra[0] + 180;
523 static int h3c_point_in_vertex(h3c_coord_t ra, h3c_coord_t dec,
524 h3c_coord_t ra0, h3c_coord_t dec0,
525 h3c_coord_t ra1, h3c_coord_t dec1) {
530 if (dec1 > dec0) { min = dec0*3600; max = dec1*3600; }
531 else { min = dec1*3600; max = dec0*3600; }
535 if (min <= i && i <= max)
return 1;
539 if (ra < 0) ra += 360;
540 if (ra0 < 0) ra0 += 360;
541 if (ra1 < 0) ra1 += 360;
544 r = ra1-ra0;
if (r < 0) r = r*(-1);
545 if (r == 180)
return -1;
549 if (ra1 > ra0) { max = ra0*3600; min = (ra1-360)*3600; }
550 else { max = ra1*3600; min = (ra0-360)*3600; }
553 if (ra1 > ra0) { min = ra0*3600; max = ra1*3600; }
554 else { min = ra1*3600; max = ra0*3600; }
560 if (min <= i && i <= max)
return 1;
576 h3c_coord_t in_ra1[],
577 h3c_coord_t in_dec1[],
579 h3c_coord_t in_ra2[],
580 h3c_coord_t in_dec2[])
582 _h3c_vector *vect_prod1, vect_prod2;
584 h3c_coord_t ra[2], dec[2];
588 vect_prod1 = h3c_poly_vect_prod(in_ra1, in_dec1, n1);
591 h3c_2xyz(in_ra2[0], in_dec2[0], va2[0]);
592 for (i = 0; i < n2; i++) {
593 if (i < n2-1)
h3c_2xyz(in_ra2[i+1], in_dec2[i+1], va2[i+1]);
597 for (j = 0; j < n1; j++) {
598 if ( !h3c_big_circle_intersection(vect_prod2, vect_prod1[j], ra, dec)) {
600 ra[0] = in_ra1[j]; ra[1] = in_ra1[(j+1)%n1];
601 dec[0] = in_dec1[j]; dec[1] = in_dec1[(j+1)%n1];
609 for (k = 0; k < 2; k++) {
613 h3c_log(H3C_INFO,
"ok inside poly2");
615 h3c_log(H3C_INFO,
"ok inside poly1");
620 if (h3c_point_in_vertex(ra[k], dec[k],
621 in_ra1[j], in_dec1[j],
622 in_ra1[(j+1)%n1], in_dec1[(j+1)%n1]) != 1)
624 if (h3c_point_in_vertex(ra[k], dec[k],
625 in_ra2[i], in_dec2[i],
626 in_ra2[(i+1)%n2], in_dec2[(i+1)%n2]) == 1)
655 _h3c_vector *vect = (_h3c_vector *)malloc(
sizeof(_h3c_vector)*n);
658 for (i = 0; i < n; i++)
h3c_2xyz(in_ra[i], in_dec[i], vect[i]);
665 for (i = 1; i < n; i++) {
689 void h3c_box_2_polygon(h3c_coord_t in_ra, h3c_coord_t in_dec,
690 h3c_coord_t width, h3c_coord_t height,
691 h3c_coord_t poly_ra[4], h3c_coord_t poly_dec[4]) {
693 h3c_coord_t center[2];
694 h3c_coord_t border[4][2], b[3];
697 center[0] = in_ra; center[1] = in_dec;
702 border[0][0] = tand(-1*width/2.); border[0][1] = tand(-1*height/2.);
703 border[1][0] = -1*border[0][0] ; border[1][1] = border[0][1];
704 border[2][0] = border[1][0] ; border[2][1] = -1*border[0][1];
705 border[3][0] = border[0][0] ; border[3][1] = border[2][1];
707 for (i=0; i<4; i++) {
709 tr_pu(_PROJ_TAN_, border[i], b);
715 poly_ra[i] = (border[i][0]<180) ? (h3c_coord_t) border[i][0] : (h3c_coord_t) -1*(360-border[i][0]);
716 poly_dec[i] = (h3c_coord_t) border[i][1];
723 void h3c_box_2_polygon(h3c_coord_t in_ra, h3c_coord_t in_dec,
724 h3c_coord_t width, h3c_coord_t height,
725 h3c_coord_t poly_ra[4], h3c_coord_t poly_dec[4]) {
726 poly_ra[0] = in_ra-width/2.; poly_dec[0] = in_dec-height/2.;
727 poly_ra[1] = in_ra+width/2.; poly_dec[1] = poly_dec[0];
728 poly_ra[2] = poly_ra[1] ; poly_dec[2] = in_dec+height/2.;
729 poly_ra[3] = poly_ra[0] ; poly_dec[3] = poly_dec[2];