【问题标题】:Calculating the two x coordinates at edge of circle for a specific y coordinate计算特定 y 坐标的圆边缘的两个 x 坐标
【发布时间】:2020-08-10 11:57:22
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: javascript math geometry trigonometry


    【解决方案1】:

    假设您谈论的是位于(0,0) 的圆(由方程式x²+y²=R² 描述),并且您需要根据yR 返回一对(对称)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 个数组,并重复完整计算两次,即使第二个结果是第一个的简单负数(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;
      

      我发布更快版本的原因是,在扫描衬圈以进行图形化内容演示时,经常使用此功能。在这种情况下,性能至关重要。

      【讨论】:

        猜你喜欢
        • 2014-08-19
        • 1970-01-01
        • 2011-10-01
        • 2014-06-09
        • 1970-01-01
        • 2020-06-16
        • 2023-04-06
        • 1970-01-01
        相关资源
        最近更新 更多