poj 1269 Intersecting Lines(判相交交點與平行)

來源:互聯網
上載者:User

標籤:des   style   blog   http   color   os   

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

Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 10379   Accepted: 4651

Description

We all know that a pair of distinct points on a plane defines a line and that a pair of lines on a plane will intersect in one of three ways: 1) no intersection because they are parallel, 2) intersect in a line because they are on top of one another (i.e. they are the same line), 3) intersect in a point. In this problem you will use your algebraic knowledge to create a program that determines how and where two lines intersect. 
Your program will repeatedly read in four points that define two lines in the x-y plane and determine how and where the lines intersect. All numbers required by this problem will be reasonable, say between -1000 and 1000. 

Input

The first line contains an integer N between 1 and 10 describing how many pairs of lines are represented. The next N lines will each contain eight integers. These integers represent the coordinates of four points on the plane in the order x1y1x2y2x3y3x4y4. Thus each of these input lines represents two lines on the plane: the line through (x1,y1) and (x2,y2) and the line through (x3,y3) and (x4,y4). The point (x1,y1) is always distinct from (x2,y2). Likewise with (x3,y3) and (x4,y4).

Output

There should be N+2 lines of output. The first line of output should read INTERSECTING LINES OUTPUT. There will then be one line of output for each pair of planar lines represented by a line of input, describing how the lines intersect: none, line, or point. If the intersection is a point then your program should output the x and y coordinates of the point, correct to two decimal places. The final line of output should read "END OF OUTPUT".

Sample Input

50 0 4 4 0 4 4 05 0 7 6 1 0 2 35 0 7 6 3 -6 4 -32 0 2 27 1 5 18 50 3 4 0 1 2 2 5

Sample Output

INTERSECTING LINES OUTPUTPOINT 2.00 2.00NONELINEPOINT 2.00 5.00POINT 1.07 2.20END OF OUTPUT

Source

 

//////////////////////////////////////////////////////////////////////////////////////////////////////

題目大意是給定n對線,判斷每一對線是平行還是相交並求出交點

 

#include <stdio.h>#include <string.h>#include <stdlib.h>#include <math.h>#include <algorithm>#include <limits.h>#include <iostream>const double eps = 1e-6;typedef struct Node{    double x,y;} point;typedef struct{    point a,b;} line;bool dy(double x,double y){    return x>eps+y;}//x>ybool xy(double x,double y){    return x<y-eps;}//x<ybool dyd(double x,double y){    return x>y-eps;}//x>=ybool xyd(double x,double y){    return x<y+eps;}//x<=ybool dd(double x,double y){    return fabs(x-y)<eps;}//x==ydouble crossProduct(point a,point b,point c)//ab  ac{    return (c.x-a.x)*(b.y-a.y)-(b.x-a.x)*(c.y-a.y);}bool parallel(line u,line v){    return dd((u.a.x-u.b.x)*(v.a.y-v.b.y)-(v.a.x-v.b.x)*(u.a.y-u.b.y),0.0);}point intersection(line u,line v){    point ans=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));    ans.x+=(u.b.x-u.a.x)*t;    ans.y+=(u.b.y-u.a.y)*t;    return ans;}int main(){    line u,v;    int n;    while(scanf("%d",&n)!=EOF)    {        printf("INTERSECTING LINES OUTPUT\n");        while(n--)        {            scanf("%lf%lf%lf%lf",&u.a.x,&u.a.y,&u.b.x,&u.b.y);            scanf("%lf%lf%lf%lf",&v.a.x,&v.a.y,&v.b.x,&v.b.y);            if(parallel(u,v))            {                if(dd(crossProduct(u.a,u.b,v.a),0.0))                    printf("LINE\n");                else                    printf("NONE\n");            }            else            {                point ans=intersection(u,v);                printf("POINT %.2lf %.2lf\n",ans.x,ans.y);            }        }        printf("END OF OUTPUT\n");    }}
View Code

由於並不是太懂,就拷貝別人的了

原帖:http://blog.csdn.net/zxy_snow/article/details/6341282

先判斷兩條直線是不是同線,不是的話再判斷是否平行,再不是的話就只能是相交的,求出交點。

如何判斷是否同線?由叉積的原理知道如果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。

×/

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.