【问题标题】:Draw square with polar coordinates用极坐标画正方形
【发布时间】:2011-06-14 21:42:37
【问题描述】:

我有一个正方形,其中最近的点距离中心 1 个单位。请看下面我的 ascii 图:

+-----------+
|           |
|  x        |
|-----+     |
|           |
|           |
+-----------+

因此,从原点到角点的距离是 sqrt(2)。我需要一个函数来返回从原点到正方形上任意角度点的距离。例如,对于 0 的输入,该函数将返回 1。对于 45 的输入,该函数将返回与角点的距离,即 2 的平方根。然后对于 90,它将再次返回 1。

换句话说,当你用极坐标图绘制函数时,它会画一个正方形。

我相信函数会是这样的:

f(x) = sqrt(tan(x)^2+1)

唯一的问题是上面的函数不会绘制正方形的边。我需要一些能吸引所有 4 个方面的东西。

我知道有一个类似的三角函数,但我将在 javascript 中使用这个函数,所以我只能使用标准的三角函数。

任何帮助将不胜感激。提前致谢。

【问题讨论】:

  • 你真的只需要知道1/8平方的答案...
  • 是的,但问题是让每个角度都对应于 1/8 角度的正确部分。
  • 嘿@Joel - 回来选择 MonoMano 的答案,因为它实际上是正确的 :-)
  • @Pointy - 感谢您的诚实。 :-)

标签: javascript math trigonometry graphing


【解决方案1】:

我猜这会更快:

function getLengthForDeg(phi){
    phi = ((phi+45)%90-45)/180*Math.PI;
    return 1/Math.cos(phi);
}

【讨论】:

  • 我认为你错过了平方根计算,但我可能误解了一些东西。
  • 我很喜欢你将角度归一化的方式。
  • Cos(phi)=a/c 其中 a 为 1(水平边),我们想知道 c。那么 c=a/cos(phi)。现在,您提到您有 8 个饼图,因此您需要将 phi 的间隔锁定在 -45 和 45 之间,这就是我在那里有 (phi+45)%90-45 的原因。但我没有看到使用 sqrt 的意义。
  • 嗯,是的,但是需要的数据是 1/cos(x),因为 cos 的定义。
  • 谢谢,MonoMano。我相信您的功能会比 Pointy 的更快。
【解决方案2】:

我想出了一个可以与 TI 计算器一起使用的方程,因为它们的极坐标图函数的窗口部分中的 theta 阶跃函数。不知道对你有没有帮助。我想它只有在您能够配置 theta(或度数)步骤时才能工作。

r = (((s*sqrt(2)) - 5)/4) sin(4(x - (pi/8)) + (((s*sqrt(2)) + s)/4)

其中 s 是所需正方形的边长

将 theta 步长设置为 pi/4,以便绘制创建正方形图像所需的主要点

同样,这适用于 TI 计算器。

【讨论】:

    【解决方案3】:

    原始帖子被标记为 Javascript,但对于不能对浮点数取模的类型语言(例如 C),我需要它。

    MonoMano 的答案是正确的,但对于其他需要同样事情的人来说,这里是 MonoMano 为 C / ObjC / Java / 等修改的答案:

    /** c.f. http://stackoverflow.com/a/4788992/153422
    * M_PI_2 is a constant: "PI / 2"
    * M_PI_4 is a constant: "PI / 4"
    */
    double getSquarePolarRadiusForRad(double phi){
        double phiInPiBy4Range = phi;
        while( phiInPiBy4Range > M_PI_4 )
            phiInPiBy4Range -= M_PI_2;
        while( phiInPiBy4Range < - M_PI_4 )
            phiInPiBy4Range += M_PI_2;
    
        return 1/cos(phiInPiBy4Range);
    }
    

    【讨论】:

      【解决方案4】:

      我对 Javascript 不够熟悉,但是在 Wolfram Alpha 中使用的格式中,角度半径的公式是:

      min(1/abs(cos(theta)),1/abs(sin(theta))))

      【讨论】:

      • 这似乎不对……如果你只有一个角度,就无法确定半径有多长。
      • @Werner 由于OP专门询问长度为1的正方形,因此您不需要半径。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-29
      • 1970-01-01
      • 2018-05-31
      • 1970-01-01
      • 1970-01-01
      • 2020-10-07
      • 1970-01-01
      相关资源
      最近更新 更多