poj 1269 直线相交 + 平行

刚开始做这道题貌似很纠结的样子,在纠结了更纠结的题目之后回来看这道题就是小case了

不过竟然把题目当成是判断线段相交了。于是WA…………………………………………

自己弱弱的写了一个判断平行的代码,其他直接用模板……

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
#define infinity 1e20
#define EP 1e-10

const int MAXV = 300 ;
const double PI = 2.0*asin(1.0); //高精度求PI
const double eps = 1e-6;
struct Lpoint
{
    double x,y;
}; //点
struct Llineseg
{
    Lpoint a,b;
}; //线段
struct Ldir
{
    double dx,dy;
}; //方向向量
struct Lline
{
    Lpoint p;
    Ldir dir;
}; //直线
struct Lrad
{
    Lpoint Sp;
    Ldir dir;
}; //射线
struct Lround
{
    Lpoint co;
    double r;
};//圆
double p2pdis(Lpoint p1,Lpoint p2)
{
    return (sqrt((p1.x-p2.x) * (p1.x-p2.x) +
                 (p1.y-p2.y) * (p1.y-p2.y)));
}

double xmulti(Lpoint p1,Lpoint p2,Lpoint p0)
{
    return((p1.x-p0.x) * (p2.y-p0.y) -
           (p2.x-p0.x) * (p1.y-p0.y));
}
double mx(double t1,double t2)
{
    if(t1>t2) return t1;
    return t2;
}
double mn(double t1,double t2)
{
    if(t1<t2) return t1;
    return t2;
}
int lsinterls(Llineseg u,Llineseg v)
{
    return( (mx(u.a.x,u.b.x)>=mn(v.a.x,v.b.x))&&
            (mx(v.a.x,v.b.x)>=mn(u.a.x,u.b.x))&&
            (mx(u.a.y,u.b.y)>=mn(v.a.y,v.b.y))&&
            (mx(v.a.y,v.b.y)>=mn(u.a.y,u.b.y))&&
            (xmulti(v.a,u.b,u.a)*xmulti(u.b,v.b,u.a)>=0)&&
            (xmulti(u.a,v.b,v.a)*xmulti(v.b,u.b,v.a)>=0));
}
int ponls(Llineseg l,Lpoint p)
{
    return( (xmulti(l.b,p,l.a)==0) &&
            ( ((p.x-l.a.x)*(p.x-l.b.x)<0 ) ||
              ((p.y-l.a.y)*(p.y-l.b.y)<0 )) );
}
int Euqal_Point(Lpoint p1,Lpoint p2)
{
    return((fabs(p1.x-p2.x)<EP)&&(fabs(p1.y-p2.y)<EP));
}
int lsinterls_A(Llineseg u,Llineseg v)
{
    return((lsinterls(u,v)) && (!Euqal_Point(u.a,v.a))&&
           (!Euqal_Point(u.a,v.b)) &&
           (!Euqal_Point(u.b,v.a))&&
           (!Euqal_Point(u.b,v.b)));
}
Lpoint intersection(Llineseg u,Llineseg v){
	Lpoint 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 linecorss(Lpoint p1,Lpoint p2,Lpoint p3,Lpoint p4,Lpoint *p)
{
    double k;
    if ((p4.y-p3.y)*(p2.x-p1.x)-(p4.x-p3.x)*(p2.y-p1.y)==0) return 0;
    if ((p4.x-p3.x)*(p1.y-p3.y)-(p4.y-p3.y)*(p1.x-p3.x)==0&&
            (p2.x-p1.x)*(p1.y-p3.y)-(p2.y-p1.y)*(p1.x-p3.x)==0) return 0;

    k=((p4.x-p3.x)*(p1.y-p3.y)-(p4.y-p3.y)*(p1.x-p3.x))/((p4.y-p3.y)*(p2.x-p1.x)-(p4.x-p3.x)*(p2.y-p1.y));
    //k1=((p2.x-p1.x)*(p1.y-p3.y)-(p2.y-p1.y)*(p1.x-p3.x))/((p4.y-p3.y)*(p2.x-p1.x)-(p4.x-p3.x)*(p2.y-p1.y));
    (*p).x=p1.x+k*(p2.x-p1.x);
    (*p).y=p1.y+k*(p2.y-p1.y);
    return 1;
}
bool online(Llineseg p , Llineseg q)
{
    if(!xmulti(q.a,q.b,p.a) && !xmulti(q.a,q.b,p.b))    return true;
    else                                                return false;
}
bool Judge_parallel(Llineseg p, Llineseg q)
{
    if(fabs(p.a.x - p.b.x) < eps && fabs(q.a.x - q.b.x) < eps && online(p,q))  return true;
    if(fabs(p.a.x - p.b.x) > eps && fabs(q.a.x - q.b.x) > eps)
    {
        if(fabs((p.b.y - p.a.y)/(p.b.x-p.a.x) - (q.b.y-q.a.y)/(q.b.x-q.a.x)) < eps && online(p,q))
            return true;
        else
            return false;
    }
    return false;
}
int main()
{
//    freopen("1269.txt","r",stdin);
    int n;
    while(~scanf("%d",&n))
    {
        printf("INTERSECTING LINES OUTPUT\n");
        for(int i=1; i<=n; i++)
        {
            Llineseg a,b;
            Lpoint tem;
            scanf("%lf %lf %lf %lf %lf %lf %lf %lf",&a.a.x,&a.a.y,&a.b.x,&a.b.y,&b.a.x,&b.a.y,&b.b.x,&b.b.y);
            if(Judge_parallel(a,b))
                printf("LINE\n");
            else if(linecorss(a.a,a.b,b.a,b.b,&tem))
            {
                printf("POINT %.2lf %.2lf\n",tem.x,tem.y);
            }
            else
                printf("NONE\n");
        }
        printf("END OF OUTPUT\n");
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值