为了账号安全,请及时绑定邮箱和手机立即绑定

如何确定点是否在二维三角形中?

如何确定点是否在二维三角形中?

白板的微信 2019-06-15 11:34:15
如何确定点是否在二维三角形中?是否有一个简单的方法来确定一个点是否在一个三角形内?它是二维的,不是3D的。
查看完整描述

3 回答

?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

解下列方程组:

p = p0 + (p1 - p0) * s + (p2 - p0) * t

重点p在三角形内,如果0 <= s <= 10 <= t <= 1s + t <= 1.

s,t1 - s - t被称为重心坐标重点p.


查看完整回答
反对 回复 2019-06-15
?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

我同意安德烈亚斯·布林克,以重心为中心的坐标对此任务非常方便。请注意,不需要每次求解方程系统:只需计算解析解即可。使用安德烈亚斯“表示法,解决办法是:

s = 1/(2*Area)*(p0y*p2x - p0x*p2y + (p2y - p0y)*px + (p0x - p2x)*py);
t = 1/(2*Area)*(p0x*p1y - p0y*p1x + (p0y - p1y)*px + (p1x - p0x)*py);

哪里Area是三角形的(签名)区域:

Area = 0.5 *(-p1y*p2x + p0y*(-p1x + p2x) + p0x*(p1y - p2y) + p1x*p2y);

只是评估一下st1-s-t..重点p是三角形的当且仅当它们都是正的。

编辑:请注意,该区域的上述表达式假定三角形节点编号是逆时针方向的。如果编号是顺时针方向的,则此表达式将返回一个负区域(但大小正确)。测试本身(s>0 && t>0 && 1-s-t>0)并不取决于编号的方向,因为上面的表达式乘以1/(2*Area)如果三角形节点方向发生变化,也要更改符号。

编辑2:要获得更高的计算效率,请参见COPROC下面的注释(它指出,如果预先知道三角形节点(顺时针或逆时针)的方向,则按2*Area在表达式中st可以避免)。另见阿祖尔注释中的jspldle-代码安德烈亚斯·布林克答案。


查看完整回答
反对 回复 2019-06-15
  • 3 回答
  • 0 关注
  • 667 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信