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) ); }
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) ); }
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"); } }