Interecting Lines

本文介绍了一道关于判断二维平面上两条直线相交情况的经典算法题。通过代数方法确定两条直线之间的关系——平行无交点、重叠或在一点相交,并提供了完整的C++实现代码。

Interecting Lines

题目来源

OpenJ_Bailian 1269
POJ 1269
UVA 378
UVAlive 5425
ZOJ 1280

题面

描述

我们都知道平面上的一对由线上两点定义的直线有三种关系:
1. 平行无交点
2. 两条线重叠
3. 在一个点上相交

在这个问题中你需要使用你的代数知识编写一个程序决定两条线的怎样的关系、在何处相交。(啊啊啊翻译苦手)
你的程序将要重复地读入定义在xy平面上定义两条直线的四个点,并决定他们怎样 在何处相交。保证题目所给的数据合理并在-1000到1000之间。

输入

第一行包括整数N(在1 ~ 10之间)表明将给出多少对直线。接下来的
N行每一行包括8个整数,表示四个点在平面上的坐标x1 y1 x2 y2 x3 y3 x4 y4,表示穿过(x1,y1)、(x2,y2)的直线和穿过(x3,y3)、(x4,y4)的直线。保证(x1,y1)和(x2,y2)是不同的点,(x3,y3)和(x4,y4)同理。

输出

输出N+2行,第一行为“INTERSECTING LINES OUTPUT”。接下来每行输出输入中所给的两条直线的相交情况:none,line,还是point。如果存在交点那么再输出交点的坐标。最后一行输出“END OF OUTPUT”。

样例输入

5
0 0 4 4 0 4 4 0
5 0 7 6 1 0 2 3
5 0 7 6 3 -6 4 -3
2 0 2 27 1 5 18 5
0 3 4 0 1 2 2 5

样例输出

INTERSECTING LINES OUTPUT
POINT 2.00 2.00
NONE
LINE
POINT 2.00 5.00
POINT 1.07 2.20
END OF OUTPUT

???

非常和蔼的模板题啊ww
敲的很开心2333
就是UVA的多组数据wa了几发_(:з」∠)_
(你个智障

代码

#include <cmath>
#include <cstdio>
#include <cstring>
const double eps=1e-10;
struct Point
{
    double x,y;
    Point(double x=0,double y=0):x(x),y(y){};
};
typedef Point Vector;
int n;
Point P;
int dcmp(double x)
{
    if (fabs(x)<eps)
        return 0;
    return x>0 ? 1:-1;
}
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);
}
Vector operator + (Vector A,Vector B)
{
    return Vector(A.x+B.x,A.y+B.y);
}
double Cross(Vector A,Vector B)
{
    return A.x*B.y-A.y*B.x;
}
Point interection(Point P,Vector v,Point Q,Vector w)
{
    Vector u=P-Q;
    double t=Cross(w,u)/Cross(v,w);
    return P+v*t;
}
bool online(Vector P,Vector A,Vector B)
{
    return dcmp(Cross(P-A,P-B))==0;
}
int interect(Point A1,Point A2,Point B1,Point B2)
{
    Vector v1=A1-A2,v2=B1-B2;
    if (dcmp(Cross(v1,v2))==0)
    {
        if (online(A1,B1,B2))
            return -1;
        return 0;
    }
    P=interection(A1,v1,B1,v2);
    return 1;
}
int main()
{
    while (scanf("%d",&n)==1)
    {
        printf("INTERSECTING LINES OUTPUT\n");
        for (int i=1;i<=n;i++)
        {
            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);
            int k=interect(Point(x1,y1),Point(x2,y2),Point(x3,y3),Point(x4,y4));
            if (k==0)
                printf("NONE\n");
            if (k==-1)
                printf("LINE\n");
            if (k==1)
                printf("POINT %.2lf %.2lf\n",P.x,P.y);
        }
        printf("END OF OUTPUT\n");
    }
}
基于径向基函数神经网络RBFNN的自适应滑模控制学习(Matlab代码实现)内容概要:本文介绍了基于径向基函数神经网络(RBFNN)的自适应滑模控制方法,并提供了相应的Matlab代码实现。该方法结合了RBF神经网络的非线性逼近能力和滑模控制的强鲁棒性,用于解决复杂系统的控制问题,尤其适用于存在不确定性和外部干扰的动态系统。文中详细阐述了控制算法的设计思路、RBFNN的结构与权重更新机制、滑模面的构建以及自适应律的推导过程,并通过Matlab仿真验证了所提方法的有效性和稳定性。此外,文档还列举了大量相关的科研方向和技术应用,涵盖智能优化算法、机器学习、电力系统、路径规划等多个领域,展示了该技术的广泛应用前景。; 适合人群:具备一定自动控制理论基础和Matlab编程能力的研究生、科研人员及工程技术人员,特别是从事智能控制、非线性系统控制及相关领域的研究人员; 使用场景及目标:①学习和掌握RBF神经网络与滑模控制相结合的自适应控制策略设计方法;②应用于电机控制、机器人轨迹跟踪、电力电子系统等存在模型不确定性或外界扰动的实际控制系统中,提升控制精度与鲁棒性; 阅读建议:建议读者结合提供的Matlab代码进行仿真实践,深入理解算法实现细节,同时可参考文中提及的相关技术方向拓展研究思路,注重理论分析与仿真验证相结合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值