Пример #1
0
bool segments_intersect(segment s1, segment s2) {
	line l1, l2;		/* lines containing the input segments */
	point p;		/* intersection point */

	points_to_line(s1.p1, s1.p2, &l1);
	points_to_line(s2.p1, s2.p2, &l2);

	if(same_lineQ(l1, l2)) 	/* overlapping or disjoint segments */
		return( point_in_box(s1.p1, s2.p1, s2.p2) ||
			point_in_box(s1.p2, s2.p1, s2.p2) ||
			point_in_box(s2.p1, s1.p1, s1.p2) ||
			point_in_box(s2.p2, s1.p1, s1.p2) );

	if(parallelQ(l1, l2)) return(FALSE);

	intersection_point(l1, l2, p);

	return( point_in_box(p, s1.p1, s1.p2) && point_in_box(p, s2.p1, s2.p2) );
}
Пример #2
0
bool segments_intersect(segment s1, segment s2)
{
	line l1, l2;

	points_to_line(s1.p1, s1.p2, &l1);
	points_to_line(s2.p1, s2.p2, &l2);

	if (same_lineQ(l1, l2))
		return (point_in_box(s1.p1, s2.p1, s2.p2) ||
				point_in_box(s1.p2, s2.p1, s2.p2) ||
				point_in_box(s2.p1, s1.p1, s1.p2) ||
				point_in_box(s2.p1, s1.p1, s1.p2) );
	
	if (parallelQ(l1, l2)) 
		return false;
	
	point2d p;		// intersection point
	intersection_point(l1, l2, p);
	return (point_in_box(p, s1.p1, s1.p2) && point_in_box(p, s2.p1, s2.p2) );
}
Пример #3
0
void seek(double* a, int n, int k, int* iz){
	int i, j, h, *qtreeSize, *perm, currIndex, travIndex, *mapping, *sub_iz, sub_n, sub_k, sub_aIndex;
	double radius, *sub_a, tempx, tempy;
	Box **qtree, *curr, **trav;
	Point temp, *points, p, *restricted_points;

	// make points easier to work with.
	points = malloc(n * sizeof(Point));
	for(i = 0; i < 2*n; i+=2){
		temp.x = a[i];
		temp.y = a[i+1];
		temp.index = i/2;
		points[i/2] = temp;
	}

	// init permutation array
	perm = malloc(n * sizeof(int));
	for(i = 0; i < n; i++){
		perm[i] = i;
	}

	// build quad tree
	qtreeSize = malloc(sizeof(int));
	*qtreeSize = 100000;
	qtree = calloc(*qtreeSize, sizeof(Box*));
	build_tree(points, &qtree, qtreeSize, perm, n, k);

	// deeeleeetteee
	tree_built = clock();

	// traverse quad tree for each point.
	for(i = 0; i < n; i++){
		p = points[i];
		curr = qtree[0];
		currIndex = 0;
		// find smallest box (leaf) that holds point.
		while(1){
			if(curr->c1 < 0)
				break;
			else if(point_in_box(p, *(qtree[curr->c1])))
				currIndex = curr->c1;
			else if(point_in_box(p, *(qtree[curr->c2])))
				currIndex = curr->c2;
			else if(point_in_box(p, *(qtree[curr->c3])))
				currIndex = curr->c3;
			else if(point_in_box(p, *(qtree[curr->c4])))
				currIndex = curr->c4;
			curr = qtree[currIndex];
		}

		//generate circle radius, center is Point p.
		radius = gen_radius(p, curr, qtree);

		// init traversal array to all NULL ptrs
		trav = calloc(*qtreeSize, sizeof(Box*));
		travIndex = 1; // index of last element in trav + 1.
		trav[0] = qtree[0];

		// generate sparse arr with only ptrs to leaf's intsct w/ circle
		for(j = 0; j < travIndex; j++){
			if(trav[j]->c1 > -1){ // not a leaf
				trav[travIndex] = qtree[trav[j]->c1];
				trav[travIndex+1] = qtree[trav[j]->c2];
				trav[travIndex+2] = qtree[trav[j]->c3];
				trav[travIndex+3] = qtree[trav[j]->c4];
				travIndex += 4;
				trav[j] = NULL;
			}
			// if box and circle don't overlap, set current ptr to NULL
			else if(!circle_box_intersect(p, radius, *(trav[j]))){
				trav[j] = NULL;
			}
		}

		// compile points from pertinent leafs
		mapping = malloc(n * sizeof(int));
		sub_n = 0;
		sub_a = malloc(2*n * sizeof(double));
		sub_aIndex = 0;
		for(j = 0; j < travIndex; j++){
			if(trav[j]){
				for(h = trav[j]->perm_start; h < trav[j]->perm_end; h++){
					sub_a[sub_aIndex++] = (points[perm[h]]).x;
					sub_a[sub_aIndex++] = (points[perm[h]]).y;
					mapping[sub_n] = perm[h];
					sub_n++;
				}
			}
		}
		sub_iz = malloc(sub_n*k * sizeof(int));

		// printf("n = %d\n", sub_n);

		seek_naive(sub_a, sub_n, k, sub_iz);

		// put pertinent part of sub_iz into iz. for seek_naive
		for(j = 0; j < 2*sub_n; j+=2){
			if(sub_a[j] == p.x && sub_a[j+1] == p.y){ // got it.
				for(h = 0; h < k; h++){
					iz[i*k+h] = mapping[sub_iz[(j/2)*k+h]-1];
				}
				break;
			}
		}

		free(trav);
		free(sub_a);
		free(sub_iz);
		free(mapping);
	}

	// REMEMBER TO INCREMENT INDICES WHEN FINISHED DEVELOPING
	for(i = 0; i < k*n; i++){
		iz[i]++; 
	}

	for(i = 0; i < *qtreeSize; i++){
		if(qtree[i] != NULL)
			free(qtree[i]);
	}
	free(qtree);
	free(qtreeSize);
	free(perm);
	free(points);
}
Пример #4
0
// indexes[0] is start of c1, indexes[1] start of c2, [2] start c3 etc
// points ll and ur gives dimensions of box to split into children and sort.
void sort(int* perm, Point* points, int start, int end, int* indexes, Box c1, Box c2, Box c3, Box c4){
	int *c1_arr, *c2_arr, *c3_arr, *c4_arr, c1ind, c2ind, c3ind, c4ind, i, indSum;
	c1ind = c2ind = c3ind = c4ind = 0;

	c1_arr = malloc(REALLY_BIG_NUMBER * sizeof(int));
	c2_arr = malloc(REALLY_BIG_NUMBER * sizeof(int));
	c3_arr = malloc(REALLY_BIG_NUMBER * sizeof(int));
	c4_arr = malloc(REALLY_BIG_NUMBER * sizeof(int));

	for(i = start; i < end; i++){
		// need else if's otherwise pts included twice.
		if(point_in_box(points[perm[i]], c1)){
			c1_arr[c1ind++] = perm[i];
		}
		else if(point_in_box(points[perm[i]], c2)){
			c2_arr[c2ind++] = perm[i];
		}
		else if(point_in_box(points[perm[i]], c3)){
			c3_arr[c3ind++] = perm[i];
		}
		else if(point_in_box(points[perm[i]], c4)){
			c4_arr[c4ind++] = perm[i];
		}
		else{
			printf("WHOA THERE THE SORT FUNCTION F****D UP!\n");
			exit(1);
		}
	}

	indexes[0] = i = start;
	indSum = start;
	if(c1ind > 0){
		indSum += c1ind;
		for(; i < indSum; i++)
			perm[i] = c1_arr[i-start];
	}

	indexes[1] = i; 
	if(c2ind > 0){
		indSum += c2ind;
		for(; i < indSum; i++)
			perm[i] = c2_arr[i-c1ind-start];
	}

	indexes[2] = i;
	if(c3ind > 0){
		indSum += c3ind;
		for(; i < indSum; i++)
			perm[i] = c3_arr[i-c1ind-c2ind-start];
	}

	indexes[3] = i;
	if(c4ind > 0){
		indSum += c4ind;
		for(; i < indSum; i++)
			perm[i] = c4_arr[i-c1ind-c2ind-c3ind-start];
	}
	indexes[4] = i;

	free(c1_arr);
	free(c2_arr);
	free(c3_arr);
	free(c4_arr);

	return;
}