【发布时间】:2020-08-10 11:57:22
【问题描述】:
对于特定的 y 坐标,如何在圆的边缘找到两个相反的 x 坐标?
y 坐标为零表示圆心,因此两个 x 坐标为 +- 半径
等于半径的 y 坐标将给出两个 x 坐标为零。
我正在使用 Javascript,但任何语言解决方案都可以。
【问题讨论】:
标签: javascript math geometry trigonometry
对于特定的 y 坐标,如何在圆的边缘找到两个相反的 x 坐标?
y 坐标为零表示圆心,因此两个 x 坐标为 +- 半径
等于半径的 y 坐标将给出两个 x 坐标为零。
我正在使用 Javascript,但任何语言解决方案都可以。
【问题讨论】:
标签: javascript math geometry trigonometry
假设您谈论的是位于(0,0) 的圆(由方程式x²+y²=R² 描述),并且您需要根据y 和R 返回一对(对称)x 坐标,那就是比如:
const getX = (y, R) => [1, -1].map(n => n*(R**2-y**2)**0.5)
以下是一个快速的概念验证现场演示:
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;
我发布更快版本的原因是,在扫描衬圈以进行图形化内容演示时,经常使用此功能。在这种情况下,性能至关重要。
【讨论】: