Draws a HSV/HSB chromatic disk. chromac(xc,yc,rmax,ds,dv,tred) with : - xc and yc : center at coordinates - rmax : radius - ds and dv : * 0 to keep S or V to 1 * 1 to have S or V increase from 0 in the center to 1 * -1 to have S or V decrease from 1 in the center to 0 - tred : position in radians of the red component on the disk (0=right, pi/2=top, …) - rev : True or False to to revert the color order
from kandinsky import * from cmath import * def hsv2color(h,s=1,v=1): h,c=(h/pi)%2,v*s x,m,k=c*(1-abs((h%(2/3))*3-1)),v-c,int(h*3) return color(round(255*(m+x*(k%3==1)+c*(k%5==0))),round(255*(m+c*(k==1 or k==2)+x*(k%3==0))),round(255*(m+x*(k%3==2)+c*(k==3 or k==4)))) def modsv(p,m): return not(m) or (p*m)%1 def chromac(xc=160,yc=110,rmax=110,ds=0,dv=0,tred=0,rev=False): xc,yc=round(xc),round(yc) for y in range(-rmax,rmax+1): xmin=round(sqrt(rmax**2-y**2).real) for x in range(-xmin,xmin+1): z=complex(x,y) r=abs(z) if r<=rmax: set_pixel(xc+x,yc+y,hsv2color((phase(z)-tred)*(1-2*rev),modsv(r/rmax,ds),modsv(r/rmax,dv))) def demo(): sw,sh=320,220 r=45 lx3=[r,(sw-1)/2,sw-1-r] ly2=[r,sh-1-r] lx2=[(lx3[0]+lx3[1])/2,(lx3[1]+lx3[2])/2] for x in range(2): chromac(lx2[x],sh/2,r,-1,not(x)*-1,x*pi/4,x%2) for y in range(2): for x in range(3): chromac(lx3[x],ly2[y],r,not(y),x-1,(2+3*y+x)*pi/4,(x+y)%2)