判断两条线段是否相交,射线和面的交点

//排斥实验
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

射线和面的交点

  面:原点(o1,o2,o3),法向量(n1,n2,n3)
  点:坐标(p1,p2,p3),射向(v1,v2,v3)
  double P2OVec[3] = {p1-o1,p2-o2,p3-o3};
  double opXn1 = P2OVec[0]*n1 + P2OVec[1]*n2 + P2OVec[2]*n3;
  double v1Xn1 = v1*n1 + v2*n2 + v3*n3;
  if(opXn1*v1Xn1 > 0){
	  //与平面不相交
  }
  double tempstep = -(opXn1/v1Xn1);
  //交点
  double crosspoint[3] = {p1+tempstep*v1,p2+tempstep*v2,p3+tempstep*v3};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力减肥的小胖子5

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值