Beispiel #1
0
bool Rect::queryOnLine(point_t v1, point_t v2) {
	//checks each edge of rect to see if line intersects
	return (lineSegmentsIntersect({x,y},{x+w,y},v1,v2) ||
			lineSegmentsIntersect({x,y},{x,y+h},v1,v2) ||
			lineSegmentsIntersect({x,y+h},{x+w,y+h},v1,v2) ||
			lineSegmentsIntersect({x+w,y},{x+w,y+h},v1,v2) ||

			//checks if line contained within rect
			queryContains(v1.getX(),v1.getY()));
}
Beispiel #2
0
point_t Rect::getContactPointOnLine(point_t v1, point_t v2) {
	point_t closest;
	float dist=std::numeric_limits<float>::max();
	if (lineSegmentsIntersect({x,y},{x+w,y},v1,v2)) {
		point_t trial = lineSegmentsIntersectCoord(v1,v2,{x,y},{x+w,y});
		float dist_trial = (trial-v1).getMagnitude();
		if (dist_trial<dist) {
			closest=trial;
			dist=dist_trial;
		}
	}
	if (lineSegmentsIntersect({x,y},{x,y+h},v1,v2)) {
		point_t trial = lineSegmentsIntersectCoord(v1,v2,{x,y},{x,y+h});
		float dist_trial = (trial-v1).getMagnitude();
		if (dist_trial<dist) {
			closest=trial;
			dist=dist_trial;
		}
	}
	if (lineSegmentsIntersect({x,y+h},{x+w,y+h},v1,v2)) {
		point_t trial = lineSegmentsIntersectCoord(v1,v2,{x,y+h},{x+w,y+h});
		float dist_trial = (trial-v1).getMagnitude();
		if (dist_trial<dist) {
			closest=trial;
			dist=dist_trial;
		}
	}
	if (lineSegmentsIntersect({x+w,y},{x+w,y+h},v1,v2)) {
		point_t trial = lineSegmentsIntersectCoord(v1,v2,{x+w,y},{x+w,y+h});
		float dist_trial = (trial-v1).getMagnitude();
		if (dist_trial<dist) {
			closest=trial;
			dist=dist_trial;
		}
	}
	if (dist==std::numeric_limits<float>::max())
		return v1;
	return closest;
}
Beispiel #3
0
int polygon_overlap(Poly *p1, Poly *p2)
{
  // loop over each pair of line segments, testing for intersection
  int i, j;
  for (i=0; i<p1->n-1; ++i) {
    for (j=0; j<p2->n-1; ++j) {
      if (lineSegmentsIntersect(
            p1->x[i], p1->y[i], p1->x[i+1], p1->y[i+1],
            p2->x[j], p2->y[j], p2->x[j+1], p2->y[j+1]))
      {
        return TRUE;
      }
    }
  }
  
  // test for containment: p2 in p1
  int all_in=TRUE;
  for (i=0; i<p2->n; ++i) {
    if (!point_in_polygon(p1, p2->x[i], p2->y[i])) {
      all_in=FALSE;
      break;
    }
  }
  
  if (all_in)
    return TRUE;
  
  // test for containment: p1 in p2
  all_in = TRUE;
  for (i=0; i<p1->n; ++i) {
    if (!point_in_polygon(p2, p1->x[i], p1->y[i])) {
      all_in=FALSE;
      break;
    }
  }
  
  if (all_in)
    return TRUE;
  
  // no overlap
  return FALSE;  
}
Beispiel #4
0
// return TRUE if there is any overlap between the two scenes
static int test_overlap(meta_parameters *meta1, meta_parameters *meta2)
{
    if (!meta_is_valid_double(meta1->general->center_longitude)) {
        int nl = meta1->general->line_count;
        int ns = meta1->general->sample_count;

        meta_get_latLon(meta1, nl/2, ns/2, 0,
            &meta1->general->center_latitude,
            &meta1->general->center_longitude);
    }

    if (!meta_is_valid_double(meta2->general->center_longitude)) {
        int nl = meta2->general->line_count;
        int ns = meta2->general->sample_count;

        meta_get_latLon(meta2, nl/2, ns/2, 0,
            &meta2->general->center_latitude,
            &meta2->general->center_longitude);
    }

    int zone1 = utm_zone(meta1->general->center_longitude);
    int zone2 = utm_zone(meta2->general->center_longitude);

    // if zone1 & zone2 differ by more than 1, we can stop now
    if (iabs(zone1-zone2) > 1) {
        return FALSE;
    }

    // The Plan:
    // Generate polygons for each metadata, then test of any pair of
    // line segments between the polygons intersect.

    // Other possibility: meta1 is completely contained within meta2,
    // or the reverse.

    // corners of meta1.
    double xp_1[5], yp_1[5];

    if (meta1->location) {
        // use the location block if available
        latLon2UTM_zone(meta1->location->lat_start_near_range,
            meta1->location->lon_start_near_range, 0, zone1, &xp_1[0], &yp_1[0]);
        latLon2UTM_zone(meta1->location->lat_start_far_range,
            meta1->location->lon_start_far_range, 0, zone1, &xp_1[1], &yp_1[1]);
        latLon2UTM_zone(meta1->location->lat_end_far_range,
            meta1->location->lon_end_far_range, 0, zone1, &xp_1[2], &yp_1[2]);
        latLon2UTM_zone(meta1->location->lat_end_near_range,
            meta1->location->lon_end_near_range, 0, zone1, &xp_1[3], &yp_1[3]);
    } else {
        double lat, lon;
        int nl1 = meta1->general->line_count;
        int ns1 = meta1->general->sample_count;

        // must call meta_get_latLon for each corner
        meta_get_latLon(meta1, 0, 0, 0, &lat, &lon);
        latLon2UTM_zone(lat, lon, 0, zone1, &xp_1[0], &yp_1[0]);

        meta_get_latLon(meta1, nl1-1, 0, 0, &lat, &lon);
        latLon2UTM_zone(lat, lon, 0, zone1, &xp_1[1], &yp_1[1]);

        meta_get_latLon(meta1, nl1-1, ns1-1, 0, &lat, &lon);
        latLon2UTM_zone(lat, lon, 0, zone1, &xp_1[2], &yp_1[2]);

        meta_get_latLon(meta1, 0, ns1-1, 0, &lat, &lon);
        latLon2UTM_zone(lat, lon, 0, zone1, &xp_1[3], &yp_1[3]);
    }

    // close the polygon
    xp_1[4] = xp_1[0];
    yp_1[4] = yp_1[0];

    // corners of meta2.
    double xp_2[5], yp_2[5];

    if (meta2->location) {
        // use the location block if available
        latLon2UTM_zone(meta2->location->lat_start_near_range,
            meta2->location->lon_start_near_range, 0, zone1, &xp_2[0], &yp_2[0]);
        latLon2UTM_zone(meta2->location->lat_start_far_range,
            meta2->location->lon_start_far_range, 0, zone1, &xp_2[1], &yp_2[1]);
        latLon2UTM_zone(meta2->location->lat_end_far_range,
            meta2->location->lon_end_far_range, 0, zone1, &xp_2[2], &yp_2[2]);
        latLon2UTM_zone(meta2->location->lat_end_near_range,
            meta2->location->lon_end_near_range, 0, zone1, &xp_2[3], &yp_2[3]);
    } else {
        double lat, lon;
        int nl2 = meta2->general->line_count;
        int ns2 = meta2->general->sample_count;

        // must call meta_get_latLon for each corner
        meta_get_latLon(meta2, 0, 0, 0, &lat, &lon);
        latLon2UTM_zone(lat, lon, 0, zone1, &xp_2[0], &yp_2[0]);

        meta_get_latLon(meta2, nl2-1, 0, 0, &lat, &lon);
        latLon2UTM_zone(lat, lon, 0, zone1, &xp_2[1], &yp_2[1]);

        meta_get_latLon(meta2, nl2-1, ns2-1, 0, &lat, &lon);
        latLon2UTM_zone(lat, lon, 0, zone1, &xp_2[2], &yp_2[2]);

        meta_get_latLon(meta2, 0, ns2-1, 0, &lat, &lon);
        latLon2UTM_zone(lat, lon, 0, zone1, &xp_2[3], &yp_2[3]);
    }

    // close the polygon
    xp_2[4] = xp_2[0];
    yp_2[4] = yp_2[0];

    // loop over each pair of line segments, testing for intersection
    int i, j;
    for (i = 0; i < 4; ++i) {
        for (j = 0; j < 4; ++j) {
            if (lineSegmentsIntersect(
                xp_1[i], yp_1[i], xp_1[i+1], yp_1[i+1],
                xp_2[j], yp_2[j], xp_2[j+1], yp_2[j+1]))
            {
                return TRUE;
            }
        }
    }

    // test for containment: meta2 in meta1
    int all_in=TRUE;
    for (i=0; i<4; ++i) {
        if (!pnpoly(5, xp_1, yp_1, xp_2[i], yp_2[i])) {
            all_in=FALSE;
            break;
        }
    }

    if (all_in)
        return TRUE;

    // test for containment: meta1 in meta2
    all_in = TRUE;
    for (i=0; i<4; ++i) {
        if (!pnpoly(5, xp_2, yp_2, xp_1[i], yp_1[i])) {
            all_in=FALSE;
            break;
        }
    }

    if (all_in)
        return TRUE;

    // no overlap
    return FALSE;
}