判斷兩線段相交,並求交點
阿新 • • 發佈:2019-02-17
#include "math.h"
#include "stdio.h"
double E = 0.0001;
struct Point
{
double x, y;
};
double min(double x1, double x2)
{
return x1 < x2 ? x1 : x2;
}
double max(double x1, double x2)
{
return x1 > x2 ? x1 : x2;
}
bool between(double X, double X1, double X2)
{
return X >= min(X1, X2) && X <= max(X1, X2);
}
// 判斷兩條直線段是否有交點,有則計算交點的座標
// p1,p2是直線一的端點座標
// p3,p4是直線二的端點座標
// line_x, line_y; //交點
bool detectIntersect(Point p1, Point p2, Point p3, Point p4, double &line_x, double &line_y)
{
if ( (fabs(p1.x-p2.x)<E) && (fabs(p3.x-p4.x)<E) )
{
return false;
}
else if ( (fabs(p1.x-p2.x)<E) ) //如果直線段p1p2垂直與y軸
{
if (between(p1.x, p3.x, p4.x))
{
double k = (p4.y-p3.y)/(p4.x-p3.x);
line_x = p1.x;
line_y = k*(line_x-p3.x) + p3.y;
if (between(line_y,p1.y,p2.y))
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
else if ( (fabs(p3.x-p4.x)<E) ) //如果直線段p3p4垂直於y軸
{
if (between(p3.x,p1.x,p2.x))
{
double k = (p2.y-p1.y)/(p2.x-p1.x);
line_x = p3.x;
line_y = k*(line_x-p2.x) + p2.y;
if (between(line_y, p3.y, p4.y))
{
return true;
}
else
{
return false;
}
}
else
{
return true;
}
}
else
{
double k1 = (p2.y-p1.y)/(p2.x-p1.x);
double k2 = (p4.y-p3.y)/(p4.x-p3.x);
if (fabs(k1-k2) < E)
{
return false;
}
else
{
line_x = ((p3.y - p1.y) - (k2*p3.x - k1*p1.x)) / (k1 - k2);
line_y = k1*(line_x-p1.x) + p1.y;
}
if (between(line_x, p1.x, p2.x) && between(line_x, p3.x, p4.x))
{
return true;
}
else
{
return false;
}
}
}
int main()
{
Point p1, p2, p3, p4;
p1.x = 5.0;
p1.y = 0.0;
p2.x = 0.0;
p2.y = 5.0;
p3.x = 0.0;
p3.y = 0.0;
p4.x = 5.0;
p4.y = 5.0;
double x, y;
int ok = detectIntersect(p1, p2, p3, p4, x, y);
if(ok)
{
printf("相交,交點為:(%.3f, %.3f)\n", x, y);
}
else
{
printf("不相交\n");
}
return 0;
}