Intersecting Lines--POJ1269(判断两条直线的关系 && 求两条直线的交点)

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

我今天才知道原来标准的浮点输出用%.2f   并不是%.2lf  所以wa了好几次

题目大意:   就给你两个线段 然后求这两个线段所在的直线的关系  有共线  平行  和相交

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
#include<math.h>
#define N 200
const double ESP = 1e-8;
struct Point
{
    double x, y;

    Point(double x=0,double y=0):x(x),y(y) {}
    Point operator + (const Point &temp)const{
        return Point(x+temp.x, y+temp.y);
    }
    Point operator - (const Point &temp)const{
        return Point(x-temp.x, y-temp.y);
    }
    bool operator == (const Point &temp)const{
        return (fabs(x-temp.x) < ESP && fabs(y-temp.y) < ESP);
    }
    int operator * (const Point &temp)const{
        double t=(x*temp.y)-(y*temp.x);
        if(t > ESP)
            return 1;
        if(fabs(t) < ESP)
            return 0;
        return -1;
    }
};

struct node
{
    Point A,B;
    node(Point A=0,Point B=0):A(A),B(B){}

};

Point line(Point u1,Point u2,Point v1,Point v2)///求交点模板
{
    Point ret=u1;
    double t=((u1.x-v1.x)*(v1.y-v2.y)-(u1.y-v1.y)*(v1.x-v2.x))/((u1.x-u2.x)*(v1.y-v2.y)-(u1.y-u2.y)*(v1.x-v2.x));

    ret.x+=(u2.x-u1.x)*t;
    ret.y+=(u2.y-u1.y)*t;

    return ret;
}

int main()
{
    int n;
    scanf("%d",&n);
    printf("INTERSECTING LINES OUTPUT\n");
    while(n--)
    {
        Point p[10];
        node a[5];
        double x1,x2,x3,x4,y1,y2,y3,y4;
        scanf("%lf %lf %lf %lf %lf %lf %lf %lf",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4);
        p[1]=Point(x1,y1);
        p[2]=Point(x2,y2);
        p[3]=Point(x3,y3);
        p[4]=Point(x4,y4);
        a[1]=node(p[1],p[2]);
        a[2]=node(p[3],p[4]);
        if(fabs((a[1].A-a[2].A)*(a[2].B-a[2].A))==0 && fabs((a[1].B-a[2].A)*(a[2].B-a[2].A))==0)///判断共线 如果a[1]的两个点都在直线a[2]上  就说明共线
            printf("LINE\n");
        else
        {
            if(fabs((y2-y1)*(x4-x3)-(y4-y3)*(x2-x1))<ESP)///如果不共线 并且斜率相等的话  就说明是平行
                printf("NONE\n");
            else///求交点
            {
                Point d;
                d=line(p[1],p[2],p[3],p[4]);
                printf("POINT %.2f %.2f\n",d.x,d.y);
            }
        }
    }
    printf("END OF OUTPUT\n");
    return 0;
}
时间: 2024-12-15 20:29:25

Intersecting Lines--POJ1269(判断两条直线的关系 && 求两条直线的交点)的相关文章

POJ1269:Intersecting Lines(判断两条直线的关系)

题目:POJ1269 题意:给你两条直线的坐标,判断两条直线是否共线.平行.相交,若相交,求出交点. 思路:直线相交判断.如果相交求交点. 首先先判断是否共线,之后判断是否平行,如果都不是就直接求交点了. #include <iostream> #include <string.h> #include <stdio.h> #include <algorithm> #include <math.h> #include <queue> #

POJ 1269 Intersecting Lines【判断直线相交】

题意:给两条直线,判断相交,重合或者平行 思路:判断重合可以用叉积,平行用斜率,其他情况即为相交. 求交点: 这里也用到叉积的原理.假设交点为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

链表:判断链表是否带环 、求两个链表的相交结点

问题一:返回两个链表的相交结点1.先分别得到两个链表的长度2.得到长度差,3.先让长链表的头结点走(长度差)步.4.这时.短链表头结点还在原地,两者开始一起走,当得到两者val相等时,这个结点就是公共结点,即相遇结点. 问题二:判断链表是否带环1.定义两个快慢指针,快指针先走两步,慢指针再走一步.直到快慢指针当前结点相同. 如果快指针先为null,则表示没有环,返回null.2.如果带环,让起点和相遇点同时出发.同走一步,再判断相等与否,如果相等退出循坏 返回这个结点 ```public cla

c语言求平面上2个坐标点的直线距离、求俩坐标直线距离作为半径的圆的面积、递归、菲波那次数列、explode

1 #include <stdio.h> 2 #include <math.h> 3 #include <string.h> 4 5 char explode( char * str , char symbol ); 6 7 8 double distance ( int x1 , int y1 , int x2 , int y2 ); // 求平面上2个坐标点的直线距离 9 double circle_area( double radius ); // 求圆面积. r

leetcode的题4:给定两个有序数组,求两个数组的中间值。

我的思路是,既然是有序数组,就可以按照归并排序法的思路,按照最后的归并过程. 建立一个新的数组,并对两个数组及归并数组目前的位置分别编号i,j,k. 将两个数组中较小的值推入i的位置,然后将被提取数据的数组及归并数组索引+1. 这个过程中需要考虑的问题是如果其中一个数组已经全部提取完成应如何处置. 以下是我的代码: class Solution { public: double findMedianSortedArrays(vector<int>& nums1, vector<i

写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果两个整数由键盘输入。

题目描述 输入 两个数 输出 最大公约数 最小公倍数 样例输入 6 15 样例输出 3 30 代码:#include<stdio.h>int gys(int a,int b){    while(a%b!=0)    {        int t;        t=a%b;        a=b;        b=t;        }        return b;    }int gbs(int a,int b){     return a*b/gys(a,b);    }int m

判断两条直线的位置关系 POJ 1269 Intersecting Lines

两条直线可能有三种关系:1.共线     2.平行(不包括共线)    3.相交. 那给定两条直线怎么判断他们的位置关系呢.还是用到向量的叉积 例题:POJ 1269 题意:这道题是给定四个点p1, p2, p3, p4,直线L1,L2分别穿过前两个和后两个点.来判断直线L1和L2的关系 这三种关系一个一个来看: 1. 共线. 如果两条直线共线的话,那么另外一条直线上的点一定在这一条直线上.所以p3在p1p2上,所以用get_direction(p1, p2, p3)来判断p3相对于p1p2的关

Intersecting Lines - POJ 1269(判断平面上两条直线的关系)

分析:有三种关系,共线,平行,还有相交,共线和平行都可以使用叉积来进行判断(其实和斜率一样),相交需要解方程....在纸上比划比划就出来了.... 代码如下: ====================================================================================================================================== #include<math.h> #include<algor

zoj 1280 Intersecting Lines(两直线交点)

题意:n组数据,每组两条直线两端点坐标,判断线段平行.重合,相交: 思路:利用叉积跨立实验判断重合与平行,交点公式求交点:zoj过了,可是poj1269过不了,不知道为什么.. #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const double epsi=1e-10; inline int sign(const dou