POJ-1269 Intersecting Lines 题解报告(判线段相交并求交点)

本文分享了解决线段相交问题的题解,介绍了使用向量运算和分类判断(平行、重合、相交)的思路,展示了C++代码实现。通过实例展示了如何利用几何方法求解两条线段的交点或确定它们的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一篇题解报告哩(终于想要来写题解了
其实就是想把一些自己觉得有用的题记起来啦

题目在这 Intersecting Lines
题目大意:给你若干组线段让你判断两条线段之间的关系(平行 重合 相交)
思路:这不就是一道裸题吗虽然说刚接触也不熟悉
AC代码:

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const double eps = 1e-8;
int T;
int sgn(double x){return x < -eps ? -1 : x > eps;}
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);}
    Point operator - (const Point& b) const{return Point(x - b.x,y - b.y);}
    double operator * (const Point& b)const{return x * b.x + y * b.y;}
    double operator ^ (const Point& b)const{return x * b.y - y * b.x;}
}p[4];

struct Line{
    Point s,e;
    Line(){}
    Line(Point s,Point e): s(s),e(e){}

    //返回pair second 为0重合 为1平行 为2相交且first为交点
    pair<Point,int> operator &(const Line& b)const {
        Point res = s;
        if(sgn((s - e) ^ (b.s - b.e)) == 0){
            if(sgn((b.s - s) ^ (b.e - s)) == 0) return make_pair(res,0);
            return make_pair(res,1);
        }
        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(res,2);
    }
};

int main(){
    scanf("%d",&T);
    puts("INTERSECTING LINES OUTPUT");
    while(T--){
        for(int i = 0;i < 4;i ++){
            scanf("%lf%lf",&p[i].x,&p[i].y);
        }
        Line l[2];
        l[0] = Line(p[0],p[1]);
        l[1] = Line(p[2],p[3]);

        pair <Point,int> ans = l[0] & l[1];
        if(ans.second == 0) puts("LINE");
        else if(ans.second == 1) puts("NONE");
        else{
            printf("POINT %.2f %.2f\n",ans.first.x,ans.first.y);
        }
    }
    puts("END OF OUTPUT");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值