题目来源:http://poj.org/problem?id=1269
分析:
题目大意:给两个点能够确定一条直线,题目给出两条直线(由4个点确定),要求判断出这两条直线的关系:平行,同线,相交。如果相交还要求出交点坐标。
解题思路:
先判断两条直线p1p2, q1q2是否共线, 如果不是,再判断 直线 是否平行, 如果还不是, 则两直线相交。
判断共线: p1p2q1 共线 且 p1p2q2 共线 ,共线用叉乘为 0 来判断,
判断 平行: p1p2 与 q1q2 共线
求交点:
直线p1p2上的点 可表示为 p1+t(p2-p1) , 而交点 又在 直线q1q2上, 所以有 (q2-q1)X (p1 + t(p2-p1 ) - q1 ) =0
解得 交点 t = p1 + ( ((q2-q1) X (q1 - p1)) /( (q2-q1) X(p2-p1) ) *(p2-p1) )
注意: double 型数据为0 不能直接==0
代码如下:
#include <cstdlib> #include <cstring> #include <algorithm> #include <cstdio> #include <cmath> #include <iostream> #include <vector> #include<map> using namespace std; typedef long long ll; const int N =30; const double PI = 3.1415927; const double EPS=1e-10; struct Point{ double x,y; Point(){} Point(double x,double y):x(x),y(y){} // 构造函数,方便代码编写 Point(const Point & p):x(p.x),y(p.y){} Point operator +(Point p){ return Point(x+p.x,y+p.y); } Point operator-(Point p){ return Point(x-p.x,y-p.y); } Point operator*(double d){ return Point(x*d,y*d); } double operator*(Point p){ // 内积 点乘 return x*p.x+ y*p.y; } double operator^(Point p){// 外积 叉乘 return x*p.y-y*p.x; } friend ostream& operator<<(ostream& os,const Point& p ){ os<<p.x<<" "<<p.y<<endl; return os; } friend istream& operator>>(istream& is, Point&p) {// Point 不能是常量,是变量 is>>p.x>>p.y; return is; } double dist(Point p){ return sqrt( (x-p.x)*(x-p.x)+ (y-p.y)*(y-p.y) ); } }; Point intersecting(Point p1,Point p2,Point q1,Point q2){ // 计算直线p1p2与q1q2的交点 double d1=( (q2-q1)^(q1-p1) ); double d2=( (q2-q1)^(p2-p1) ); return p1+ (p2-p1)*(d1/d2) ; } Point p1,p2,q1,q2; void solve() // 判断直线p1p2与直线q1q2的关系 { double d1=(p2-p1)^(q1-p1); double d2=(p2-p1)^(q2-p1); if(fabs(d1 ) < EPS && fabs(d2) < EPS) // 如果p1p2q1 共线 且 p1p2q2 共线 则直线共线 { puts("LINE"); return ; } else { if(fabs( (p2-p1)^(q2-q1) ) < EPS ) // 否则,如果 p1p2 与 q1q2 共线, 则直线平行 { puts("NONE"); return ; } else // 否则,则相交 { Point temp=intersecting(p1,p2,q1,q2); printf("POINT %.2lf %.2lf\n",temp.x,temp.y); } } } int main() { int n; cin>>n; printf("INTERSECTING LINES OUTPUT\n"); for(int i=0;i<n;i++) { cin>>p1>>p2>>q1>>q2; solve(); } printf("END OF OUTPUT\n"); return 0; }
判断两条直线 共线或 平行 或相交 求交点 叉乘的应用 poj 1269 Intersecting Lines,布布扣,bubuko.com
判断两条直线 共线或 平行 或相交 求交点 叉乘的应用 poj 1269 Intersecting Lines
原文:http://www.cnblogs.com/zn505119020/p/3625083.html