Pure Integer Sunflower Seed Spiral
/**
* Copyright Quasimondo ( http://wonderfl.net/user/Quasimondo )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/lapl
*/
// forked from Quasimondo's Sunflower Seed Spiral
package {
import flash.text.TextField;
import flash.display.Graphics;
import flash.display.Sprite;
public class SunflowerSpiral extends Sprite {
public function SunflowerSpiral() {
renderSpiral( 300, 7, 4, 0);
//renderSpiral( 120, 10, 5, 1);
}
private function renderSpiral( count:int, radius:int, padding:int, magicAngleIndex:uint = 0 ):void
{
var tf:TextField = new TextField();
addChild(tf);
tf.autoSize = "left";
var g:Graphics = graphics;
g.lineStyle(0,0xb0b0b0);
var x:int = 200;
var y:int = 200;
var divergence:int = [13750776,9950078,222492][magicAngleIndex % 3];
var offset:int = - radius * 30 / 100;
var cx:int;
var cy:int;
var lx:int = x;
var ly:int = y;
for ( var i:int = 1; i <= count; i++ )
{
var r:int = ((radius + padding) * integer_square_root2( 256 * i ) >> 4) + offset;
var a:int = ((divergence * i) % 36000000) * 4096 / 36000000;
var sincos:Vector.<int> = sine_12( a )
g.drawCircle( cx = x + ((sincos[1] * r) >> 12), cy = y + ((sincos[0] *r) >> 12), radius);
tf.appendText( (cx - lx)+" "+(cy-ly)+" ");
if ( i%10 == 0 ) tf.appendText("\n");
lx = cx;
ly = cy;
}
}
private const sine_12_table:Vector.<int> = Vector.<int>(
[
0, 6, 13, 19, 25, 31, 38, 44, 50, 57, 63, 69, 75, 82, 88, 94,
101, 107, 113, 119, 126, 132, 138, 144, 151, 157, 163, 170, 176, 182, 188, 195,
201, 207, 214, 220, 226, 232, 239, 245, 251, 257, 264, 270, 276, 283, 289, 295,
301, 308, 314, 320, 326, 333, 339, 345, 351, 358, 364, 370, 376, 383, 389, 395,
401, 408, 414, 420, 426, 433, 439, 445, 451, 458, 464, 470, 476, 483, 489, 495,
501, 508, 514, 520, 526, 533, 539, 545, 551, 557, 564, 570, 576, 582, 589, 595,
601, 607, 613, 620, 626, 632, 638, 644, 651, 657, 663, 669, 675, 682, 688, 694,
700, 706, 713, 719, 725, 731, 737, 744, 750, 756, 762, 768, 774, 781, 787, 793,
799, 805, 811, 818, 824, 830, 836, 842, 848, 854, 861, 867, 873, 879, 885, 891,
897, 904, 910, 916, 922, 928, 934, 940, 946, 953, 959, 965, 971, 977, 983, 989,
995, 1001, 1007, 1014, 1020, 1026, 1032, 1038, 1044, 1050, 1056, 1062, 1068, 1074, 1080, 1086,
1092, 1099, 1105, 1111, 1117, 1123, 1129, 1135, 1141, 1147, 1153, 1159, 1165, 1171, 1177, 1183,
1189, 1195, 1201, 1207, 1213, 1219, 1225, 1231, 1237, 1243, 1249, 1255, 1261, 1267, 1273, 1279,
1285, 1291, 1297, 1303, 1309, 1315, 1321, 1327, 1332, 1338, 1344, 1350, 1356, 1362, 1368, 1374,
1380, 1386, 1392, 1398, 1404, 1409, 1415, 1421, 1427, 1433, 1439, 1445, 1451, 1457, 1462, 1468,
1474, 1480, 1486, 1492, 1498, 1503, 1509, 1515, 1521, 1527, 1533, 1538, 1544, 1550, 1556, 1562,
1567, 1573, 1579, 1585, 1591, 1596, 1602, 1608, 1614, 1620, 1625, 1631, 1637, 1643, 1648, 1654,
1660, 1666, 1671, 1677, 1683, 1689, 1694, 1700, 1706, 1711, 1717, 1723, 1729, 1734, 1740, 1746,
1751, 1757, 1763, 1768, 1774, 1780, 1785, 1791, 1797, 1802, 1808, 1813, 1819, 1825, 1830, 1836,
1842, 1847, 1853, 1858, 1864, 1870, 1875, 1881, 1886, 1892, 1898, 1903, 1909, 1914, 1920, 1925,
1931, 1936, 1942, 1947, 1953, 1958, 1964, 1970, 1975, 1981, 1986, 1992, 1997, 2002, 2008, 2013,
2019, 2024, 2030, 2035, 2041, 2046, 2052, 2057, 2062, 2068, 2073, 2079, 2084, 2090, 2095, 2100,
2106, 2111, 2117, 2122, 2127, 2133, 2138, 2143, 2149, 2154, 2159, 2165, 2170, 2175, 2181, 2186,
2191, 2197, 2202, 2207, 2213, 2218, 2223, 2228, 2234, 2239, 2244, 2249, 2255, 2260, 2265, 2270,
2276, 2281, 2286, 2291, 2296, 2302, 2307, 2312, 2317, 2322, 2328, 2333, 2338, 2343, 2348, 2353,
2359, 2364, 2369, 2374, 2379, 2384, 2389, 2394, 2399, 2405, 2410, 2415, 2420, 2425, 2430, 2435,
2440, 2445, 2450, 2455, 2460, 2465, 2470, 2475, 2480, 2485, 2490, 2495, 2500, 2505, 2510, 2515,
2520, 2525, 2530, 2535, 2540, 2545, 2550, 2555, 2559, 2564, 2569, 2574, 2579, 2584, 2589, 2594,
2598, 2603, 2608, 2613, 2618, 2623, 2628, 2632, 2637, 2642, 2647, 2652, 2656, 2661, 2666, 2671,
2675, 2680, 2685, 2690, 2694, 2699, 2704, 2709, 2713, 2718, 2723, 2727, 2732, 2737, 2741, 2746,
2751, 2755, 2760, 2765, 2769, 2774, 2779, 2783, 2788, 2792, 2797, 2802, 2806, 2811, 2815, 2820,
2824, 2829, 2833, 2838, 2843, 2847, 2852, 2856, 2861, 2865, 2870, 2874, 2878, 2883, 2887, 2892,
2896, 2901, 2905, 2910, 2914, 2918, 2923, 2927, 2932, 2936, 2940, 2945, 2949, 2953, 2958, 2962,
2967, 2971, 2975, 2979, 2984, 2988, 2992, 2997, 3001, 3005, 3009, 3014, 3018, 3022, 3026, 3031,
3035, 3039, 3043, 3048, 3052, 3056, 3060, 3064, 3068, 3073, 3077, 3081, 3085, 3089, 3093, 3097,
3102, 3106, 3110, 3114, 3118, 3122, 3126, 3130, 3134, 3138, 3142, 3146, 3150, 3154, 3158, 3162,
3166, 3170, 3174, 3178, 3182, 3186, 3190, 3194, 3198, 3202, 3206, 3210, 3214, 3217, 3221, 3225,
3229, 3233, 3237, 3241, 3244, 3248, 3252, 3256, 3260, 3264, 3267, 3271, 3275, 3279, 3282, 3286,
3290, 3294, 3297, 3301, 3305, 3309, 3312, 3316, 3320, 3323, 3327, 3331, 3334, 3338, 3342, 3345,
3349, 3352, 3356, 3360, 3363, 3367, 3370, 3374, 3378, 3381, 3385, 3388, 3392, 3395, 3399, 3402,
3406, 3409, 3413, 3416, 3420, 3423, 3426, 3430, 3433, 3437, 3440, 3444, 3447, 3450, 3454, 3457,
3461, 3464, 3467, 3471, 3474, 3477, 3481, 3484, 3487, 3490, 3494, 3497, 3500, 3504, 3507, 3510,
3513, 3516, 3520, 3523, 3526, 3529, 3532, 3536, 3539, 3542, 3545, 3548, 3551, 3555, 3558, 3561,
3564, 3567, 3570, 3573, 3576, 3579, 3582, 3585, 3588, 3591, 3594, 3597, 3600, 3603, 3606, 3609,
3612, 3615, 3618, 3621, 3624, 3627, 3630, 3633, 3636, 3639, 3642, 3644, 3647, 3650, 3653, 3656,
3659, 3661, 3664, 3667, 3670, 3673, 3675, 3678, 3681, 3684, 3686, 3689, 3692, 3695, 3697, 3700,
3703, 3705, 3708, 3711, 3713, 3716, 3719, 3721, 3724, 3727, 3729, 3732, 3734, 3737, 3739, 3742,
3745, 3747, 3750, 3752, 3755, 3757, 3760, 3762, 3765, 3767, 3770, 3772, 3775, 3777, 3779, 3782,
3784, 3787, 3789, 3791, 3794, 3796, 3798, 3801, 3803, 3805, 3808, 3810, 3812, 3815, 3817, 3819,
3822, 3824, 3826, 3828, 3831, 3833, 3835, 3837, 3839, 3842, 3844, 3846, 3848, 3850, 3852, 3854,
3857, 3859, 3861, 3863, 3865, 3867, 3869, 3871, 3873, 3875, 3877, 3879, 3881, 3883, 3885, 3887,
3889, 3891, 3893, 3895, 3897, 3899, 3901, 3903, 3905, 3907, 3909, 3910, 3912, 3914, 3916, 3918,
3920, 3921, 3923, 3925, 3927, 3929, 3930, 3932, 3934, 3936, 3937, 3939, 3941, 3943, 3944, 3946,
3948, 3949, 3951, 3953, 3954, 3956, 3958, 3959, 3961, 3962, 3964, 3965, 3967, 3969, 3970, 3972,
3973, 3975, 3976, 3978, 3979, 3981, 3982, 3984, 3985, 3987, 3988, 3989, 3991, 3992, 3994, 3995,
3996, 3998, 3999, 4001, 4002, 4003, 4005, 4006, 4007, 4008, 4010, 4011, 4012, 4014, 4015, 4016,
4017, 4019, 4020, 4021, 4022, 4023, 4024, 4026, 4027, 4028, 4029, 4030, 4031, 4032, 4034, 4035,
4036, 4037, 4038, 4039, 4040, 4041, 4042, 4043, 4044, 4045, 4046, 4047, 4048, 4049, 4050, 4051,
4052, 4053, 4053, 4054, 4055, 4056, 4057, 4058, 4059, 4060, 4060, 4061, 4062, 4063, 4064, 4064,
4065, 4066, 4067, 4067, 4068, 4069, 4070, 4070, 4071, 4072, 4072, 4073, 4074, 4074, 4075, 4076,
4076, 4077, 4077, 4078, 4079, 4079, 4080, 4080, 4081, 4081, 4082, 4082, 4083, 4083, 4084, 4084,
4085, 4085, 4086, 4086, 4087, 4087, 4088, 4088, 4088, 4089, 4089, 4089, 4090, 4090, 4090, 4091,
4091, 4091, 4092, 4092, 4092, 4092, 4093, 4093, 4093, 4093, 4094, 4094, 4094, 4094, 4094, 4095,
4095, 4095, 4095, 4095, 4095, 4095, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096]
);
//found here: http://www.properbostin.co.uk/notes/sine_12.html
private function sine_12( angle:int ):Vector.<int>
{
// Jon P 2006. Find the Sine and or Cosine for the specified
// angle.
//
// Where a p_angle of 4096 is 360 degrees, 1024 is 90 degrees etc.
// (Integer 12 bit accuracy). Larger and negative angles can be
// specified and will be wrapped to the range 0 to 4095 internally.
//
// A valid address must be supplied as for at least one of the
// parameters: sine_ptr and cosine_ptr. This is where the result(s)
// will be returned. If you do not want one of the results specify
// sine_ptr or cosine_ptr as zero. If you specify both paramters
// as zero this routine will have not produce any result.
//
// This uses an abridged sine look-up table which stores only the
// first quarter (90 degrees) of a complete sine wave. The correct
// result is obtained for greater angles by changing the sign of the
// value in the table and or doing an appropriate subrtaction
// with the specified angle.
//
var result:Vector.<int> = new Vector.<int>(2,true);
while( angle > 4095 )
{ // wrap angle
angle -= 4096;
}
while( angle < 0 )
{ // wrap angle
angle += 4096;
}
if ( angle <= 1024 )
{
result[0] = sine_12_table[ angle ];
result[1] = sine_12_table[ 1024 - angle ];
}
else if ( angle <= 2048 )
{
result[0] = sine_12_table[ 1024 - ( angle - 1024 ) ];
result[1] = - sine_12_table[ angle - 1024 ];
}
else if ( angle < 3072 )
{
result[0] = - sine_12_table[ angle - 2048 ];
result[1] = - sine_12_table[ 1024 - ( angle - 2048 ) ];
}
else
{
result[0] = - sine_12_table[ 1024 - ( angle - 3072 ) ];
result[1] = sine_12_table[ angle - 3072 ];
}
return result;
}
// found here: http://www.properbostin.co.uk/notes/integer_square_root2.html
private function integer_square_root2( temp :int ):int
{ // (c) Jon P 1999
if ( temp > 1 )
{
if ( temp < 4 )
{
temp++;
temp >>= 1;
}
else
{
if ( temp < 16 )
{
temp += 11;
temp = temp / 6;
}
else
{
if ( temp < 64 ) //(temp & 0xFFFFFFC0) == 0
{
temp += 96;
temp = 1520 / temp;
temp = 17 - temp;
}
else
{
if ( temp < 256 )
{
temp += 390;
temp = 12020 / temp;
temp = 34 - temp;
}
else
{
if ( temp < 1024 )
{
temp += 1535;
temp = 95800 / temp;
temp = 69 - temp;
}
else
{
if ( temp < 4096 )
{
temp += 6185;
temp = 767232 / temp;
temp = 138 - temp;
}
else
{
if ( temp < 16384 )
{
temp += 24810;
temp = 6137856 / temp;
temp = 276 - temp;
}
else
{
if ( temp < 65536 )
{
temp += 99058;
temp = 49086464 / temp;
temp = 553 - temp;
}
else
{
if ( temp < 262144 )
{
temp += 396700;
temp = 392822784 / temp;
temp = 1106 - temp;
}
else
{
if ( temp < 1048576 )
{
temp >>= 2; //temp / 4;
temp += 396700;
temp = 392822784 / temp;
temp = 1106 - temp;
temp <<= 1; //temp * 2;
}
else
{
if ( temp < 4194304 )
{
temp >>= 4; //temp / 16;
temp += 396700;
temp = 392822784 / temp;
temp = 1106 - temp;
temp <<= 2; //temp * 4;
}
else
{
if ( temp < 16777216 )
{
temp >>= 6; //temp / 64;
temp += 396700;
temp = 392822784 / temp;
temp = 1106 - temp;
temp <<= 3; //temp * 8;
}
else
{
if ( temp < 67108864 )
{
temp >>= 8; //temp / 256;
temp += 396700;
temp = 392822784 / temp;
temp = 1106 - temp;
temp <<= 4; //temp * 16;
}
else
{
if ( temp < 268435456 )
{
temp >>= 10; //temp / 1024;
temp += 396700;
temp = 392822784 / temp;
temp = 1106 - temp;
temp <<= 5; //temp * 32;
}
else
{
if ( temp < 1073741824 )
{
temp >>= 12; //temp / 4096;
temp += 396700;
temp = 392822784 / temp;
temp = 1106 - temp;
temp <<= 6; //temp * 64;
}
else
{
temp >>= 14; // 16384;
temp += 396700;
temp = 392822784 / temp;
temp = 1106 - temp;
temp <<= 7; //temp * 128;
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
return temp;
}
}
}