gpt4 book ai didi

c++ - 计算接触两点的圆心

转载 作者:行者123 更新时间:2023-11-30 04:11:56 24 4
gpt4 key购买 nike

我正在尝试根据点 p1p2半径 来计算接触两点的圆心,我我用等腰三角形的外接圆来表示。此操作将产生两个点,一个在与 p1p2 相交的平面上方,一个在其下方,由 bool 参数表示。

这就是我的进展。知道我做错了什么吗?

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);
};

最佳答案

无需使用任何三角函数...从计算中点和从其中一个点到中点的 vector 开始:

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);

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

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

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

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

关于c++ - 计算接触两点的圆心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20025805/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com