POJ - 1269 Intersecting Lines

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lidengdengter/article/details/82024129

题目链接

四个点,判断两条线段位置(共线,平行,相交)

平行:(B.x-A.x)*(D.y-C.y)=(B.y-A.y)*(D.x-D.x)

共线:交叉积(AC,AB)=0,交叉积(AD,AB)=0

相交:设交点为P

         则交叉积(AP,BP)=0,交叉积(CP,DP)=0

         展开为:

                     (A.y-B.y)*P.x+(B.x-A.x)*P.y+A.x*B.y-B.x*A.y=0

                     (C.y-D.y)*P.x+(D.x-C.x)*p.y+C.x*D.y-D.x*C.y=0

           化为二元一次求解即可

#include<cstdio>
#include<cmath>
using namespace std;

struct point{
	double x,y;
}p1,p2,p3,p4; 

double cal(point a,point b,point c){  //交叉积 
	double res=(c.x-a.x)*(b.y-a.y)-(b.x-a.x)*(c.y-a.y);
	return res; 
}

bool para(point a,point b,point c,point d){
	if((b.x-a.x)*(d.y-c.y)==(b.y-a.y)*(d.x-c.x))
		return true;
	return false;
} 

void work(){
	//line
	if(cal(p1,p2,p3)==0&&cal(p1,p2,p4)==0){
		printf("LINE\n");return ;
	}
	//parallel
	else if(para(p1,p2,p3,p4)){
		printf("NONE\n");return ;
	}
	else{
		double a1=p1.y-p2.y,b1=p2.x-p1.x,c1=p1.x*p2.y-p2.x*p1.y;
		double a2=p3.y-p4.y,b2=p4.x-p3.x,c2=p3.x*p4.y-p4.x*p3.y;
		double x0=(c1*b2-c2*b1)/(a2*b1-b2*a1);
		double y0=(c1*a2-c2*a1)/(a1*b2-b1*a2);
		printf("POINT %.2f %.2f\n", x0, y0);
	}
}

int main(){
	int n;
	while(~scanf("%d",&n)){
		printf("INTERSECTING LINES OUTPUT\n");
		
		while(n--){
			scanf("%lf%lf%lf%lf",&p1.x,&p1.y,&p2.x,&p2.y);
			scanf("%lf%lf%lf%lf",&p3.x,&p3.y,&p4.x,&p4.y);
			work();
		}
		
		printf("END OF OUTPUT\n");
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/lidengdengter/article/details/82024129