You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改C++线段相交检测代码以支持运行时接收用户输入

线段相交判断代码用户输入功能调整方案

调整说明

  • 先补充代码必要的前置依赖:引入对应头文件、定义lli类型别名,保证原有核心逻辑可正常编译
  • 移除main函数中硬编码的端点坐标值,新增输入引导提示,引导用户依次输入两条线段共4个端点的x、y坐标
  • 原有线段相交判断的核心逻辑完全保留,仅修改输入相关逻辑

完整可运行代码

#include <iostream>
#include <algorithm> // 对应swap、max、min函数依赖
using namespace std;

// 定义lli别名匹配原代码的类型声明
typedef long long int lli;

struct point
{
    lli x, y;
};

int orientation(point p1, point p2, point p3)
{
    int val = (p2.y - p1.y) * (p3.x - p2.x) -
              (p2.x -p1.x) * (p3.y -p2.y);

    if (val == 0) return 0;
    
    return (val > 0)? 1: 2;
    
}

bool validprojection(int a, int b, int c, int d)
{
    if (a > b)
       swap(a,b);
    if (c > d)
       swap(c, d);
    return max(a, c) <= min(b, d);
}

bool doIntersect(point a, point b, point c, point d)
{
    int o1 = orientation(a, b, c);
    int o2 = orientation(a, b, d);
    int o3 = orientation(c, d, a);
    int o4 = orientation(c, d, b);

    if(o1 != o2 && o3 != o4)
    return true;

    if (o1 == 0 && o4 == 0)
    {
        if(validprojection(a.x, b.x, c.x, d.x) && validprojection(a.y, b.y, c.y, d.y))
        return true;
    }
    
    return false;
}

int main()
{
    cout << "查询两条线段是否相交,请依次输入4个端点的坐标" << endl;
    point p1, p2, p3, p4;
    
    cout << "请输入第一条线段第一个端点的x、y坐标,空格分隔:";
    cin >> p1.x >> p1.y;
    cout << "请输入第一条线段第二个端点的x、y坐标,空格分隔:";
    cin >> p2.x >> p2.y;
    cout << "请输入第二条线段第一个端点的x、y坐标,空格分隔:";
    cin >> p3.x >> p3.y;
    cout << "请输入第二条线段第二个端点的x、y坐标,空格分隔:";
    cin >> p4.x >> p4.y;
    
    doIntersect(p1, p2, p3, p4)? cout << "两条线段相交\n": cout << "两条线段不相交\n";

    return 0;
}

如果需要支持多次重复查询,在main函数中增加循环逻辑包裹输入、判断步骤即可。

内容的提问来源于stack exchange,提问作者Harsh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 17:24:00