您的位置:首页 > 其它

判断两条线段是否相交

2017-12-12 10:30 453 查看
//排斥实验
bool IsRectCross(const double a1[2],const double a2[2],
const double b1[2],const double b2[2]){
bool ret =  (min(a1[0],a2[0]) <= max(b1[0],b2[0])) &&
(min(b1[0],b2[0]) <= max(a1[0],a2[0])) &&
(min(a1[1],a2[1]) <= max(b1[1],b2[1]))  &&
(min(b1[1],b2[1]) <= max(a1[1],a2[1]));
return ret;
}

//跨立判断
bool IsLineSegmentCross(const double a1[2],const double a2[2],
const double b1[2],const double b2[2]){
double b1a1[2] = {a1[0]-b1[0],a1[1]-b1[1]};
double b1b2[2] = {b2[0]-b1[0],b2[1]-b1[1]};
double b1a2[2] = {a2[0]-b1[0],a2[1]-b1[1]};
double seg1 = (b1a1[0]*b1b2[1]-b1a1[1]*b1b2[0]) * (b1a2[0]*b1b2[1]-b1a2[1]*b1b2[0]);

double a1b1[2] = {b1[0]-a1[0],b1[1]-a1[1]};
double a1a2[2] = {a2[0]-a1[0],a2[1]-a1[1]};
double a1b2[2] = {b2[0]-a1[0],b2[1]-a1[1]};
double seg2 = (a1b1[0]*a1a2[1]-a1b1[1]*a1a2[0]) * (a1b2[0]*a1a2[1]-a1b2[1]*a1a2[0]);

if(seg1<0 && seg2<0){
return true;
}else{
return false;
}
}

//XOY面两条线是否相交
bool Intersection (double a1[2], double a2[2],
double b1[2], double b2[2],
double& u, double& v)
{
u = v = 0.0;
double denominator = (a2[1]-a1[1])*(b2[0]-b1[0])-(b2[1]-b1[1])*(a2[0]-a1[0]);
//平行
if(denominator < 0.0001 && denominator > -0.0001){
return 0;
}
if(IsRectCross(a1,a2,b1,b2)){
if(IsLineSegmentCross(a1,a2,b1,b2)){
double elementX = (a2[1]-a1[1])*(b2[0]-b1[0])*a1[0]-(b2[1]-b1[1])*(a2[0]-a1[0])*b1[0];
double elementY = (b2[1]-b1[1])*(a2[0]-a1[0])*a1[1]-(a2[1]-a1[1])*(b2[0]-b1[0])*b1[1];

u = elementX/denominator;
v = elementY/denominator;
return true;
}
}
return false;
}


详细说明请看https://segmentfault.com/a/1190000004070478
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: