題意:判斷兩條直線之間的關係,相交,平行,或者同一條直線,相交的話給出交點
解題:數學問題,分情況討論:先判斷直線之間的關係,利用向量叉積不爲0就相交,叉積爲0可能是同一條直線,例如(p1,p2)(p3,p4) ,計算p1,p2),(p1,p3)的叉積,等於0 ,就是同一條直線了,否則,就是平行。接着就是計算兩條相交直線的交點,(肯定有交點了),然後看斜率是否存在,分步討論k1 和 k2 是否存在
代碼:
//uva 378 Intersecting Lines
//AC By Warteac
//2013-5-8
//Runtime:0.009s
#include<iostream>
#include <iomanip>
using namespace std;
////////////////////////////////////////////////////////////////
struct point{
int x,y;
point(int x1 = 0, int y1 = 0){x = x1; y = y1;}
void print(){cout << x << y << endl;}
};//定義點結構體
struct point2{
double x,y;
point2(double x1 = 0,double y1 = 0){x = x1; y = y1;}
void print(){
cout.precision(3);
cout.setf(ios_base::showpoint);//show point
cout << x << " " << y << endl;}
};
int direction(point v1,point v2){
return (v1.x*v2.y-v1.y*v2.x);
}
bool isLine(point p1,point p2,point p3,point p4){
point p(p1.x - p2.x, p1.y - p2.y);
point q(p1.x - p3.x, p1.y - p3.y);
int d = direction(p,q);
if(d) return false;
else return true;
}
int isItersect(point p1,point p2,point p3,point p4){
point p (p1.x - p2.x, p1.y - p2.y);
point q (p3.x - p4.x, p3.y - p4.y);
int d1 = direction(p,q);
if(d1) return 1;//intersect
else if(isLine(p1,p2,p3,p4)) return -1;// a line
else return 0; // parallel
}
point2 intersectPoint(point p1,point p2,point p3,point p4){
if(p1.x == p2.x){//line1 has no slope
double k2 = (double)(p4.y - p3.y)/(p4.x - p3.x);
double b2 = p3.y - k2*p3.x;
int a = p1.x;
double y = k2*a + b2;
return point2(a,y);
}
if(p3.x == p4.x){//line2 has no slope
double k1 = (double)(p2.y - p1.y)/(p2.x - p1.x);
double b1 = p1.y - k1*p1.x;
int b = p3.x;
double y = k1*b + b1;
return point2(b,y);
}
double k1 = (double)(p2.y - p1.y)/(p2.x - p1.x);
double k2 = (double)(p4.y - p3.y)/(p4.x - p3.x);
double b1 = p1.y - k1*p1.x;
double b2 = p3.y - k2*p3.x;
double x3 = (b1 - b2)/(k2 - k1);
double y3 =(k1*b2 - k2*b1)/(k1 - k2);
// cout << k1 << " "<<k2<<" "<<b1 <<" " << b2 <<endl;
return point2(x3,y3);
}
////////////////////////////////////////////////////////////////
int main(){
int caseNum;
cin >> caseNum;
int x1,y1,x2,y2,x3,y3,x4,y4;
cout << "INTERSECTING LINES OUTPUT" << endl;
while(caseNum--){
cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3 >> x4 >> y4;
point p1(x1,y1);
point p2(x2,y2);
point p3(x3,y3);
point p4(x4,y4);
int t = isItersect(p1,p2,p3,p4);
if(t == 1){
point2 r = intersectPoint(p1,p2,p3,p4);
cout << "POINT ";
r.print();
}else if(t == -1)
cout << "LINE" << endl;
else cout << "NONE" <<endl;
}
cout << "END OF OUTPUT" << endl;
return 0;
}