点与三角形的碰撞检测

博客提及算法描述参考链接,给出了重心坐标相关参考内容,并展示了重心坐标算法的C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

算法描述,参考链接:
[https://blackpawn.com/texts/pointinpoly/default.html]

代码实现,C++:

// Is the point within the face?
// Adapted from http://www.blackpawn.com/texts/pointinpoly/default.html
bool is_inside(const Vec2& point, const Face* f) {
    Vec3 bary = get_barycentric_coords(point, f);
    //printf("UV: %f, %f\n", u, v);
    // Check if point is in triangle
    // 10*epsilon: want to be robust for borders
    return ((bary[0] >= -10*EPSILON) && (bary[1] >= -10*EPSILON) && (bary[2] >= -100*EPSILON));
}
Vec3 get_barycentric_coords(const Vec2& point, const Face* f) {
    // Compute vectors        
    Vec2 v0 = f->v[0]->u - f->v[2]->u;
    Vec2 v1 = f->v[1]->u - f->v[2]->u;
    Vec2 v2 = point - f->v[2]->u;
    // Compute dot products
    double dot00 = dot(v0, v0);
    double dot01 = dot(v0, v1);
    double dot02 = dot(v0, v2);
    double dot11 = dot(v1, v1);
    double dot12 = dot(v1, v2);
    // Compute barycentric coordinates
    double invDenom = 1.f / (dot00 * dot11 - dot01 * dot01);
    double u = (dot11 * dot02 - dot01 * dot12) * invDenom;
    double v = (dot00 * dot12 - dot01 * dot02) * invDenom;
    return Vec3(u,v,1-u-v);
}

什么是重心坐标,参考:
重心坐标(Barycentric coordinates)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值