快速判断点在三角形内(转载)

本文提供了一种快速判断点是否位于2D和3D三角形内部的方法,通过向量运算来实现高效的点位置判断。适用于游戏开发、计算机图形学等领域。

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

来自:
http://www.azure.com.cn/article.asp?id=235
http://www.azure.com.cn/article.asp?id=236

一.快速判断点在2D三角形内

伪代码(Pseudocode) 如下:
bool pointIn2DTri(vec2 p, vec2 a, vec2 b, vec2 c)
{
 vec2 v1, v2;
 float area[3];
 bool zero_area[3];
 v1 = b - a;
 v2 = p - a;
 //2D向量叉乘的几何意义在于,等于V1,V2向量组成三角形面积的两倍
 area[0] = crossproduct(v1,v2);
 //判断浮点数是否等于0
 zero_area[0] = realequal(area[0], 0.0);
 v1 = c - b;
 v2 = p - b;
 area[1] = crossproduct(v1, v2);
 zero_area[1] = realequal(area[1], 0.0);
 if(!zero_area[0] && !zero_area[1] &&
 sign(area[0])!=sign(area[1])) //一个是正面积一个是负面积
 {
 return false;
 }
 v1 = a - c;
 v2 = p - c;
 area[2] = crossproduct(v1, v2);
 zero_area[2] = realequal(area[2], 0.0);
 //和相临的边再判断
 if((!zero_area[0] && !zero_area[2] && sign(area[0])!=sign(area[2])) ||
 (!zero_area[1] && !zero_area[2] && sign(area[1])!=sign(area[2])))
 {
 return false;
 }
 return true;
}

二.快速判断点在3D三角形内

伪代码(Pseudocode) 如下:
比2D的判断稍微复杂一点点。
bool pointIn3DTri(vec3 p, vec3 a, vec3 b, vec3 c)
{
 vec3 v1, v2;
 float dot[3];
 bool zeroDot[3];
 //生成三角形的法线,任意两条边叉积
 vec3 normal = makenormal(a, b, c);
 v1 = b - a;
 v2 = p - a;
 dot[0] = dotproduct(crossproduct(v1, v2), normal);
 zeroDot[0] = realequal(dot[0], 0.0);
 v1 = c - b;
 v2 = p - b;
 dot[1] = dotproduct(crossproduct(v1, v2), normal);
 zeroDot[1] = realequal(dot[1], 0.0);
 if(!zeroDot[0] && !zeroDot[1] &&
 sign(dot[0] != sign(dot[1]))
 return false;
 v1 = a - c;
 v2 = p - c;
 dot[2] = dotproduct(crossproduct(v1, v2), normal);
 zeroDot[2] = realequal(dot[2], 0.0);
 bool ifs1 = !zeroDot[0] && !zeroDot[2] && sign(dot[0]) != sign(dot[2]);
 bool ifs2 = !zeroDot[1] && !zeroDot[2] && sign(dot[1]) != sign(dot[2]);
 if(ifs1 || ifs2)
 return false;
 return true;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值