遍历描述螺旋线的公式以生成XY坐标

12
我正在尝试生成一个xy(二维)坐标形式的螺旋星系,但是数学不是我的强项。我从关于螺旋的一个优秀来源中了解到以下内容:
最简单的螺旋线——阿基米德螺旋线,包括半径r(t)和角度t成正比。因此方程为: (3)极坐标方程:r(t) = at [a为常量] 由此得出 (2)参数方程:x(t) = at cos(t), y(t) = at sin(t) (1)中心方程:x²+y² = a²[arc tan (y/x)]².
这个问题在stackoverflow上涉及到了星系生成,但回答零散且对我来说仍然过于复杂(即,我的数学能力不足以理解)。
本质上,我需要做的是在PHP中循环执行螺旋公式大约5000次,以在513x513 XY网格上生成点。网格的大小和所需点的数量可能会在未来改变。更好的方法是考虑将这些点向螺旋的起始点倾斜,不仅在频率上,还可以在距离精确数学公式的差异上,类似于真正的星系。 这篇数学论文讲述了描述螺旋星系结构的公式
我完全不知道如何将一个数学公式转化为可以在PHP中循环的东西!
1个回答

7
// a is 5 here
function x($t){ return 5 * $t * cos($t); }
function y($t){ return 5 * $t * sin($t); }

for ($t = 0; $t < 50; $t += 0.01) {
    $xyPoint = array(x($t), y($t));
    // draw it
}

当你遇到像这样的参数方程时,常见的参数变量是t,代表时间。因此,你可以考虑将递增的t值代入函数中,得到随着经过时间变化而逐渐改变的坐标。
你需要选择自己的a值、t的范围和递增步长。这取决于你的要求。如果对你确定画布大小上合适的a和t值有所帮助,cos()和sin()都有最大值为1。

感谢你的帮助,Chris。这确切地回答了我关于遍历参数方程的问题。我的下一个任务是调整公式以符合离散网格,但我不确定是否可能。 - Nick
x(t)的最大值不能超过网格宽度的一半,假设你将螺旋中心对齐。因此,a的值需要小于等于gridWidth /(t的上限* 2)。您选择的t范围决定了您绘制的螺旋数量。例如,如果t从0到2PI,则形成一个循环。0到50几乎是8个循环。这就是为什么t必须保留为变量,只有您可以选择合适的值(除了您没有人知道您想要多少个循环)。for循环的步长由rangeOf$t / numDesiredPointsToDraw确定。 - goat

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