判断两条线段是否相交
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
相关文章推荐
- 判断两条线段是否相交_模版
- 判断两条线段是否相交(三种算法)
- 两条线段知道端点line1(x1,y1)(x2,y2)line2(x3,y3)(x4,y4),判断两条线段是否相交,交点坐标(x,y)
- 【算法导论】33.2:判断任意两条线段是否相交
- 判断两条线段是否相交(三种算法)
- 判断两条线段是否相交
- 判断两条线段是否相交(三种算法)
- 判断两条线段是否相交
- 判断两条线段是否相交
- 判断两条线段是否相交
- 判断两条线段是否相交(叉积)
- 判断两条线段是否相交
- 判断两条线段是否相交_模版
- 判断两条线段是否相交
- 判断两条线段是否相交
- 判断两条线段是否相交
- 判断两条线段是否相交
- 判断两条线段是否相交 计算几何
- 判断两条线段是否相交
- 判断两条线段是否相交