2012-06-03 54 views
11

我试图以xy(2D)坐标的形式生成螺旋星系 - 但数学不是我的强项。通过公式描述螺旋来产生XY坐标

我已经收集从上螺旋一个excellent source以下:

半径r(t)和角t为用于 simpliest螺旋,阿基米德螺线成比例的。因此,公式为:

(3)极坐标方程:r(t)= at [a是常数]。
从这如下
(2)参数的形式:X(t)=在cos(T),Y(T)=在SIN(t)的,
(1)中环 方程:X 2 + Y 2 =A²[ arc tan(y/x)] 2。

This question排序上眼星系产生,但反应是分散的,仍然是我所需要的(又名,我的数学哑的头脑无法理解它们)过于复杂。

本质上,我需要做的是循环PHP〜5000次的螺旋公式,以在513x513 XY网格上生成点。网格的大小和所需点数可能会在未来发生变化。更好的办法是将这些点权衡到螺旋的起源,频率和偏离精确数学公式的距离,类似于星系的实际外观。

这篇数学论文谈到了a formula that describes the structure of spiral galaxies

完全失去我的是如何将一个数学公式转换成我可以在PHP中循环的东西!

回答

6
// 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的范围和t的增量步长。这取决于你的要求。如果这可以帮助你根据你的画布尺寸找出适合的a和t的值,那么cos()和sin()的最大值都为1

+0

感谢您的帮助,Chris。这恰好回答了我关于循环参数方程的问题。我的下一个任务是调整公式来坚持离散网格,我不知道这是可能的。 – Nick

+0

假设你的螺旋居中,x(t)的最大值不能超过网格宽度的一半。所以,'a'的值需要<='gridWidth /(upperBoundOf $ t * 2)'。您为t选择的范围表示您绘制了多少个螺旋线。例如,如果t从0变为2PI,则形成一个循环。 0到50几乎是8个循环。这就是为什么t必须作为一个变量留下来,只有你可以选择一个合适的值(没有人,但你知道你想要多少个循环)。 for循环的步长由'rangeOf $ t/numDesiredPointsToDraw'决定 – goat