### Author Topic: All BASIC (reaching out)  (Read 7728 times)

#### ZXDunny

• Full Member
• Posts: 248
##### Re: All BASIC (reaching out)
« Reply #15 on: 01. November 2018, 00:20:32 »
Oh, wow! That turned out excellent How is the performance on an image that size? Can you rotate it in real time? I can in SpecBAS at 800x480, but I can only get about 25fps at best so I'm really hitting the limits of the interpreter.

I cannot believe how simple the algorithm turned out to be though. It's literally just ArcSin functions on the x and y coordinates, and voila! (after some massaging to get from the -1.5 to 1.5 coordinates that ArcSin returns to map to the image)

Someone suggested I tweet the BBC logo video, and it's gone viral - as much as anything I do goes viral, that is. Today, I am a very minor celebrity.

#### B+

• Hero Member
• Posts: 802
##### Re: All BASIC (reaching out)
« Reply #16 on: 01. November 2018, 00:58:01 »
Code: [Select]
`_TITLE "Fake sphere mapping by Paul Dunn, trans from SpecBas to QB64 2018-10-31 B+"'10  Fake sphere mapping'20 GRAPHIC NEW t LOAD "demos:3d/lava_strip.png":gw=gfxw t,gh=gfxh t:'   palette copy t,0,256 to 0:'   paper rgbn(0):'   screen lock'30 r=scrh/2.1,xc=SCRw/2,yc=SCRh/2,xo=0:'   do:'      for y=-r+1 to r-1:'         x1=sqr(r*r-y*y),'         tv=(asn(y/r)+1.5)/3:'         for x=-x1 to x1:'            tu=(asn(x/x1)+1.5)/6:'            plot ink gpoint(t,(xo+tu*gw) mod gw,tv*gh);x+xc,y+yc:'         next x:'      next y:'      xo+=1,xo%=gw:'      wait screen:'      cls:'   loopSCREEN _NEWIMAGE(800, 600, 32)surface& = _LOADIMAGE("martian.png")'surface& = _LOADIMAGE("mars.png") 'this image has a color change where ends meet'surface& = _LOADIMAGE("mars0.jpeg") 'bettergw = _WIDTH(surface&)gh = _HEIGHT(surface&)map& = _NEWIMAGE(gw, gh, 32)_DEST map&_PUTIMAGE , surface&, map&_DEST 0stars& = _LOADIMAGE("stars.png")_SOURCE stars&_DEST 0_PUTIMAGEr = _HEIGHT / 3xc = _WIDTH / 2yc = _HEIGHT / 2xo = 0DO    start = TIMER    FOR y = -r TO r        x1 = SQR(r * r - y * y)        tv = (_ASIN(y / r) + 1.5) / 3        FOR x = -x1 + 1 TO x1            tu = (_ASIN(x / x1) + 1.5) / 6            _SOURCE map&            pc~& = POINT((xo + tu * gw) MOD gw, tv * gh)            _DEST 0            PSET (x + xc, y + yc), pc~&            'plot ink gpoint(t,(xo+tu*gw) mod gw,tv*gh);x+xc,y+yc        NEXT x    NEXT y    xo = xo + 1    xo = xo MOD gw    tyme = TIMER - start    Total = Total + tyme    Count = Count + 1    Ave = Total / Count    LOCATE 1, 1: PRINT INT(Ave * 10000) / 10000    _DISPLAY    ' wait screen    'CLSLOOP`
This is taking about .0214 secs per loop or 46-47 loops per sec. I did change the radius to smaller and printing times slows things down a bit. (Compiled exe)

:-)) congrats to celebrity status, you have impressed me many a time.

EDIT: sorry dyslexic with digits today.
« Last Edit: 01. November 2018, 01:05:59 by B+ »