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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值