我正在尝试计算一个圆的中心,在给出点 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);
};
答案 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
值添加到余弦值和正弦值,然后立即将结果再次用作余弦和正弦值。这毫无意义。