如何判断点P是否在三角形ABC内?

博客介绍了如何通过算法判断一个点是否位于三角形内部,提供了避免使用直线方程和线段夹角分类讨论的方法。

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

       本题最好不要用直线方程或线段夹角来判断,因为这涉及到分类与讨论,下面的算法是相对比较好的算法,代码如下:

#include<iostream>
#include<cmath>
using namespace std;

typedef struct point
{
	float x;
	float y;
}Point;

float side(Point A, Point B)
{
	float xLen = A.x - B.x;
	float yLen = A.y - B.y;
	return sqrt(xLen * xLen + yLen * yLen);
}

float area(Point A, Point B, Point C)
{
	float a = side(B, C);
	float b = side(A, C);
	float c = side(A, B);
	float p = (a + b + c)/ 2;
	
	//海伦公式
	float s = sqrt(p * (p - a) * (p - b) * ( p - c));
	return s;
}

bool isEqual(float x, float y)
{
	if(fabs(x - y) < 0.0001)
		return true;

	return false;
}

int main()
{
	Point A, B, C, P;
    //可以对A进行整体赋值,下面采用的是分步赋值
	
	A.x = 0;
	A.y = 0;  // A(0, 0)
	B.x = 2;
	B.y = 0;  // B(2, 0)
	C.x = 1;
	C.y = 1;  // C(1, 1)

	P.x = 0.5;
	P.y = 0.6; // P(0.5, 0.6)

	float s  = area(A, B, C);
	float s1 = area(P, B, C);
	float s2 = area(P, A, C);
	float s3 = area(P, A, B);

	if(isEqua
### 判断是否位于三角形内部的算法 在 Unreal Engine 中,判断一个 \(P\) 是否位于由三个顶 \(A\)、\(B\) 和 \(C\) 构成的三角形内部,通常可以采用 **重心坐标法** 或者 **向量叉积法** 来实现。 #### 方法一:重心坐标法 通过计算 \(P\) 的重心坐标来判断是否处于三角形内部。如果重心坐标的分量均满足条件,则说明该三角形内。 设三角形的三个顶为 \((Ax, Ay)\),\((Bx, By)\),\((Cx, Cy)\),待检测为 \((Px, Py)\)。可以通过以下公式计算重心坐标: \[ u = ((By - Cy)(Px - Cx) + (Cx - Bx)(Py - Cy)) / ((By - Cy)(Ax - Cx) + (Cx - Bx)(Ay - Cy)) \] \[ v = ((Cy - Ay)(Px - Cx) + (Ax - Cx)(Py - Cy)) / ((By - Cy)(Ax - Cx) + (Cx - Bx)(Ay - Cy)) \] \[ w = 1 - u - v \] 当且仅当 \(u \geq 0\),\(v \geq 0\),并且 \(w \geq 0\) 时, \(P\) 才位于三角形内部[^1]。 以下是基于此方法的一个 Unreal Engine 蓝图函数或 C++ 实现示例: ```cpp bool IsPointInTriangle(const FVector& A, const FVector& B, const FVector& C, const FVector& P) { float denominator = (B.Y - C.Y) * (A.X - C.X) + (C.X - B.X) * (A.Y - C.Y); float u = ((B.Y - C.Y) * (P.X - C.X) + (C.X - B.X) * (P.Y - C.Y)) / denominator; float v = ((C.Y - A.Y) * (P.X - C.X) + (A.X - C.X) * (P.Y - C.Y)) / denominator; float w = 1.0f - u - v; return (u >= 0.0f && v >= 0.0f && w >= 0.0f); } ``` #### 方法二:向量叉积法 另一种常用的方法是利用向量叉积的方向性来判断的位置关系。对于给定的三角形边 \(AB\)、\(BC\) 和 \(CA\),分别计算它们目标构成的矢量之间的方向一致性。 具体来说,定义如下三个叉积表达式: \[ V_{AB} = (B - A) \times (P - A) \] \[ V_{BC} = (C - B) \times (P - B) \] \[ V_{CA} = (A - C) \times (P - C) \] 如果这三个叉积的结果同号(即均为正数或者负数),则表明 \(P\) 处于三角形内部;否则不在其中[^2]。 对应的 Unreal Engine C++ 实现可能如下所示: ```cpp float CrossProduct2D(FVector Vec1, FVector Vec2) { return Vec1.X * Vec2.Y - Vec1.Y * Vec2.X; } bool IsPointInsideUsingCrossProducts(const FVector& A, const FVector& B, const FVector& C, const FVector& P) { FVector AB = B - A; FVector AP = P - A; float crossAB_AP = CrossProduct2D(AB, AP); FVector BC = C - B; FVector BP = P - B; float crossBC_BP = CrossProduct2D(BC, BP); FVector CA = A - C; FVector CP = P - C; float crossCA_CP = CrossProduct2D(CA, CP); bool isSameSign_AB_BC = FMath::Sign(crossAB_AP) == FMath::Sign(crossBC_BP); bool isSameSign_BC_CA = FMath::Sign(crossBC_BP) == FMath::Sign(crossCA_CP); bool isSameSign_CA_AB = FMath::Sign(crossCA_CP) == FMath::Sign(crossAB_AP); return isSameSign_AB_BC && isSameSign_BC_CA && isSameSign_CA_AB; } ``` 以上两种方式均可用于解决 UE 中关于是否落在指定平面三角形内的判定问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值