计算特定 y 坐标的圆边缘处的两个 x 坐标

Calculating the two x coordinates at edge of circle for a specific y coordinate

如何在特定 y 坐标的圆的边缘找到两个相反的 x 坐标?

y 坐标为零表示圆心,因此两个 x 坐标将为 +- 半径

等于半径的 y 坐标会给出两个 x 坐标为零。

我正在使用 Javascript,但任何语言解决方案都可以。

假设您正在谈论放置在 (0,0) 的圆(由等式 x²+y²=R² 描述)并且您需要 return 对(对称)x 坐标在 yR 上,会是这样的:

const getX = (y, R) => [1, -1].map(n => n*(R**2-y**2)**0.5)

以下是快速 proof-of-a-concept live-demo:

const getX = (y, R) => [1, -1].map(n => n*(R**2-y**2)**0.5)

console.log(getX(0,1))
console.log(getX(1,1))
console.log(getX(-1,1))
console.log(getX(0.7071,1))
.as-console-wrapper{min-height:100%;}

如果考虑任意圆心 ((x0,y0)) ((x-x0)²+(y-y0)²=R²),更通用的解决方案应该可行:

const getX = (y, R, x0, y0) => [1, -1].map(n => n*(R**2-(y-y0)**2)**0.5+x0)

现有答案虽然在技术上是正确的,但效率极低。使用的模式每次调用都会创建 2 个数组,并重复完整计算两次,即使第二个结果是第一个的简单负数(2 个而不是 1 个平方根运算)。

以下是快 14 倍 (1400%)

const circleXForY = (y, r) => [y = (1 - (y / r) ** 2) ** 0.5 * r, -y];

如果你考虑到当 y > r 时结果也可以是 NaN 的事实,那么当 y > r || y < -r 时上述函数的速度快了惊人的 196 倍 (19,600%)。

进一步的小改进是只使用正结果

const circleXForY = (y, r) => (1 - (y / r) ** 2) ** 0.5 * r;

我发布一个更快版本的原因是这个函数在扫描衬里圆以进行图形化的内容展示时经常使用。我在这种情况下性能很关键。