C++-点到点、点到线、共线等常用计算

1. 一点到另外两点组成直线的距离

已知点p /p1/p2,求p到p1 p2的距离
根据点到直线的距离公式:d = (Ax0 + By0 + C) / sqrt(A * A + B * B)
A = y2 - y1
B = x1 - x2;
C = x2 * y1 - x1 * y2;

程序实现

//定义Point2f结构体  
struct Point2f
{
	float x;
	float y;
};

// 定义直线参数结构体  
struct LinePara
{
	float k;
	float b;
}
//距离计算
float NavMath::PointToLineDis(Point2f p, Point2f p1, Point2f p2)
{
	float A = p2.y - p1.y;
	float B = p1.x - p2.x;
	float C = p2.x * p1.y - p1.x * p2.y;
	float dis = (A * p.x + B * p.y + C) / sqrt(A * A + B * B);
	return dis;
}

2.获取平面两点间的距离

两点组成向量的模即为两点间的距离

//使用Eigen库,两点组成向量的模即为距离
// 获取平面两点之间的距离
double GetTwoPointsDistance(const Eigen::Vector2d &p1,
                            const Eigen::Vector2d &p2) {
  return (p1 - p2).norm();
}

3计算两个向量的夹角

由两个向量计算夹角

// 获取两个向量的夹角
double GetTwoVectorsAngle(const Eigen::Vector2d &v1,
                          const Eigen::Vector2d &v2) {
  double cosine_value = v1.dot(v2) / (v1.norm() * v2.norm());
  // 归约到-1到1,防止出错
//  if (cosine_value > 1)
   // cosine_value = 1;
  //else if (cosine_value < -1)
    //cosine_value = -1;

//弧度
  double value = acos(cosine_value);

  return value;
}

4. 判断三点共线

/检查三点是否共线,以p1为顶点的角度小于某个值来判断


bool IsThreePointsInLine(const Eigen::Vector2d &p1, const Eigen::Vector2d &p2,
                         const Eigen::Vector2d &p3, double radian_deviation) {
  Eigen::Vector2d p1_p2 = p2 - p1;
  Eigen::Vector2d p1_p3 = p3 - p1;
  // 有重合点直接返回true
  if (p1_p2.norm() == 0 || p1_p3.norm() == 0) {
    return true;
  }

  double radian_value_of_p1 = GetTwoVectorsAngle(p1_p2, p1_p3);


  Eigen::Vector2d p3_p1 = p1 - p3;
  Eigen::Vector2d p3_p2 = p2 - p3;
  // 有重合点直接返回true
  if (p3_p1.norm() == 0 || p3_p2.norm() == 0) {
    return true;
  }

  double radian_value_of_p3 = GetTwoVectorsAngle(p3_p1, p3_p2);

  if (radian_value_of_p1 <= radian_deviation &&
      radian_value_of_p3 <= radian_deviation) {
    return true;
  } else {
    return false;
  }
}

TODO 数据类型多用eigen库

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值