如何修改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
相关产品推荐
相关产品推荐

