#include<stdio.h>
#include<limits.h>
#include<math.h>
struct point
{
float x1;
float y1;
};
float findratio(float x,float y, struct point *a)
{
if(x!=a[0].x1)
{
return (a[1].x1-x)/(x-a[0].x1);
}
else
{
return (a[1].y1-y)/(y-a[0].y1);
}
}
float findratioSlopesame(struct point * a, struct point* b)
{
float m;
m=findratio(a[0].x1,a[0].y1,b);
if(m>0)
return m;
m=findratio(a[1].x1,a[1].y1,b);
if(m>0)
return m;
m=findratio(b[0].x1,b[0].y1,a);
if(m>0)
return m;
m=findratio(b[0].x1,b[0].y1,a);
if(m>0)
return m;
return -1;
}
float findslope(struct point *a)
{
if(a[0].x1==a[1].x1)
{
return INFINITY;
}
else
{
return (a[1].y1-a[0].y1)/(a[1].x1-a[0].x1);
}
}
int check (struct point *a, struct point *b)
{
if((a[0].y1<=b[0].y1&& a[0].y1>=b[1].y1)||(a[1].y1<=b[0].y1&& a[1].y1>=b[1].y1) )
return 1;
else if((a[0].y1<=b[1].y1&& a[0].y1>=b[0].y1)||(a[1].y1<=b[1].y1&& a[1].y1>=b[0].y1) )
return 1;
return 0;
}
int intersection(struct point *a, struct point *b,struct point *p)
{
float m1=findslope(a);
float m2=findslope(b);
if(m1==INFINITY && m2==INFINITY)
{
if(a[0].x1==b[1].x1)
{
//check whether 1st line contains another line
if(check(a,b)||check(b,a))
{
return 1;
}
}
else
{
p->x1=INFINITY;
p->y1=INFINITY;
return 0;
}
}
else if (m1!=INFINITY && m2!=INFINITY && m1!=m2)
{
float x=(b[0].y1-a[0].y1-(m2*b[0].x1)+(m1*a[0].x1))/(m1-m2);
float y=a[0].y1+m1*(x-a[0].x1);
p->x1=x;
p->y1=y;
if(findratio(x,y,a)>=0 && findratio(x,y,b)>=0)
return 1;
else
return 0;
}
else if (m1==m2)
{
//y=mx+c1 y=mx+c2 checking c1-c2
float x=a[0].y1-m1*a[0].x1;
float y=b[0].y1-m1*b[0].x1;
if(x!=y)
return 0;
if((a[0].x1==b[0].x1 && a[0].y1==b[0].y1)||(a[1].x1==b[0].x1 && a[1].y1==b[0].y1)||(a[0].x1==b[1].x1 && a[0].y1==b[1].y1)||(a[1].x1==b[1].x1 && a[1].y1==b[1].y1))
return 1;
if(findratioSlopesame(a,b)>0||findratioSlopesame(b,a)>0)
return 1;
return 0;
}
else if(m1!=m2)
{
if(m1==INFINITY)
{
float x=a[0].x1;
float y=b[0].y1+m2*(x-b[0].x1);
if((x==a[0].x1&& y==a[0].y1)||(x==a[1].x1&& y==a[1].y1)||(x==b[0].x1&& y==b[0].y1)||(x==b[1].x1&& y==b[1].y1))
{
return 1;
}
if(findratio(x,y,a)>0|| findratio(x,y,b)>0)
return 1;
else
return 0;
}
else if (m2==INFINITY)
{
float x=b[0].x1;
float y=a[0].y1+m1*(x-a[0].x1);
if((x==a[0].x1&& y==a[0].y1)||(x==a[1].x1&& y==a[1].y1)||(x==b[0].x1&& y==b[0].y1)||(x==b[1].x1&& y==b[1].y1))
{
return 1;
}
if(findratio(x,y,a)>0|| findratio(x,y,b)>0)
return 1;
else
return 0;
}
}
}
int main()
{
struct point l1[2];
struct point l2[2];
scanf("%f %f %f %f",&l1
[0].
x1,&l1
[0].
y1,&l1
[1].
x1,&l1
[1].
y1);
scanf("%f %f %f %f",&l2
[0].
x1,&l2
[0].
y1,&l2
[1].
x1,&l2
[1].
y1); //findintersection
// tells the
struct point p;
int result=intersection(l1,l2,&p);
if(result==0)
{
}
else
{
}
return 0;
}
I2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8bGltaXRzLmg+CiNpbmNsdWRlPG1hdGguaD4Kc3RydWN0IHBvaW50CnsKCWZsb2F0IHgxOwoJZmxvYXQgeTE7Cn07CgpmbG9hdCBmaW5kcmF0aW8oZmxvYXQgeCxmbG9hdCB5LCBzdHJ1Y3QgcG9pbnQgKmEpCnsKCWlmKHghPWFbMF0ueDEpCgl7CglyZXR1cm4gKGFbMV0ueDEteCkvKHgtYVswXS54MSk7CQoJfQoJZWxzZSAKCXsKCXJldHVybiAoYVsxXS55MS15KS8oeS1hWzBdLnkxKTsKCX0JCn0KZmxvYXQgZmluZHJhdGlvU2xvcGVzYW1lKHN0cnVjdCBwb2ludCAqIGEsIHN0cnVjdCBwb2ludCogYikKewoJZmxvYXQgbTsKCW09ZmluZHJhdGlvKGFbMF0ueDEsYVswXS55MSxiKTsKCWlmKG0+MCkKCXJldHVybiBtOwoJbT1maW5kcmF0aW8oYVsxXS54MSxhWzFdLnkxLGIpOwoJaWYobT4wKQoJcmV0dXJuIG07CgltPWZpbmRyYXRpbyhiWzBdLngxLGJbMF0ueTEsYSk7CglpZihtPjApCglyZXR1cm4gbTsKCW09ZmluZHJhdGlvKGJbMF0ueDEsYlswXS55MSxhKTsKCWlmKG0+MCkKCXJldHVybiBtOwoJcmV0dXJuIC0xOwoJCn0KZmxvYXQgZmluZHNsb3BlKHN0cnVjdCBwb2ludCAqYSkKewoJaWYoYVswXS54MT09YVsxXS54MSkKCXsKCQlyZXR1cm4gSU5GSU5JVFk7Cgl9CgllbHNlCgl7CgkJcmV0dXJuIChhWzFdLnkxLWFbMF0ueTEpLyhhWzFdLngxLWFbMF0ueDEpOwoJfQp9CmludCBjaGVjayAoc3RydWN0IHBvaW50ICphLCBzdHJ1Y3QgcG9pbnQgKmIpCnsKCWlmKChhWzBdLnkxPD1iWzBdLnkxJiYgYVswXS55MT49YlsxXS55MSl8fChhWzFdLnkxPD1iWzBdLnkxJiYgYVsxXS55MT49YlsxXS55MSkgKQoJcmV0dXJuIDE7CgllbHNlIGlmKChhWzBdLnkxPD1iWzFdLnkxJiYgYVswXS55MT49YlswXS55MSl8fChhWzFdLnkxPD1iWzFdLnkxJiYgYVsxXS55MT49YlswXS55MSkgKQoJcmV0dXJuIDE7CglyZXR1cm4gMDsKfQppbnQgaW50ZXJzZWN0aW9uKHN0cnVjdCBwb2ludCAqYSwgc3RydWN0IHBvaW50ICpiLHN0cnVjdCBwb2ludCAqcCkKewpmbG9hdCBtMT1maW5kc2xvcGUoYSk7CmZsb2F0IG0yPWZpbmRzbG9wZShiKTsKCmlmKG0xPT1JTkZJTklUWSAmJiBtMj09SU5GSU5JVFkpCnsKCglpZihhWzBdLngxPT1iWzFdLngxKQoJewoJCS8vY2hlY2sgd2hldGhlciAxc3QgbGluZSBjb250YWlucyBhbm90aGVyIGxpbmUgCgoJCWlmKGNoZWNrKGEsYil8fGNoZWNrKGIsYSkpCgkJewoJCQlyZXR1cm4gMTsKCQl9Cgl9CgllbHNlCgl7CgkJcC0+eDE9SU5GSU5JVFk7CgkJcC0+eTE9SU5GSU5JVFk7CgkJcmV0dXJuIDA7Cgl9Cgp9CgplbHNlIGlmIChtMSE9SU5GSU5JVFkgJiYgbTIhPUlORklOSVRZICYmIG0xIT1tMikKewoKCWZsb2F0IHg9KGJbMF0ueTEtYVswXS55MS0obTIqYlswXS54MSkrKG0xKmFbMF0ueDEpKS8obTEtbTIpOwoJZmxvYXQgeT1hWzBdLnkxK20xKih4LWFbMF0ueDEpOwoJcC0+eDE9eDsKCXAtPnkxPXk7CglpZihmaW5kcmF0aW8oeCx5LGEpPj0wICYmIGZpbmRyYXRpbyh4LHksYik+PTApCglyZXR1cm4gMTsKCWVsc2UgCglyZXR1cm4gMDsKCQp9IAplbHNlIGlmIChtMT09bTIpCnsKCS8veT1teCtjMSB5PW14K2MyIGNoZWNraW5nIGMxLWMyCglmbG9hdCB4PWFbMF0ueTEtbTEqYVswXS54MTsKCWZsb2F0IHk9YlswXS55MS1tMSpiWzBdLngxOwoJaWYoeCE9eSkKCXJldHVybiAwOwoJaWYoKGFbMF0ueDE9PWJbMF0ueDEgJiYgYVswXS55MT09YlswXS55MSl8fChhWzFdLngxPT1iWzBdLngxICYmIGFbMV0ueTE9PWJbMF0ueTEpfHwoYVswXS54MT09YlsxXS54MSAmJiBhWzBdLnkxPT1iWzFdLnkxKXx8KGFbMV0ueDE9PWJbMV0ueDEgJiYgYVsxXS55MT09YlsxXS55MSkpCglyZXR1cm4gMTsKIAlpZihmaW5kcmF0aW9TbG9wZXNhbWUoYSxiKT4wfHxmaW5kcmF0aW9TbG9wZXNhbWUoYixhKT4wKQoJcmV0dXJuIDE7CglyZXR1cm4gMDsKfQplbHNlIGlmKG0xIT1tMikKewoJaWYobTE9PUlORklOSVRZKQoJewoJCgkJZmxvYXQgeD1hWzBdLngxOwoJCWZsb2F0IHk9YlswXS55MSttMiooeC1iWzBdLngxKTsKCQlpZigoeD09YVswXS54MSYmIHk9PWFbMF0ueTEpfHwoeD09YVsxXS54MSYmIHk9PWFbMV0ueTEpfHwoeD09YlswXS54MSYmIHk9PWJbMF0ueTEpfHwoeD09YlsxXS54MSYmIHk9PWJbMV0ueTEpKQoJCXsKCQkJcmV0dXJuIDE7CgkJfQoJCWlmKGZpbmRyYXRpbyh4LHksYSk+MHx8IGZpbmRyYXRpbyh4LHksYik+MCkKCQlyZXR1cm4gMTsKCQllbHNlIAoJCXJldHVybiAwOwoJfQoJZWxzZSBpZiAobTI9PUlORklOSVRZKQoJewoJCWZsb2F0IHg9YlswXS54MTsKCQlmbG9hdCB5PWFbMF0ueTErbTEqKHgtYVswXS54MSk7CgkJaWYoKHg9PWFbMF0ueDEmJiB5PT1hWzBdLnkxKXx8KHg9PWFbMV0ueDEmJiB5PT1hWzFdLnkxKXx8KHg9PWJbMF0ueDEmJiB5PT1iWzBdLnkxKXx8KHg9PWJbMV0ueDEmJiB5PT1iWzFdLnkxKSkKCQl7CgkJCXJldHVybiAxOwoJCX0KCQlpZihmaW5kcmF0aW8oeCx5LGEpPjB8fCBmaW5kcmF0aW8oeCx5LGIpPjApCgkJcmV0dXJuIDE7CgkJZWxzZSAKCQlyZXR1cm4gMDsKCX0KCQp9CgkJCn0KCgppbnQgbWFpbigpCnsKCXN0cnVjdCBwb2ludCBsMVsyXTsKCXN0cnVjdCBwb2ludCBsMlsyXTsKCXNjYW5mKCIlZiAlZiAlZiAlZiIsJmwxWzBdLngxLCZsMVswXS55MSwmbDFbMV0ueDEsJmwxWzFdLnkxKTsKCQoJc2NhbmYoIiVmICVmICVmICVmIiwmbDJbMF0ueDEsJmwyWzBdLnkxLCZsMlsxXS54MSwmbDJbMV0ueTEpOwoJLy9maW5kaW50ZXJzZWN0aW9uCgkvLyB0ZWxscyB0aGUgCglzdHJ1Y3QgcG9pbnQgcDsKCWludCByZXN1bHQ9aW50ZXJzZWN0aW9uKGwxLGwyLCZwKTsKCWlmKHJlc3VsdD09MCkKCXsKCQlwcmludGYoIlxuTm8iKTsKCX0KCWVsc2UKCXsKCQkJcHJpbnRmKCJcblllcyIpOwoJfQoJcmV0dXJuIDA7Cn0=