Qt 判断一个点是否落在三角形内(算法)

138 篇文章 196 订阅

利用重心法判断一个点是否落在三角形面积内,三角形的三个点在同一个平面上,如果选中其中一个点,其他两个点不过是相对该点的位移而已,比如选择点A作为起点,那么点B相当于在AB方向移动一段距离得到,而点C相当于在AC方向移动一段距离得到。

所以对于平面内任意一点,都可以由如下方程来表示
P = A + u * (C – A) + v * (B - A) // 方程1
如果系数u或v为负值,那么相当于朝相反的方向移动,即BA或CA方向。那么如果想让P位于三角形ABC内部,u和v必须满足什么条件呢?有如下三个条件
u >= 0
v >= 0
u + v <= 1
几个边界情况,当u = 0且v = 0时,就是点A,当u = 0,v = 1时,就是点B,而当u = 1, v = 0时,就是点C
整理方程1得到P – A = u(C - A) + v(B - A)
令v0 = C – A, v1 = B – A, v2 = P – A,则v2 = u * v0 + v * v1,现在是一个方程,两个未知数,无法解出u和v,将等式两边分别点乘v0和v1的到两个等式
(v2) • v0 = (u * v0 + v * v1) • v0
(v2) • v1 = (u * v0 + v * v1) • v1
注意到这里u和v是数,而v0,v1和v2是向量,所以可以将点积展开得到下面的式子。
v2 • v0 = u * (v0 • v0) + v * (v1 • v0) // 式1
v2 • v1 = u * (v0 • v1) + v * (v1• v1) // 式2
解这个方程得到
u = ((v1•v1)(v2•v0)-(v1•v0)(v2•v1)) / ((v0•v0)(v1•v1) - (v0•v1)(v1•v0))
v = ((v0•v0)(v2•v1)-(v0•v1)(v2•v0)) / ((v0•v0)(v1•v1) - (v0•v1)(v1•v0))

整理成 Qt 的函数形式如下:

// Determine whether point P in triangle ABC
bool pointInTriangle(QVector2D A, QVector2D B, QVector2D C, QVector2D P)
{
    QVector2D v0 = C - A;
    QVector2D v1 = B - A;
    QVector2D v2 = P - A;

    float dot00 = QVector2D::dotProduct(v0, v0);
    float dot01 = QVector2D::dotProduct(v0, v1);
    float dot02 = QVector2D::dotProduct(v0, v2);
    float dot11 = QVector2D::dotProduct(v1, v1);
    float dot12 = QVector2D::dotProduct(v1, v2);

    float inverDeno = 1 / (dot00 * dot11 - dot01 * dot01);

    float u = (dot11 * dot02 - dot01 * dot12) * inverDeno ;
    if (u < 0 || u > 1) // if u out of range, return directly
    {
        return false;
    }

    float v = (dot00 * dot12 - dot01 * dot02) * inverDeno ;
    if (v < 0 || v > 1) // if v out of range, return directly
    {
        return false;
    }

    return u + v <= 1;
}

(以上算法来自于网络,由我整理成 Qt 可用的函数)

### 回答1: 要判断一个点是否在一个多边形中,可以使用射线法或点和多边形边界的交叉数判断法。 1. 射线法 首先,从该点画一条射线(可以是任意方向),统计这条射线穿过多边形边界的次数。如果是奇数次,则该点在多边形内;如果是偶数次,则该点在多边形外。 2. 点和多边形边界的交叉数判断法 从该点向任意方向发出一条射线,计算这条射线与多边形的每条边相交的次数。如果该点在多边形内,则这个交叉数应该是奇数,否则就是偶数。 这两种方法都可以实现多边形中的点的判断,但需要注意的是,如果多边形自交或有重叠部分,则这些方法可能无法正确判断是否在多边形中。 ### 回答2: QT是一种编程库,可以用于判断一个点是否在多边形中。这个功能可以通过判断是否在多边形的边界上和角度判断来实现。 首先,我们可以通过求解点与多边形的交点数量来判断是否在多边形的边界上。如果交点数量为奇数,则说明点在多边形内部;如果交点数量为偶数,则说明点在多边形外部。可以使用射线法来实现该功能,即从该点引一条射线,然后统计与多边形边界的交点数量。 其次,我们可以通过计算点与多边形顶点的夹角是否为360度来判断是否在多边形内部。如果点与多边形顶点的夹角和为360度,则说明点在多边形内部;如果夹角和小于360度,则说明点在多边形外部。可以使用向量法来实现该功能,即将点与多边形的各个顶点连成向量,然后计算这些向量的和的夹角和。 在使用QT库来实现这个功能时,可以利用其中提供的几何计算函数和算法QT库中提供了一些相关的类和函数,如QPolygon类和QPoint类,可以用来表示多边形的顶点和点的坐标,并进行相应的计算和判断。通过使用这些类和函数,可以方便地判断一个点是否在多边形中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值