游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2308|回复: 5

知道屏幕三角形的三个顶点坐标, 怎么检查点A是否在三角

[复制链接]

6

主题

7

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2006-3-31 12:05:00 | 显示全部楼层 |阅读模式
知道屏幕三角形的三个顶点坐标, 怎么检查点A是否在三角形内?
感谢...

8

主题

284

帖子

296

积分

中级会员

Rank: 3Rank: 3

积分
296
QQ
发表于 2006-3-31 14:16:00 | 显示全部楼层

Re:知道屏幕三角形的三个顶点坐标, 怎么检查点A是否在三

先判断点A是否在三角形所在的那个平面。如果是在三角形的平面上,那么用点A分别连接三角形的顶点产生出三个矢量,计算这三个矢量之间的点积且点积之和等于“360度”的话,那么点A在三角形内,否则不在。

7

主题

299

帖子

305

积分

中级会员

Rank: 3Rank: 3

积分
305
发表于 2006-3-31 15:11:00 | 显示全部楼层

Re:知道屏幕三角形的三个顶点坐标, 怎么检查点A是否在三

微软的例子有个pick,判断一射线是否穿过一个三角形,可以类似解决这个问题

6

主题

7

帖子

7

积分

新手上路

Rank: 1

积分
7
 楼主| 发表于 2006-3-31 20:02:00 | 显示全部楼层

Re:知道屏幕三角形的三个顶点坐标, 怎么检查点A是否在三

谢谢楼上的两位啊...

28

主题

685

帖子

703

积分

高级会员

Rank: 4

积分
703
发表于 2006-3-31 21:04:00 | 显示全部楼层

Re:知道屏幕三角形的三个顶点坐标, 怎么检查点A是否在三

这是个直线和三角形相交的算法。
template <class Real>
bool IntrLine3Triangle3<Real>::Test ()
{
    // compute the offset origin, edges, and normal
    Vector3<Real> kDiff = m_rkLine.Origin - m_rkTriangle.V[0];
    Vector3<Real> kEdge1 = m_rkTriangle.V[1] - m_rkTriangle.V[0];
    Vector3<Real> kEdge2 = m_rkTriangle.V[2] - m_rkTriangle.V[0];
    Vector3<Real> kNormal = kEdge1.Cross(kEdge2);

    // Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = line direction,
    // E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by
    //   |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))
    //   |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))
    //   |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)
    Real fDdN = m_rkLine.Direction.Dot(kNormal);
    Real fSign;
    if (fDdN > Math<Real>::ZERO_TOLERANCE)
    {
        fSign = (Real)1.0;
    }
    else if (fDdN < -Math<Real>::ZERO_TOLERANCE)
    {
        fSign = (Real)-1.0;
        fDdN = -fDdN;
    }
    else
    {
        // Line and triangle are parallel, call it a "no intersection"
        // even if the line does intersect.
        return false;
    }

    Real fDdQxE2 = fSign*m_rkLine.Direction.Dot(kDiff.Cross(kEdge2));
    if (fDdQxE2 >= (Real)0.0)
    {
        Real fDdE1xQ = fSign*m_rkLine.Direction.Dot(kEdge1.Cross(kDiff));
        if (fDdE1xQ >= (Real)0.0)
        {
            if (fDdQxE2 + fDdE1xQ <= fDdN)
            {
                // line intersects triangle
                return true;
            }
            // else: b1+b2 > 1, no intersection
        }
        // else: b2 < 0, no intersection
    }
    // else: b1 < 0, no intersection

    return false;
}

11

主题

123

帖子

123

积分

注册会员

Rank: 2

积分
123
发表于 2006-4-1 22:26:00 | 显示全部楼层

Re:知道屏幕三角形的三个顶点坐标, 怎么检查点A是否在三

根据流行的算法.最快的三角形重心,pick 中有,你自己要将之剔出来
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-24 02:38

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表