您的位置:首页 > 其它

判断两线段是否相交 模板

2015-08-10 19:58 507 查看
struct point
{
double x, y;
point( double _x = 0, double _y = 0 )
{
x = _x;
y = _y;
}
point operator-( point t )
{
return point( x - t.x, y - t.y );
}
double operator*( point t )
{
return x * t.y - y * t.x;
}
};

//快速排斥试验模板
bool quickExclude( point a, point b, point c, point d )
{
int x1 = a.x, x2 = b.x, x3 = c.x, x4 = d.x;
int y1 = a.y, y2 = b.y, y3 = c.y, y4 = d.y;
if (  min(x1,x2) <= max(x3,x4) && min(x3,x4) <= max(x1,x2) &&
min(y1,y2) <= max(y3,y4) && min(y3,y4) <= max(y1,y2)      )
return true;
else    return false;
}

//跨立试验模板(两线段是否相交)
bool ifIntersect( point a, point b, point c, point d )
{
if ( quickExclude( a, b, c, d ) )
{
if (  ( ( a - c ) * ( c - d ) ) * ( ( b - c ) * ( c - d ) ) <= 0 && ( ( c - a ) * ( a - b ) ) * ( ( d - a ) * ( a - b ) ) <= 0  )
return true;
}
return false;
}

//若已判断两线段相交求交点或者求两相交直线交点模板(四个点为a, b, c, d),a1, b1, c1, a2, b2, c2为方程系数,交点为x0和y0
double a1 = a.y - b.y;
double b1 = b.x - a.x;
double c1 = a.x * b.y - b.x * a.y;
double a2 = c.y - d.y;
double b2 = d.x - c.x;
double c2 = c.x * d.y - d.x*c.y;
double x0 = ( b1 * c2 - b2 * c1 ) / ( a1 * b2 - a2 * b1 );
double y0 = ( a2 * c1 - a1 * c2 ) / ( a1 * b2 - a2 * b1 );


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: