#This is a Ruby equivalent of Java program #Run it in command line as "ruby NoSqrt.rb" #There are some artifacts like camel-like vars ... enough good for first try ... I=255 #Intensity range. Determines algorithms' accuracy. #No precalculation is required. #Calculation of the 1/8 of circle will take # R/sq(2) steps = R/sq(2)*(3mult+1div+8add) ~ 1.4R(3mult+1div) # All operations are of integer type. def drawArch( r ) r2=r*r y=0 x=r bb=x*x xTop=x+1 tt=xTop*xTop while y<x do ee=r2-y*y ll=ee-bb uu=tt-ee if ll<0 #We had Wu's lemma before: if( dnew < d ) x-- xTop=x x-=1 tt=bb uu=-ll bb=x*x ll=ee-bb end u=I*uu/(uu+ll) #good for debug: puts ("x=#{x} y=#{y} E=#{ee} B=#{bb} T=#{tt} L=#{ll} U=#{uu} u=#{u} v=#{I-u}") #These two statements are not a part of the algorithm: #Each language, OS, or framework has own ways to put a "pixel". #putpixel(x, y, u, doDemo) #putpixel(xTop, y, (I-u), !doDemo) y+=1 end #while end #Test: rr=20 #Radius. drawArch(rr) Copyright (C) 2011 Konstantin Kirillov. MIT License