In Triangle Test 计算几何 判断一个点在(二维)三角形内部 C/C++

计算几何相关内容,不过里边的实现仅供参考,实际跑起来是会有些问题的

原理:海伦公式,2倍面积的行列式计算

*三角形面积公式行列式(海伦公式)
2*S=|p.x    p.y    1|
    |q.x    q.y    1|
    |s.x    s.y    1|
    */

面积为正代表s在p->q有向线段的左侧
 

结构体定义

struct Point {
    double x, y;
    bool extreme;
};

 in triangle

bool in_triangle(Point p, Point q, Point r, Point s) {
    return ToLeft(p, q, s) && ToLeft(q, r, s) && ToLeft(r, p, s);
}

 to left测试

bool ToLeft(Point p, Point q, Point s) {
    return Area2double(p, q, s) > 0;
}

Area的两种实现方法

int Area2(Point p, Point q, Point s) {
    return p.x*q.y + q.x*s.y + s.x*p.y
        - p.x*s.y - q.x*p.y - s.x*q.y;
}

double Area2double(Point p, Point q, Point s) {
    return p.x*q.y + q.x*s.y + s.x*p.y
        - p.x*s.y - q.x*p.y - s.x*q.y;
}

Area2()中,面积为0包含三种情况:数值太小;在线上,在右侧

实测Area2在数值比较小的时候会产生bug,数值太小需要改为浮点型

在线上的问题,如果是使用方法一致,在很多场景下可以忽略,但是如果你目的需要区分右侧和线上,可能会有问题,需要修改ToLeft的用法,或者补充一个ToRight。

以上只是二维环境下的对比,相对简化一点,求三维环境下点是否在三角内的思路:

1.根据三角形三维坐标求平面方程

2.求平面法线方程

3.过该点画法线,投影到平面内

4.判断投影点是否在三角形内(不推荐上述二维判断方法)

5.判断投影距离是否足够小,足够小则认为是误差,在三角形内。

https://github.com/huqinwei/cv_experiment/blob/main/pcl_test/ToLeft.cpp

https://github.com/huqinwei/cv_experiment.git

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值