Line Segment Intersection:
1. General Case:
a) (p1, q1, p2) and (p1, q1, q2) have different orientations and
b) (p2, q2, p1) and (p2, q2, q1) have different orientations
2. Special Case
a) (p1, q1, p2), (p1, q1, q2), (p2, q2, p1), and (p2, q2, q1) are all collinear and
b) the x-projections of (p1, q1) and (p2, q2) intersect
c) the y-projections of (p1, q1) and (p2, q2) intersect
To solve the problem floyd warshall algorithm is used.
#include <iostream> using namespace std; struct Point { int x; int y; }; Point P[50]; Point Q[50]; bool gr[50][50]; int orient(Point p,Point q,Point r) { //slope of pq - slope of qr double v = ((p.y-q.y)*(q.x-r.x) - (q.y-r.y)*(p.x-q.x)); if(v==0) return 0; else if(v>0) return 1; else if(v<0) return 2; } bool onlineSeg(Point p,Point q,Point r) { if (r.x <= max(p.x, q.x) && r.x >= min(p.x, q.x) && r.y <= max(p.y, q.y) && r.y >= min(p.y, q.y)) return true; return false; } //y1-mx1-cc =0; bool isConnect(int i,int j) { int a,b,c,d; Point p1,q1,p2,q2; p1 = P[i]; q1 = Q[i]; p2 = P[j]; q2 = Q[j]; a = orient(p1,q1,p2); b = orient(p1,q1,q2); c = orient(p2,q2,p1); d = orient(p2,q2,q1); if(a!=b && c!=d) return 1; if(a == 0 && onlineSeg(p1,q1,p2))//p2 inside of p1q1 return 1; if(b == 0 && onlineSeg(p1,q1,q2))//q2 inside of p1q1 return 1; if(c == 0 && onlineSeg(p2,q2,p1))//q1 inside of p2q2 return 1; if(d == 0 && onlineSeg(p2,q2,q1))//q1 inside of p2q2 return 1; return 0; } int main() { int t,n; double a,b,c,d; bool f=1; cin>>t; while(t--) { cin>>n; for(int i=0;i<n;i++) for(int j=0;j<n;j++) { if(i==j) gr[i][j]=1; else gr[i][j]=0; } for(int i=0;i<n;i++) { cin>>a>>b>>c>>d; P[i].x =a;P[i].y =b; Q[i].x =c;Q[i].y =d; } for(int i=0;i<n;i++) { for(int j=i+1;j<n;j++) { if(isConnect(i,j)) { gr[i][j]=1; gr[j][i]=1; } } } for(int k=0;k<n;k++) { for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(!gr[i][j] && i!=j && j!=k) gr[i][j]=gr[i][k] && gr[k][j]; } } } int p,q; int cnt=0; while(cin>>p) { cin>>q; if(p+q==0) break; //cout<<gr[p-1][q-1]<<"\n"; if(!f) { if(cnt==0) cout<<"\n"; cnt =1; } if(gr[p-1][q-1]) cout<<"CONNECTED\n"; else cout<<"NOT CONNECTED\n"; } f = 0; }//while loop return 0; }