POJ1269:Intersecting Lines(判断两条直线的关系)
題目:POJ1269
題意:給你兩條直線的坐標,判斷兩條直線是否共線、平行、相交,若相交,求出交點。
思路:直線相交判斷、如果相交求交點。
首先先判斷是否共線,之后判斷是否平行,如果都不是就直接求交點了。
#include <iostream> #include <string.h> #include <stdio.h> #include <algorithm> #include <math.h> #include <queue> #define inf 0x3f3f3f3f #define eps 1e-9 typedef long long ll; using namespace std; int n; struct Point {double x,y; }; struct Line {Point a,b; } line[3]; double xmult(Point p1,Point p2,Point p)//叉積 {return (p1.x-p.x)*(p2.y-p.y)-(p1.y-p.y)*(p2.x-p.x); } int parallel(Line u,Line v) {return ((u.a.x-u.b.x)*(v.a.y-v.b.y)-(v.a.x-v.b.x)*(u.a.y-u.b.y)); } Point intersection(Line u,Line v) {Point ret=u.a;double t=((u.a.x-v.a.x)*(v.a.y-v.b.y)-(u.a.y-v.a.y)*(v.a.x-v.b.x))/((u.a.x-u.b.x)*(v.a.y-v.b.y)-(u.a.y-u.b.y)*(v.a.x-v.b.x));ret.x+=(u.b.x-u.a.x)*t;ret.y+=(u.b.y-u.a.y)*t;return ret; } int main() {while(scanf("%d",&n)!=EOF){cout<<"INTERSECTING LINES OUTPUT"<<endl;for(int i=0; i<n; i++){scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&line[1].a.x,&line[1].a.y,&line[1].b.x,&line[1].b.y,&line[2].a.x,&line[2].a.y,&line[2].b.x,&line[2].b.y);if(fabs(parallel(line[1],line[2]))<=eps&&fabs(xmult(line[1].a,line[1].b,line[2].a))<=eps){printf("LINE\n");}else if(fabs(parallel(line[1],line[2]))<=eps){printf("NONE\n");}else{Point tt=intersection(line[1],line[2]);printf("POINT %.2f %.2f\n", tt.x,tt.y);//poj只能輸出f }}printf("END OF OUTPUT\n");}return 0; }?轉載:
給你兩條直線,判斷這兩條直線是否共線,相交,不相交(即平行),相交的話輸出交點。
判斷平行,然后通過叉積判斷是否共線。
平行判斷可以判斷兩條直線的斜率是否相等。
交點的話,相當于聯立方程組求解了。
這些方程看模板理解的,剛才搜了下,有人講得比較清楚,借鑒下http://blog.csdn.net/dreamvyps/archive/2011/01/25/6162690.aspx
如何判斷是否同線?由叉積的原理知道如果p1,p2,p3共線的話那么(p2-p1)X(p3-p1)=0。因此如果p1,p2,p3共線,p1,p2,p4共線,那么兩條直線共線。direction()求叉積,叉積為0說明共線。
?
如何判斷是否平行?由向量可以判斷出兩直線是否平行。如果兩直線平行,那么向量p1p2、p3p4也是平等的。即((p1.x-p2.x)*(p3.y-p4.y)-(p1.y-p2.y)*(p3.x-p4.x))==0說明向量平等。
?
如何求出交點?這里也用到叉積的原理。假設交點為p0(x0,y0)。則有:
(p1-p0)X(p2-p0)=0
(p3-p0)X(p2-p0)=0
展開后即是
(y1-y2)x0+(x2-x1)y0+x1y2-x2y1=0
(y3-y4)x0+(x4-x3)y0+x3y4-x4y3=0
將x0,y0作為變量求解二元一次方程組。
假設有二元一次方程組
a1x+b1y+c1=0;
a2x+b2y+c2=0;
那么
x=(c1*b2-c2*b1)/(a2*b1-a1*b2);
y=(a2*c1-a1*c2)/(a1*b2-a2*b1);
因為此處兩直線不會平行,所以分母不會為0。//就是斜率,已懂
轉載于:https://www.cnblogs.com/zhangmingcheng/p/4278507.html
總結
以上是生活随笔為你收集整理的POJ1269:Intersecting Lines(判断两条直线的关系)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 方法的重载【转】
- 下一篇: 背包九讲之五(二维费用的背包问题)