I noticed that people relatively often ask for a way to draw an inverted circle and don't have an easy way to implement it, since it requires a bit of math that can be difficult to derive without experience. I decided to make a quick cart and standalone function to do that! This isn't amazingly efficient, and it only does circles (not ellipses), but it is a drop in function:
Update: new function utilizing trig, faster and now subpixel!
x=x or 64 y=y or 64 r=r or 32 left=left or 0 right=right or 128 top=top or 0 bottom=bottom or 128 local p=r*6.28 if(top<y-r)rectfill(left,top,right,y-r,c) if(bottom>y+r)rectfill(left,y+r,right,bottom,c) for d=-.001,.25,1/p do local ex,ey=r*cos(d),r*sin(d) if(x-ex>left) then if(y-ey>top) then rect(left,y-ey,x-ex,y-ey,c) end if(y+ey<bottom) then rect(left,y+ey,x-ex,y+ey,c) end end if(x+ex<right) then if(y-ey>top) then rect(x+ex,y-ey,right,y-ey,c) end if(y+ey<bottom) then rect(x+ex,y+ey,right,y+ey,c) end end end
function invertedcircle(x,y,r,left,right,top,bottom,c) x=x or 64 y=y or 64 r=r or 32 left=left or 0 right=right or 128 top=top or 0 bottom=bottom or 128 local rsqr=r*r for i=flr(top),bottom do local yr=i-y local w=max(0,(rsqr-yr*yr)^.5) if(x-w>left)rect(left,i,x-w,i,c) if(x+w<right)rect(right,i,x+w,i,c) end end
It should be no difficult feat to make an inverted circle that does not require vectors or rectangles if CPU usage is not a consideration.
It doesn't go above 30.22% in any case.
Use LEFT and RIGHT arrow keys to vanish or appear the picture behind it.
. . .
Here is a faster version using rectangles ^^
The CPU does not go above 19%.
. . .
Here it is ^^ not manually redrawing the rectangles every time, decreasing the CPU usage to 13%.
. . .
There should be a way to get this even faster.
Ah, even using memory transfer, it is
spr() that is slowing me down and not much else. This method ^^ uses 18% CPU.
And chomps up memory 0x8000-0xBFFF besides.
. . .
I think what we really need is
Where x1,y1 are top-left of the rectangle.
Where x2,y2 are bottom-right of the rectangle.
Where x3,y3 is the transparent circle location.
Where r,c is radius and color.
[Please log in to post a comment]