使用极坐标绘制正方形

8

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

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

因此,从原点到角落的距离是sqrt(2)。我需要一个函数,它可以返回任何角度的正方形上一点到原点的距离。例如,对于输入为0,函数将返回1。对于输入为45,函数将返回到角落的距离,即根号2。然后对于90,它将再次返回1。
换句话说,当您使用极坐标图绘制该函数时,它将绘制一个正方形。
我认为该函数可能是这样的:
f(x) = sqrt(tan(x)^2+1)

唯一的问题是上面的函数不会绘制正方形的四条边。我需要能够画出所有4条边的东西。
我知道有一个类似于这个的三角函数,但我将在Javascript中使用这个函数,所以只能使用标准的三角函数。
任何帮助将不胜感激。提前谢谢。

你只需要知道正方形的1/8的答案就可以了... - Pointy
是的,但问题在于如何使每个角度对应那1/8角的正确部分。 - Joel
嘿@Joel - 回来选择MonoMano的答案,因为那才是正确的 :-) - Pointy
@Pointy - 感谢您的诚实。 :-) - Joel
4个回答

12

我猜这样会更快:

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

我认为你漏掉了一个平方根的计算,但是我可能有所误解。 - Pointy
Cos(phi)=a/c,其中a为1(水平边),我们想知道c。那么c=a/cos(phi)。现在,您提到您有8个派,因此您需要将phi的间隔锁定在-45和45之间,这就是我使用(phi+45)%90-45的原因。但我不明白使用sqrt的意义。 - Mano Kovacs
嗯...cos phi就是单位圆上,与φ角相交半径的x坐标,对吧? - Pointy
1
嗯,是的,但所需数据是1/cos(x),因为cos的定义如此。 - Mano Kovacs
1
谢谢,MonoMano。我相信你的函数会比Pointy的更快。 - Joel
显示剩余2条评论

3

我对JavaScript不是很熟悉,但在Wolfram Alpha中使用的格式中,根据角度计算半径的公式为:

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


这似乎不对...如果你只有一个角度,就无法确定半径的长度。 - Werner
@Werner,由于OP特别询问了边长为1的正方形,因此您不需要半径。 - Frank Schmitt

2

原始帖子标记为Javascript,但我需要这个针对强类型语言(例如C),在这些语言中你无法对浮点数取模。

MonoMano的答案是正确的,但对于其他需要相同功能的人,这里是MonoMano的答案修改版,适用于C / ObjC / Java等语言:

/** c.f. https://dev59.com/klPTa4cB1Zd3GeqPlbHp#4788992
* 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);
}

1
我想出了一个方程,可以与TI计算器配合使用,因为它们在极坐标图函数的窗口部分具有theta步进函数。我不知道这是否对你有帮助。我猜只有在你能够配置theta(或度数)步进时才能起作用。
r = (((s*sqrt(2)) - 5)/4) sin(4(x - (pi/8)) + (((s*sqrt(2)) + s)/4)

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接