uva 378Intersecting Lines

題意:判斷兩條直線之間的關係,相交,平行,或者同一條直線,相交的話給出交點
解題:數學問題,分情況討論:先判斷直線之間的關係,利用向量叉積不爲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;
}


發佈了55 篇原創文章 · 獲贊 8 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章