编程之美:第四章 数字之趣 4.4点是否在三角形内

该博客讨论了如何在二维坐标系中判断一个点是否位于已知顶点坐标的三角形内,包括两种解法:一是通过比较三角形面积,二是使用向量叉积判断。提供了C++实现代码,并给出了示例输入和输出。

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

/*
点是否在三角形内:
如果一个二维坐标系中,已知三角形顶点的坐标,那么对于坐标系中的任意一点,如何判断该点是否在三角形内(点在三角形边线上也可)?
假设三角形顶点的坐标为ABC(逆时针),需要判断点D是否在该三角形内。

分析:
利用垂涎的交点可以判断。如果点D在三角形内,所有的垂线交点都在三角形的边线之内。如果点D在三角形之外,则垂线的交点就会在三角形边线的延长线上。
但是钝角三角形是不可取的,此方法错误。

解法1:
研究点与线段之间的关系,考虑把点D和其他的三个点连接起来。将问题转化为比较三角形ABC的面积 与 三角形ABD BCD CAD的面积之和
如果Sabc = Sabd + Sbcd + Scad,那么点D在三角形ABC的内部或者边上,如果 Sabc < Sabd + Sbcd + Scad ,则点D在三角形外部。

计算三角形面积用海伦公式
计算出三边的边长分别为a,b,c,
p = (a + b + c)/2;
S = 根号下(p-a)*(p-b)*(p-c)*p


解法2:
因为三角形是凸的,所以如果有一个D在三角形ABC内,那么沿着三角形的边界逆时针走,点D一定保持在边界的左边,也就是说点D在边AB,BC,CA的左边。
判断一个点P3是否在射线P1,P2的左边,可以通过P1P2,P1P3两个向量叉积的正负判断
如果叉积为正,则P3在P1P2的左边
          负,            右
		  0,             射线上

输入:
3 2(输入测试点的坐标)
1 1(输入三角形三个顶点的坐标)
5 1
3 3

2 3
1 1
5 1
3 3
输出:
Yes
No

*/

/*
关键:
1 if(dSabd + dSbcd + dScda > dSabc)//如果三个小三角形的面积大于原三角形面积,那么说明测试点不再原三角形内
2 return sqrt( (dP - dA) * (dP - dB) * (dP - dC) * dP);//计算面积采用海伦公式,计算出三边的边长分别为a,b,c,p = (a + b + c)/2;S = 根号下(p-a
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值