apple2_hat3d/js/hat3d.js

91 lines
1.7 KiB
JavaScript

"use strict";
// Original Atari Basic Source
/*
100 REM ARCHIMEDES SPIRAL
110 REM
120 REM ANALOG MAGAZINE
130 REM
140 GRAPHICS 8+16:SETCOLOR 2,0,0
150 XP=144:XR=4.71238905:XF=XR/XP
160 FOR ZI=-64 TO 64
170 ZT=ZI*2.25:ZS=ZT*ZT
180 XL=INT(SQR(20736-ZS)+0.5)
190 FOR XI=0-XL TO XL
200 XT=SQR(XI*XI+ZS)*XF
210 YY=(SIN(XT)+SIN(XT*3)*0.4)*56
220 X1=XI+ZI+160:Y1=90-YY+ZI
230 TRAP 250:COLOR 1:PLOT X1,Y1
240 COLOR 0:PLOT X1,Y1+1:DRAWTO X1,191
250 NEXT XI:NEXT ZI
260 GOTO 260
*/
function hat( color, isSolid )
{
var f = 4.71238905 / 144;
var i, z;
var s, h;
var u, v;
var x, y;
var clear = [255-color[0], 255-color[1], 255-color[2], 255];
for( z = -64; z <= 64; z++ )
{
s = z*z*5.0625;
h = (Math.sqrt( 20736-s ) + 0.5) | 0;
for( i = -h; i <= h; i += 1 )
{
u = Math.sqrt( i*i + s ) * f;
v = (Math.sin( u ) + Math.sin( u*3 ) * 0.4) * 56;
x = i + z + 160;
y = 90 - v + z;
if ((x < canvas_w) && (y < canvas_h))
putpixel( x|0, y|0, color )
if( isSolid )
canvas_vline( x|0, y+1|0, undefined, clear );
}
}
}
function main()
{
document.body.style.overflow = 'hidden';
canvas_init( 320, 200 );
canvas_clear();
onSolid();
// onFrame();
}
function onSolid()
{
canvas_get();
// White on Black
canvas_grid( [0,0,0,255], 1, 1 );
hat( [255,255,255,255], 1 );
// Black on White
//hat( [0,0,0,255], 1 );
canvas_put();
}
function onFrame()
{
canvas_get();
// White on Black
canvas_grid( [0,0,0,255], 1, 1 );
hat( [255,255,255,255], 0 );
// Black on White
//hat( [0,0,0,255], 0 );
canvas_put();
}