1. 程式人生 > >判斷兩線段相交,並求交點

判斷兩線段相交,並求交點

#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; }

這裡寫圖片描述