日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

poj 1269 直线相交情况

發布時間:2023/12/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 poj 1269 直线相交情况 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

鏈接:http://poj.org/problem?id=1269

題意:給兩條直線,判斷它們是重合、平行還是相交,相交則求交點。

#include<iostream> #include<algorithm> #include<cmath> #include<cstdio> using namespace std;const double eps=1e-8;struct Point {double x,y;Point(double x=0,double y=0):x(x),y(y) {} } p[4];typedef Point Vector;Vector operator + (Vector A,Vector B) {return Vector(A.x+B.x,A.y+B.y); }Vector operator - (Vector A,Vector B) {return Vector(A.x-B.x,A.y-B.y); }Vector operator * (Vector A,double p) {return Vector(A.x*p,A.y*p); }double Cross(Vector A,Vector B) {return A.x*B.y-A.y*B.x; }Point LineIntersection(Point P,Vector v,Point Q,Vector w)//兩條直線求交點 {Vector u=P-Q;double t=Cross(w,u)/Cross(v,w);return P+v*t; }int main() {int n;Point p0;double t;cin>>n;cout<<"INTERSECTING LINES OUTPUT"<<endl;while(n--){for(int i=0; i<4; ++i)cin>>p[i].x>>p[i].y;Vector v1(p[1]-p[0]),v2(p[3]-p[2]);if(fabs(Cross(v1,v2))<eps)//共線{ // t=(p[2].x-p[0].x)/v1.x;//v1.x為0,就錯了 // if(fabs(p[2].y-p[0].y-t*v1.y)<eps)t=(p[2].x-p[0].x);if(fabs(v1.x*(p[2].y-p[0].y)-t*v1.y)<eps)cout<<"LINE"<<endl;else cout<<"NONE"<<endl;}else//相交{p0=LineIntersection(p[0],v1,p[2],v2);cout<<"POINT ";printf("%.2lf %.2lf\n",p0.x,p0.y);}}cout<<"END OF OUTPUT"<<endl;return 0; }

這里判斷兩直線重合是用的參數方程,但是一開始沒有考慮到v1.x為0的情況,必然過不了,然后改成現在這樣。

?

也可以用叉積來判斷是否重合。

p2與p0和p1共線,且p3與p0和p1共線。

if(fabs(Cross(v1,p[2]-p[0]))<eps && fabs(Cross(v1,p[3]-p[0]))<eps)//重合cout<<"LINE"<<endl;else if(fabs(Cross(v1,v2))<eps)//平行cout<<"NONE"<<endl;

?

或者是用直線的一般式:ax+by+c=0 利用相似來判讀

平行則有:a1/a2=b1/b2

重合有:a1/a2=b1/b2=c1/c2

?

高中的幾何知識真是忘得差不多了啊。。。。淚。。。

轉載于:https://www.cnblogs.com/54zyq/archive/2013/05/07/3064269.html

總結

以上是生活随笔為你收集整理的poj 1269 直线相交情况的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。