直线与三角形相交

19 篇文章 0 订阅
11 篇文章 1 订阅
bool GeometricTools::intersect(Vector3f ray_o, Vector3f ray_d,
                               Vector3f tri_p0, Vector3f tri_p1, Vector3f tri_p2,
                               Vector3f& res)
{
    float t = 0;

    // for the plane: Xn(x - X0) + Yn(y - Y0) + Zn(z - Z0) = 0 
    // for the line: L(t) = s + td
    // t = (n * p)/(n * d)
    Vector3f p1 = tri_p1 - tri_p0;
    Vector3f p2 = tri_p2 - tri_p0;

    // 注意glm中三角形存储为顺时针,这里需要逆转一下
    Vector3f normal = Cross(p2, p1);
    Vector3f P = tri_p0 - ray_o;

    float fDiv =  Dot(normal, ray_d);
    if (fabs(fDiv) < FloatEPS)
    {
        return false;
    }

    t = Dot(normal, P) / fDiv;
    if (t <= 0)
    {   
        return false;
    }

    res.x = ray_o.x + t * ray_d.x;
    res.y = ray_o.y + t * ray_d.y;
    res.z = ray_o.z + t * ray_d.z;

    // is the point in the triangle?
    // 面积法判断
    // http://www.cnblogs.com/cgwolver/archive/2009/03/26/1257611.html
    Vector3f p01 = tri_p1 - tri_p0;
    Vector3f p02 = tri_p2 - tri_p0;
    Vector3f pr0 = tri_p0 - res;
    Vector3f pr1 = tri_p1 - res;
    Vector3f pr2 = tri_p2 - res;

    float s1  = Magnitude(Cross(p01, p02))/2.0;
    float s21 = Magnitude(Cross(pr0, pr1))/2.0;
    float s22 = Magnitude(Cross(pr0, pr2))/2.0;
    float s23 = Magnitude(Cross(pr1, pr2))/2.0;
    float s2 = s21 + s22 + s23;
    if (fabs(s1 - s2) > FloatEPS)
    {
        return false;
    }

    return true;
}

在MATLAB中,可以使用不同的方法来计算直线三角形之间的关系。这些方法包括: 方法1:使用角平分线 通过将三角形的两条边的中点相连,可以得到一个角平分线,该角平分线与三角形的外接圆相切于圆心。可以使用这个角平分线来计算外接圆的圆心和半径。这个方法需要计算两条角平分线的斜率和截距,并求解它们的交点来确定圆心,再计算圆心与三角形顶点之间的距离来确定外接圆的半径。 方法2:使用垂直平分线 通过将三角形的两条边的中点连接起来,可以得到两条垂直平分线,这些平分线相交于外接圆的圆心。可以使用这些平分线的斜率和截距来计算圆心的坐标,再利用圆心与三角形顶点之间的距离来确定外接圆的半径。 方法3:使用三角法 三角法是一种用于分析图像或数据的统计方法。在MATLAB中,可以使用三角法来计算直线三角形之间的距离。这个方法通过找到与直线垂直的距离最大的级别来确定直线三角形的关系。 所以,根据你的问题,你可以使用MATLAB中的这些方法来计算直线三角形之间的关系。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [matlab实现三角形的外接圆与内接圆](https://blog.csdn.net/qq_27359637/article/details/60976939)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [使用三角形方法对灰度图像进行阈值处理:计算三角形方法的阈值。-matlab开发](https://download.csdn.net/download/weixin_38725734/19291556)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值