用C++写一个判断两个线段是否相交的程序
时间: 2023-01-15 15:05:43 浏览: 121
判断两线段是否相交
好的,这是一个判断两个线段是否相交的程序:
```
#include <stdio.h>
#include <math.h>
// 定义点结构体
typedef struct Point
{
double x;
double y;
} Point;
// 定义线段结构体
typedef struct LineSegment
{
Point start;
Point end;
} LineSegment;
// 计算线段所在直线的斜率和截距
void calcLineEquation(LineSegment ls, double* k, double* b)
{
*k = (ls.end.y - ls.start.y) / (ls.end.x - ls.start.x);
*b = ls.start.y - (*k) * ls.start.x;
}
// 判断两条线段是否相交
int isIntersect(LineSegment ls1, LineSegment ls2)
{
double k1, b1, k2, b2;
calcLineEquation(ls1, &k1, &b1);
calcLineEquation(ls2, &k2, &b2);
// 两条线段在同一直线上
if (fabs(k1 - k2) < 1e-8)
{
// 线段2在线段1的两侧
if ((ls2.start.x < ls1.start.x && ls2.end.x < ls1.start.x) ||
(ls2.start.x > ls1.end.x && ls2.end.x > ls1.end.x))
{
return 0;
}
// 线段1在线段2的两侧
else if ((ls1.start.x < ls2.start.x && ls1.end.x < ls2.start.x) ||
(ls1.start.x > ls2.end.x && ls1.end.x > ls2.end.x))
{
return 0;
}
// 两线段有交点
else
{
return 1;
}
}
// 两条线段不在同一直线上
else
{
double x = (b2 - b1) / (k1 - k2);
double y = k1 * x + b1;
// 交点不在线段1上
if (x < fmin(ls1.start.x, ls1.end.x) || x > fmax(ls1.start
阅读全文