计算接触两个点的圆心

时间:2013-11-17 00:45:39

标签: c++ trigonometry

我正在尝试计算一个圆的中心,在给出点 p1 p2 半径的情况下接触两个点,我使用等腰三角形的外接圆来表示它。此操作将产生两个点,一个位于与 p1 p2 相交的平面上方,另一个位于其下方,由布尔参数表示。

这是我走了多远。知道我做错了吗?

auto getSection = [](const point & p1, const point & p2, double radius, bool dir) -> point
{
  static constexpr double sin90 = sin(90 * M_PI / 180.0);
  static constexpr double cos90 = cos(90 * M_PI / 180.0);
  static constexpr double sin270 = sin(270 * M_PI / 180.0);
  static constexpr double cos270 = cos(270 * M_PI / 180.0);
  point p3 = point((p2.x() - p1.x()) / 2, (p2.y() - p1.y()) / 2);
  double ang = std::atan2(p3.y(), p3.x());
  if (dir)
    return point(p3.x() + (cos90 + ang) * radius, p3.y() + (sin90 + ang) * radius);
  else
    return point(p3.x() + (cos270 + ang) * radius, p3.y() + (sin270 + ang) * radius);
};

2 个答案:

答案 0 :(得分:2)

无需使用任何三角函数...首先计算中点和从一个点到中点的矢量:

double midX = (p1.x() + p2.x()) / 2;
double midY = (p1.y() + p2.y()) / 2;
double dx = (p1.x() - p2.x()) / 2;
double dy = (p1.y() - p2.y()) / 2;

然后,计算从每个点到中点的距离:

double dist = std::sqrt(dx * dx + dy * dy);

然后我们可以使用毕达哥拉斯定理计算从圆的中点到圆心的距离:

double pDist = std::sqrt(radius * radius - dist * dist);

我们可以使用所有这些信息来计算从圆的中点到圆心的矢量:

if(dir) {
    mDx = dy * pDist / dist;
    mDy = -dx * pDist / dist;
} else {
    mDx = -dy * pDist / dist;
    mDy = dx * pDist / dist;
}

现在,我们可以将该向量添加到中点,然后返回:

return point(midX + mDx, midY + mDy);

答案 1 :(得分:0)

第一个明显的问题是,您使用p3作为某种原点,您打算从中测量圆心。显然,意图是使用p1 -> p2段的中点。但p3计算为(p2 - p1) / 2,而p1 -> p2段的中点实际为(p1 + p2) / 2。看到区别?

如果您将p3解释为一个点,那么将其用作原点是没有任何意义的。 p3实际上是一个向量,其方向与p1 -> p2段重合,其大小是p1 -> p2距离的一半。因此,如果您要查找p1 -> p2段的中心,那么它将是p1 + p3。不只是p3,还有p1 + p3

第二个明显的问题是,由于某种原因,您将角度ang值添加到余弦值和正弦值,然后立即将结果再次用作余弦和正弦值。这毫无意义。