poj1269(直线交点)

传送门:Intersecting Lines

题意:给出N组直线,每组2条直线,求出直线是否相交。如果共线则输出LINE,相交则输入点坐标,否则输出NONE.

分析:模板裸题,直接上模板。。。

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <map>
#include <vector>
#include <set>
#include <string>
#include <math.h>

using namespace std;

const double eps = 1e-8;
const double PI = acos(-1.0);
const int N = 110;
int sgn(double x)
{
    if(fabs(x) < eps)return 0;
    if(x < 0)return -1;
    else return 1;
}
struct Point
{
    double x,y;
    Point(){}
    Point(double _x,double _y)
    {
        x = _x;y = _y;
    }
    Point operator -(const Point &b)const
    {
        return Point(x - b.x,y - b.y);
    }
    //叉积
    double operator ^(const Point &b)const
    {
        return x*b.y - y*b.x;
    }
};
struct Line
{
    Point s,e;
    Line(){}
    Line(Point _s,Point _e)
    {
        s = _s;e = _e;
    }
    //两直线相交求交点
    //第一个值为0表示直线重合,为1表示平行,为0表示相交,为2是相交
    //只有第一个值为2时,交点才有意义
    pair<int,Point> operator &(const Line &b)const
    {
        Point res = s;
        if(sgn((s-e)^(b.s-b.e)) == 0)
        {
            if(sgn((s-b.e)^(b.s-b.e)) == 0)
                return make_pair(0,res);//重合
            else return make_pair(1,res);//平行
        }
        double t = ((s-b.s)^(b.s-b.e))/((s-e)^(b.s-b.e));
        res.x += (e.x-s.x)*t;
        res.y += (e.y-s.y)*t;
        return make_pair(2,res);
    }
};
Line seg[10];
int main()
{
    int T;
    scanf("%d",&T);
    puts("INTERSECTING LINES OUTPUT");
    while(T--)
    {
        for(int i=1;i<=2;i++)
        {
            double a,b,c,d;
            scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
            seg[i]=Line(Point(a,b),Point(c,d));
        }
        pair<int,Point> p=seg[1]&seg[2];
        if(p.first==0)puts("LINE");
        else if(p.first==1)puts("NONE");
        else
        {
            printf("POINT %.2lf %.2lf\n",p.second.x,p.second.y);
        }
    }
    puts("END OF OUTPUT");
    return 0;
}

时间: 2024-10-16 10:27:08

poj1269(直线交点)的相关文章

UVA 11178 Morley&#39;s Theorem(旋转+直线交点)

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18543 [思路] 旋转+直线交点 第一个计算几何题,照着书上代码打的. [代码] 1 #include<cstdio> 2 #include<cmath> 3 #include<cstring> 4 using namespace std; 5 6 7 struct Pt { 8 double x,y; 9 Pt(double x=0,d

n条直线交点拟合求交点

直线方程的公式有以下几种形式: 斜截式:y=kx+b 截距式:x/a+y/b=1 两点式:(x-x1)/(x2-x1)=(y-y1)/(y2-y1) 一般式:ax+by+c=0(可以表达任意直线) 只要知道两点坐标,代入任何一种公式,都可以求出直线的方程 一般式方程在计算机领域的重要性 常用的直线方程有一般式 点斜式 截距式 斜截式 两点式等等.除了一般式方程,它们要么不能支持所有情况下的直线(比如跟坐标轴垂直或者平行),要么不能支持所有情况下的点(比如x坐标相等,或者y坐标相等).所以一般式方

编程求取直线一般式表达式,两直线交点

背景介绍 ??最近在水面无人艇(USV)模拟仿真中,用到了一些点和线的关系求解,本文主要讲述一下两点确认直线,点到直线距离,两条直线的交点等问题的解决方法,并给出python程序.部分内容非原创,文中给出链接,需要者可以参考. 两点确定直线 表达式定义 ??空间直线的表达式有多种,比如一般式Ax+By+C=0.点斜式y-y0=k(x-x0).截距式x/a+y/b=1.两点式:(y-y1)/(y1-y2)=(x-x1)/(x1-x2)等,它们具有彼此的约束条件,如下所示. ??由上可以看出来,一般

Fermat Point in Quadrangle(hdu 3694 求两直线交点

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3694 画几个图应该就可以知道凸四边形就是对角线交点 凹四边形就是凹进去的那个点 so 只要枚举四个点以及对角线交点 找个minn就可以 求两直线交点模板: double cross(double x1,double y1,double x2,double y2) { return x1*y2-x2*y1; } bool getcross(double x1,double y1,double x2,d

POJ 1127 Jack Straws ( 求直线交点, 判断线段是否相交(含端点) )

题目:传送门 题意: 给你 n 条线段的两个端点, 然后有多次询问, 每次询问, 问你线段 x 和 线段 y 是否相交. 若线段 A 和线段 B 相交且线段 A 和线段 C 相交,那么线段 B 和线段 C 相交.     1 < n < 13 题解: 暴力求线段是否相交, 然后再跑个 Floyd 或者并查集都可以的. #include <iostream> #include <stdio.h> #include <string.h> #include <

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

poj 1269 Intersecting Lines——叉积求直线交点坐标

题目:http://poj.org/problem?id=1269 相关知识: 叉积求面积:https://www.cnblogs.com/xiexinxinlove/p/3708147.html什么是叉积:https://blog.csdn.net/sunbobosun56801/article/details/78980467        其二维:https://blog.csdn.net/qq_38182397/article/details/80508303计算交点:    方法1:面

计算几何练习题――直线交点

描述 给定直线上L1上的两点P1,P2(P1和P2不重合)和直线L2上的两点P3,P4(P3和P4不重合),判断直线L1和L2是否相交.如果相交则需要求出交点.我们这里所说的直线相交是指有且只有一个点P,它既落在L1上又落在L2上. 输入 输入数据有多组,第一行为测试数据的组数N,下面包括2N行,每组测试数据含2行,第一行为P1,P2的坐标值,第二行为P3,P4的坐标值,比如下面的数据10 0 1 12 2 3 3表示P1.P2.P3.P4的坐标分别为:P1(0,0),P2(1,1),P3(2,

HDU 1466 直线交点情况

  的BestCoder(有米!) 计算直线的交点数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 8881    Accepted Submission(s): 4006 Problem Description 平面上有n条直线,且无三线共点,问这些直线能有多少种不同交点数. 比如,如果n=2,则可能的交点数量为0(平行)或者1(不