int main()
{
    int n;
    int r0, r1, r2, r3;

#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
#endif

    scanf("%d", &n);
    while (n-- > 0)
    {
        scanf("%d %d %d %d %d %d %d %d",
              &p0.x, &p0.y, &p1.x, &p1.y,
              &r0, &r1, &r2, &r3);

        rect[0].x = rect[1].x = MIN(r0, r2);
        rect[0].y = rect[3].y = MIN(r1, r3);
        rect[2].x = rect[3].x = MAX(r0, r2);
        rect[1].y = rect[2].y = MAX(r1, r3);


        if (IS_IN_RECT(rect[0].x, rect[2].x, rect[0].y, rect[2].y, p0.x, p0.y)
            || IS_IN_RECT(rect[0].x, rect[2].x, rect[0].y, rect[2].y, p1.x, p1.y))
        {
            SET_INTERSECTION_TRUE;
        }
        else
        {
            if (segments_intersect(rect[0], rect[1], p0, p1) == 1)
                SET_INTERSECTION_TRUE;
            if (segments_intersect(rect[1], rect[2], p0, p1) == 1)
                SET_INTERSECTION_TRUE;
            if (segments_intersect(rect[2], rect[3], p0, p1) == 1)
                SET_INTERSECTION_TRUE;
            if (segments_intersect(rect[0], rect[3], p0, p1) == 1)
                SET_INTERSECTION_TRUE;
        }

       SET_INTERSECTION_FALSE;
    }

#ifndef ONLINE_JUDGE
    system("pause");
#endif
    return 0;
}
Exemplo n.º 2
0
bool path_intersects_path(PathIterator& p1, PathIterator& p2)
{
    typedef agg::conv_curve<PathIterator> curve_t;

    if (p1.total_vertices() < 2 || p2.total_vertices() < 2)
        return false;

    curve_t c1(p1);
    curve_t c2(p2);

    double x11, y11, x12, y12;
    double x21, y21, x22, y22;

    c1.vertex(&x11, &y11);
    while (c1.vertex(&x12, &y12) != agg::path_cmd_stop)
    {
        c2.rewind(0);
        c2.vertex(&x21, &y21);
        while (c2.vertex(&x22, &y22) != agg::path_cmd_stop)
        {
            if (segments_intersect(x11, y11, x12, y12, x21, y21, x22, y22))
                return true;
            x21 = x22;
            y21 = y22;
        }
        x11 = x12;
        y11 = y12;
    }

    return false;
}
Exemplo n.º 3
0
bool
path_intersects_path(PathIterator& p1, PathIterator& p2)
{
    typedef PathNanRemover<PathIterator> no_nans_t;
    typedef agg::conv_curve<no_nans_t> curve_t;

    if (p1.total_vertices() < 2 || p2.total_vertices() < 2)
    {
        return false;
    }

    no_nans_t n1(p1, true, p1.has_curves());
    no_nans_t n2(p2, true, p2.has_curves());

    curve_t c1(n1);
    curve_t c2(n2);

    double x11, y11, x12, y12;
    double x21, y21, x22, y22;

    c1.vertex(&x11, &y11);
    while (c1.vertex(&x12, &y12) != agg::path_cmd_stop)
    {
        c2.rewind(0);
        c2.vertex(&x21, &y21);
        while (c2.vertex(&x22, &y22) != agg::path_cmd_stop)
        {
            if (segments_intersect(x11, y11, x12, y12, x21, y21, x22, y22))
            {
                return true;
            }
            x21 = x22;
            y21 = y22;
        }
        x11 = x12;
        y11 = y12;
    }

    return false;
}
Exemplo n.º 4
0
// Greedily compute a set of nonintersecting edges in a point cloud for testing purposes
// Warning: Takes O(n^3) time.
static Array<Vector<int,2>> greedy_nonintersecting_edges(RawArray<const Vector<real,2>> X, const int limit) {
  const auto E = amap(quantizer(bounding_box(X)),X).copy();
  const int n = E.size();
  Array<Vector<int,2>> edges;
  IntervalScope scope;
  for (const int i : range(n*n)) {
    const int pi = int(random_permute(n*n,key+14,i));
    const int a = pi/n,
              b = pi-n*a;
    if (a < b) {
      const auto Ea = Perturbed2(a,E[a]),
                 Eb = Perturbed2(b,E[b]);
      for (const auto e : edges)
        if (!e.contains(a) && !e.contains(b) && segments_intersect(Ea,Eb,Perturbed2(e.x,E[e.x]),Perturbed2(e.y,E[e.y])))
          goto skip;
      edges.append(vec(a,b));
      if (edges.size()==limit || edges.size()==3*n-6)
        break;
      skip:;
    }
  }
  return edges;
}
Exemplo n.º 5
0
/* Check the polygon for self-intersection */
static int
Poly_check_is_simple(polypaths_planar_overridePolygonObject *self)
{
	polypaths_planar_override_vec2_t **points, **p, *v;
	polypaths_planar_override_vec2_t **open = NULL;
	polypaths_planar_override_vec2_t **o, **next_open;
	const Py_ssize_t size = Py_SIZE(self);
	const Py_ssize_t last_index = size - 1;
	int result = 1;

	points = (polypaths_planar_override_vec2_t **)PyMem_Malloc(
		sizeof(polypaths_planar_override_vec2_t *) * size);
	if (points == NULL) {
		PyErr_NoMemory();
		result = 0;
		goto finish;
	}
	DUP_FIRST_VERT(self);
	p = points;
	for (v = self->vert; v < self->vert + size; ++v) {
		*(p++) = v;
	}
	qsort(points, size, sizeof(polypaths_planar_override_vec2_t *), compare_vec_lexi);	
	open = (polypaths_planar_override_vec2_t **)PyMem_Malloc(
		sizeof(polypaths_planar_override_vec2_t *) * (size + 1));
	if (open == NULL) {
		PyErr_NoMemory();
		result = 0;
		goto finish;
	}

	next_open = open;
	for (p = points; p < points + size; ++p) {
		for (o = open; o < next_open; ++o) {
			if ((*p == (*o)+1) | (*o - *p == last_index)) {
				/* Segment end point */ 
				--next_open;
				if (o < next_open && *o != *next_open) {
					*o = *next_open;
					--o;
				}
			} else if (abs(*p - *o) > 1 && abs(*p - *o) < last_index 
				/* ignore adjacent edges */
				&& segments_intersect(*p, (*p)+1, *o, (*o)+1)) {
				self->flags |= POLY_SIMPLE_KNOWN_FLAG;
				self->flags &= ~POLY_SIMPLE_FLAG;
				goto finish;
			}
		}
		*(next_open++) = *p;
	}
	self->flags |= POLY_SIMPLE_KNOWN_FLAG | POLY_SIMPLE_FLAG;
finish:
	if (open != NULL) {
		PyMem_Free(open);
	}
	if (points != NULL) {
		PyMem_Free(points);
	}
	return result;
}
Exemplo n.º 6
0
main()
{
	point p1,p2,q1,q2,i;
	line l1,l2;
	segment s1,s2,s3,s4;

	while ( scanf("%lf %lf",&p1[X],&p1[Y]) != EOF ) {
        	scanf("%lf %lf",&p2[X],&p2[Y]);
		scanf("%lf %lf",&q1[X],&q1[Y]);
		scanf("%lf %lf",&q2[X],&q2[Y]);

/*
	        print_point(p1);
		print_point(p2);
		print_point(q1);
		print_point(q2);
*/

		points_to_segment(p1,p2,&s1);
		points_to_segment(q1,q2,&s2);

                points_to_line(p1,p2,&l1);
                points_to_line(q1,q2,&l2);

		print_segment(s1);
		print_segment(s2);
		
/*
		printf("slope and line tests\n");
		point_and_slope_to_line(p1,-l1.a,&l3);
		print_line(l3);
                point_and_slope_to_line(p2,-l1.a,&l3);
                print_line(l3);
                point_and_slope_to_line(q1,-l2.a,&l3);
                print_line(l3);
                point_and_slope_to_line(q2,-l2.a,&l3);
                print_line(l3);
*/

		printf("segments_intersect test\n");
		printf("%d\n", segments_intersect(s1,s2));

		printf("intersection point\n");
		intersection_point(l1,l2,i);
		print_point(i);

/*
		printf("closest point\n");
		closest_point(p1,l1,i);
		print_point(i);
                closest_point(p2,l1,i);
                print_point(i);
                closest_point(q1,l1,i);
                print_point(i);
                closest_point(q2,l1,i);
                print_point(i);
                closest_point(p1,l2,i);
                print_point(i);
                closest_point(p2,l2,i);
                print_point(i);
                closest_point(q1,l2,i);
                print_point(i);
                closest_point(q2,l2,i);
                print_point(i);
*/


		printf("--------------------------------\n");
	}


}
Exemplo n.º 7
0
int main(void) {
	int i, j, k;
	
	while(scanf("%d %d %d %d %d", &inicio.x, &inicio.y, &fim.x, &fim.y, &num_obstaculos)) {
		if(inicio.x == 0 && inicio.y == 0 && fim.x == 0 && fim.y == 0 && num_obstaculos == 0) break;

		/* init */
		n = num_obstaculos*2 + 2;
		for(i = 0; i < n; i++)
			for(j = 0; j < n; j++)
				w[i][j] = -1;
		
		/* input */
		for(i = 0; i < num_obstaculos; i++)
			scanf("%d %d %d %d", &obsa[i].x, &obsa[i].y, &obsb[i].x, &obsb[i].y);

		/* processa/modela o grafo */
		/* adjacencia inicio-fim */
		w[INICIO][FIM] = w[FIM][INICIO] = dist(inicio, fim);
		for(i = 0; i < num_obstaculos; i++) {
			if(segments_intersect(inicio, fim, obsa[i], obsb[i])) {
				w[INICIO][FIM] = w[FIM][INICIO] = -1;
				break;
			}
		}
		/* adjacencias inicio-obs */
		for(i = 0; i < num_obstaculos; i++) {
			/* obsa */
			w[INICIO][PONTOA(i)] = w[PONTOA(i)][INICIO] = dist(inicio, obsa[i]);
			for(j = 0; j < num_obstaculos; j++) {
				if(j != i && segments_intersect(inicio, obsa[i], obsa[j], obsb[j])) {
					w[INICIO][PONTOA(i)] = w[PONTOA(i)][INICIO] = -1;
					break;
				}
			}
			/* obsb */
			w[INICIO][PONTOB(i)] = w[PONTOB(i)][INICIO] = dist(inicio, obsb[i]);
			for(j = 0; j < num_obstaculos; j++) {
				if(j != i && segments_intersect(inicio, obsb[i], obsa[j], obsb[j])) {
					w[INICIO][PONTOB(i)] = w[PONTOB(i)][INICIO] = -1;
					break;
				}
			}
		}
		/* adjacencias obs-fim */
		for(i = 0; i < num_obstaculos; i++) {
			/* obsa */
			w[FIM][PONTOA(i)] = w[PONTOA(i)][FIM] = dist(fim, obsa[i]);
			for(j = 0; j < num_obstaculos; j++) {
				if(j != i && segments_intersect(fim, obsa[i], obsa[j], obsb[j])) {
					w[FIM][PONTOA(i)] = w[PONTOA(i)][FIM] = -1;
					break;
				}
			}
			/* obsb */
			w[FIM][PONTOB(i)] = w[PONTOB(i)][FIM] = dist(fim, obsb[i]);
			for(j = 0; j < num_obstaculos; j++) {
				if(j != i && segments_intersect(fim, obsb[i], obsa[j], obsb[j])) {
					w[FIM][PONTOB(i)] = w[PONTOB(i)][FIM] = -1;
					break;
				}
			}
		}
		/* adjacencias obs-obs */
		for(i = 0; i < num_obstaculos; i++) {
			for(j = 0; j < num_obstaculos; j++) {
				/* a-a */
				if(i == j) continue;
				w[PONTOA(i)][PONTOA(j)] = w[PONTOA(j)][PONTOA(i)] = dist(obsa[i], obsa[j]);
				for(k = 0; k < num_obstaculos; k++) {
					if(k != i && k != j && segments_intersect(obsa[i], obsa[j], obsa[k], obsb[k])) {
						w[PONTOA(i)][PONTOA(j)] = w[PONTOA(j)][PONTOA(i)] = -1;
						break;
					}
				}
				/* b-b */
				w[PONTOB(i)][PONTOB(j)] = w[PONTOB(j)][PONTOB(i)] = dist(obsb[i], obsb[j]);
				for(k = 0; k < num_obstaculos; k++) {
					if(k != i && k != j && segments_intersect(obsb[i], obsb[j], obsa[k], obsb[k])) {
						w[PONTOB(i)][PONTOB(j)] = w[PONTOB(j)][PONTOB(i)] = -1;
						break;
					}
				}
				/* a-b */
				w[PONTOA(i)][PONTOB(j)] = w[PONTOB(j)][PONTOA(i)] = dist(obsa[i], obsb[j]);
				for(k = 0; k < num_obstaculos; k++) {
					if(k != i && k != j && segments_intersect(obsa[i], obsb[j], obsa[k], obsb[k])) {
						w[PONTOA(i)][PONTOB(j)] = w[PONTOB(j)][PONTOA(i)] = -1;
						break;
					}
				}
				/* b-a */
				w[PONTOB(i)][PONTOA(j)] = w[PONTOA(j)][PONTOB(i)] = dist(obsb[i], obsa[j]);
				for(k = 0; k < num_obstaculos; k++) {
					if(k != i && k != j && segments_intersect(obsb[i], obsa[j], obsa[k], obsb[k])) {
						w[PONTOB(i)][PONTOA(j)] = w[PONTOA(j)][PONTOB(i)] = -1;
						break;
					}
				}
			}
		}

		/* output */
		printf("%.2lf\n", dijkstra(INICIO, FIM));
	}

	return 0;
}