判断两线段是否相交:依次输入二个线段的四个端点,若两个线段相交输出是,否则输出否。 注意: 1.需要合理使用以下结构体 struct SPoint //点 { double x; double y; }: struct SLine //线段 { SPoint begin; //起点 SPoint end; //终点 }: 2.输入输出如下所示,第1行为输入,数据间用半角空格分隔,第2行为输出,格式错误算结果错误。 0 0 10 0 5 -5 5 5 是
时间: 2023-12-03 20:45:19 浏览: 131
判断两线段是否相交
以下是判断两条线段是否相交的代码实现:
```
#include <iostream>
#include <cmath>
using namespace std;
struct SPoint // 点
{
double x;
double y;
};
struct SLine // 线段
{
SPoint begin; // 起点
SPoint end; // 终点
};
// 计算叉积
double crossProduct(SPoint a, SPoint b, SPoint c)
{
return (b.x - a.x) * (c.y - a.y) - (c.x - a.x) * (b.y - a.y);
}
// 判断两条线段是否相交
bool isIntersect(SLine line1, SLine line2)
{
double c1 = crossProduct(line1.begin, line1.end, line2.begin);
double c2 = crossProduct(line1.begin, line1.end, line2.end);
double c3 = crossProduct(line2.begin, line2.end, line1.begin);
double c4 = crossProduct(line2.begin, line2.end, line1.end);
// 判断线段是否相交
if (c1 * c2 < 0 && c3 * c4 < 0)
{
return true;
}
return false;
}
int main()
{
SLine line1, line2;
cin >> line1.begin.x >> line1.begin.y >> line1.end.x >> line1.end.y >> line2.begin.x >> line2.begin.y >> line2.end.x >> line2.end.y;
if (isIntersect(line1, line2))
{
cout << "是" << endl;
}
else
{
cout << "否" << endl;
}
return 0;
}
```
输入样例:0 0 10 0 5 -5 5 5
输出样例:是
阅读全文