1. 程式人生 > >POJ 1269 /// 判斷兩條直線的位置關系

POJ 1269 /// 判斷兩條直線的位置關系

string open mat bsp esp ring namespace 分享圖片 else

題目大意:

t個測試用例 每次給出一對直線的兩點

判斷直線的相對關系

平行輸出NODE 重合輸出LINE 相交輸出POINT和交點坐標

1.直線平行 兩向量叉積為0

2.求兩直線ab與cd交點

設直線ab上點為 a+(b-a)t,t為變量

交點需滿足在直線cd上 則(d-c)*(a+t(b-a)-c)=0(外積)

分解為加減式 將t放在等號左邊 其他放在右邊

化簡推導得t=(d-c)*(c-a)/(d-c)*(b-a)

則交點為a+(b-a)*((d-c)*(c-a)/(d-c)*(b-a))

技術分享圖片
#include <cstdio>
#include <algorithm>
#include 
<string.h> #include <cmath> using namespace std; const double eps=1e-10; double add(double a,double b) { if(abs(a+b)<eps*(abs(a)+abs(b))) return 0; return a+b; } struct P { double x,y; P(){}; P(double _x,double _y):x(_x),y(_y){} P operator - (P p) { return
P(add(x,-p.x),add(y,-p.y)); } P operator + (P p) { return P(add(x,p.x),add(y,p.y)); } P operator * (double d) { return P(x*d,y*d); } double dot(P p) { return add(x*p.x,y*p.y); } double det(P p) { return add(x*p.y,-y*p.x); } }p; struct L { P a,b; L(){}; L(P _a,P _b):a(_a),b(_b){}; }l1,l2;
int n; P ins(P a,P b,P c,P d) { return a+(b-a)*((d-c).det(c-a)/(d-c).det(b-a)); } int solve() { if((l1.a-l1.b).det(l2.a-l2.b)==0) { // 平行 return (l1.a-l2.b).det(l1.b-l2.b)==0; } // 若l2有一點在l1上 就是重合 p=ins(l1.a,l1.b,l2.a,l2.b); // 相交求交點 return -1; } int main() { while(~scanf("%d",&n)) { printf("INTERSECTING LINES OUTPUT\n"); for(int i=0;i<n;i++) { scanf("%lf%lf%lf%lf" ,&l1.a.x,&l1.a.y,&l1.b.x,&l1.b.y); scanf("%lf%lf%lf%lf" ,&l2.a.x,&l2.a.y,&l2.b.x,&l2.b.y); int t=solve(); if(t==0) printf("NONE\n"); else if(t==1) printf("LINE\n"); else printf("POINT %.2f %.2f\n",p.x,p.y); } printf("END OF OUTPUT\n"); } }
View Code

POJ 1269 /// 判斷兩條直線的位置關系