给定三角形ABC和一点P(x, y),判断P是否在三角形内

解题思路:
  根据点P与三角形其中两点所形成的三角形面积之和与三角形ABC面积进行比较,如果相等则点P在三角形内,不相等则不在三角形ABC内。
解题步骤:
  一、根据给定的三点坐标计算三角形的面积;
  二、将点P所形成的的三角形面积之和与三角形ABC进行比较,相等则说明点P在三角形ABC内,反之则不在三角形ABC内。
步骤分析:
  根据给定的三点坐标计算三角形的面积
在这里插入图片描述
  如上图所示,给定abc三点在坐标系中围成一个三角形
  三角形abc的面积可以用公式s = 1/2 * (ac * bd) = 1/2 * (ac * ab * sinΘ)
  ac和ab长度相当于向量ac和ab的模,为了方便表达,向量ac(c1 - a1, c2 - a2)记为ac(ac1, ac2),向量ab(b1 - a1, b2 - a2)记为ab(ab1, ab2)。
  那么上面的公式就可以转换为
在这里插入图片描述
  注:4式转5式中的向量的乘积相当于两个向量之间x与y坐标相乘的推导如下
  计算向量ab和向量ac的乘积,向量ab(x1, y1),向量ac(x2, y2)。现在假设两个x和y的单位向量i(1,0),j(0, 1)。
  那么向量ab可以表示为ab(x1 * i,y1 * j),向量ac可表示为ac(x2 * i, y2 * j)。
  那么向量ab和ac的乘积就相当于x1x2i^2 + x1y2ij + x2y1ij + y1y2j^2 = x1x2 + y1y2。
  由上面推导可知,根据给定三点的坐标,所得的三角形的面积为
  s = 1/2 * (|(c1 - a1) * (b2 - a2) - (c2 - a2) * (b1 - a1)|)。
  将点P所形成的三角形面积之和与三角形ABC进行比较
  分别用上面推导出来的公式计算各个三角形的面积,然后再进行判断。
  注意:计算的结果应当以浮点数储存,以及比较的时候要以浮点数的比较方式进行比较。

实现代码:
//浮点数零值
#define ABS_FLOAT_0 0.000001

//点的结构体
struct point
{
  float x;
  float y;
};

//计算三角形面积

float cal_area(const struct point1, const struct point2, const struct point3)
{
  struct point ab, ac;
  
  ab.x = point2.x - point1.x;
  ab.y = point2.y - point1.y;
  ac.x = point3.x - point1.x;
  ac.y = point3.y - point1.y;
  
  return fabs(ab.x * ac.y - ab.y * ac.x) / 2.0f;
}

//判断
bool is_in(const point a, const point b, const point c, const point d)
{
  float SABC, SADB, SBDC, SADC;
  SABC = cal_area(a, b, c);
  SADB = cal_area(a, d, b);
  SADC = cal_area(a, d, c);
  SBDC = cal_area(b, d, c);
  
  float sum_area = SADB + SADC + SBDC;
  
  if((-ABS_FLOAT_0 < SABC - sum_area) && ((SABC - sum_area) < ABS_FLOAT_0))
    return true;
  else
    return false;
}

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值