天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 68|回复: 0

二维平面上判断点在三角形内的最优算法

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
[code]// 2D vector
class Vec2
{
public:
    Vec2()
    {
        x = 0.0f;
        y = 0.0f;
    }

    Vec2(float fx, float fy)
        :x(fx), y(fy)
    {
    }

    // Add
    Vec2 operator + (const Vec2& v) const
    {
        return Vec2(x + v.x, y + v.y);
    }

    // Subtract
    Vec2 operator - (const Vec2& v) const
    {
        return Vec2(x - v.x, y - v.y) ;
    }


public:
    float x, y;
};[/code]


[code][/code][code]// Dot product
inline float Vec2Dot(const Vec2& v1, const Vec2& v2)
{
    return v1.x * v2.x + v1.y * v2.y;
}

// Cross product
inline float Vec2Cross(const Vec2& v1, const Vec2& v2)
{
    return v1.x * v2.y - v1.y * v2.x;
}

// Determine whether two vectors v1 and v2 point to the same direction
// 判断C和P在直线AB的同一侧
inline bool IsSameSide(const Vec2& A, const Vec2& B, const Vec2& C, const Vec2& P)
{
    Vec2 AB = B - A;
    Vec2 AC = C - A;
    Vec2 AP = P - A;

    float f1 = Vec2Cross(AB, AC);
    float f2 = Vec2Cross(AB, AP);

    // f1 and f2 should to the same direction
    return f1*f2 >= 0.0f;
}

// Same side method
// Determine whether point P in triangle ABC
inline bool IsPointInTriangle(const Vec2& A, const Vec2& B, const Vec2& C, const Vec2& P)
{
    return IsSameSide(A, B, C, P) &&
        IsSameSide(B, C, A, P) &&
        IsSameSide(C, A, B, P);
}

// Determine whether point P in angle ABC
// 点P是否在角ABC内
inline bool IsPointInAngle(const Vec2& A, const Vec2& B, const Vec2& C, const Vec2& P)
{
    return IsSameSide(A, B, C, P) && IsSameSide(B, C, A, P);
}[/code]

 

 

 

 

二维平面上判断点在三角形内的最优算法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-11-1 09:30 , Processed in 0.144291 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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