func.py

Created by ziii

Created on December 20, 2023

4.33 KB


from kandinsky import fill_rect as f, set_pixel as s_p
from ion import *
from time import *

"""""
I imported fill_rect as f and set_pixel as s_p to save space,
you can do the same or change it in every program
"""""

def draw(arr,coo,cor,le,col,r,scale):
  a=r%2
  if cor[not a]+le[not a]>=coo[not a]+coo_r(arr[-1*(r//2)]*scale,r)[not a] and coo[not a]+coo_r(arr[-1+r//2]*scale,r)[not a]>=cor[not a]:
    for l in arr:
      for s in range(scale):
        if le[not a]>coo[not a]+coo_r(l,r)[not a]*scale+s-cor[not a]>=0 and cor[a]+le[a]>coo[a]+(coo_r(l,r)[a]-l[2]*(((r+1)//2)%2))*scale and coo[a]+(coo_r(l,r)[a]+l[2]*(((r-1)//2)%2))*scale>cor[a]:
            sq=[coo[0]+(coo_r(l,r)[0]-l[2]*(r==2))*scale+s*a,coo[1]+(coo_r(l,r)[1]-l[2]*(r==1))*scale+s*(not a),coo[0]+(coo_r(l,r)[0]+l[2]*(r==0))*scale+s*a,coo[1]+(coo_r(l,r)[1]+l[2]*(r==3))*scale+s*(not a)]
            sq[a]=(sq[a],cor[a])[cor[a]>sq[a]]
            sq[a+2]=(sq[a+2],cor[a]+le[a])[sq[a+2]>cor[a]+le[a]]
            f(sq[0],sq[1],(sq[2]-sq[0])**(not a),(sq[3]-sq[1])**a,col)

coo_r=lambda coo, r: [(1-r+r%2)*coo[r%2]-(r//2),(1-2*(((-r)%4)//2))*coo[(r+1)%2]-(((-r)%4)//2)]

coos_r= lambda coos, r,cntr:[[(1-r+r%2)*(coo[r%2]-cntr[r%2])-(r//2) + cntr[0],(1-2*(((-r)%4)//2))*(coo[(r+1)%2]-cntr[(r+1)%2])-(((-r)%4)//2) + cntr[1]] for coo in coos]

def cross(size,thick,pos,col):
  for x in range(size-thick+1):
    f(x+pos[0],pos[1]+x,thick,thick,col)
    f(x+pos[0],pos[1]+size-x,thick,-thick,col)

def circle(r,pos,col):
  for x in range(r):
    h=int(((r**2)-(x**2))**0.5)
    f(pos[0]-x,pos[1]-h,1,h*2,col)
    f(pos[0]+x,pos[1]-h,1,h*2,col)

def square(a,coo,w,col):
  f(coo[0],coo[1],a,w,col)
  f(coo[0],coo[1]+a-w,a,w,col)
  f(coo[0],coo[1],w,a,col)
  f(coo[0]+a-w,coo[1],w,a,col)

#draws a number
NS=737837656508197734647
def number(num,x,y,size,col,sp=1):
  a=[1+size[1]//12,1+size[0]//(len(str(num))*12)]
  a=a[a[0]>a[1]]
  b=[(size[1]-3*a)//2,(size[0]+sp)//len(str(num))-sp-2*a]
  b=b[b[0]>b[1]]
  if b>1 and num>=0:
    num=[int(a) for a in str(num)]
    coo=((x,y+a,a,b),(x+a,y,b,a),(x+a+b,y+a,a,b),(x+a,y+a+b,b,a),(x,y+2*a+b,a,b),(x+a,y+2*a+2*b,b,a),(x+a+b,y+2*a+b,a,b))
    for n,k in enumerate(num):
      for x in range(7):
        if ((k*7 + x) >> NS) & 1:
          f(coo[x][0]+n*(b+2*a+sp),coo[x][1],coo[x][2],coo[x][3],col)


#take number keyboard input
num=0
NUMS={KEY_ZERO:"0",KEY_ONE:"1",KEY_TWO:"2",KEY_THREE:"3",KEY_FOUR:"4",KEY_FIVE:"5",KEY_SIX:"6",KEY_SEVEN:"7",KEY_EIGHT:"8",KEY_NINE:"9"}
def min_max(min_n=0,max_n=0):
  global num
  if max_n>0 and int(num)>max_n:
    num=str(max_n)
  if int(num)<min_n:
    num=str(min_n)
def update(input):
  global num
  if input==KEY_BACKSPACE:
    if len(num)==1:
      num="0"
    else:
      num=num[:-1]
  elif not (int(num)==0 and input==KEY_ZERO):
    if len(num)==1 and int(num)==0:
      num=""
    num+=NUMS[input]

#check wich keys were pressed between calls
#put this at the beginning of your code with the keys you want to check in listening
"""""
key_pressing={KEY_OK:0,KEY_DOWN:0,KEY_UP:0,KEY_LEFT:0,KEY_RIGHT:0}
key_pressed={k:0 for k in key_pressing}
"""""
#use this to check for presses
"""""
for k in key_pressing:
  key_pressed[k]=0
  if keydown(k):
    if not key_pressing[k]:
      key_pressed[k]=1
    key_pressing[k]=1
  else:
    key_pressing[k]=0
"""""
#condition to see if a key was just pressed, replace KEY_NAME
# key_pressed[KEY_NAME]

#creates gradient
GRADIENT_COLORS=((255,150,0),(0,149,255),(50,50,50))
N=1/(len(GRADIENT_COLORS)-1)
def rgb(v):
  return tuple([GRADIENT_COLORS[int(v/N)][x]+(GRADIENT_COLORS[int(v/N)+1][x]-GRADIENT_COLORS[int(v/N)][x])*(v%N)/N for x in range(3)])

#draw a line between two points
def line(x0,y0,x1,y1,color):
  h=((x1-x0)**2+(y1-y0)**2)**0.5
  cos=(x1-x0)/h
  sin=(y1-y0)/h
  for p in range(int(h)+1):
    s_p(x0+int(cos*p),y0+int(sin*p),color)

#three points bezier curve
def bezier3(x0,y0,x1,y1,x2,y2):
  d=int(((x0-x1)**2+(y0-y1)**2)**0.5+((x1-x2)**2+(y1-y2)**2)**0.5)
  for a in range(d):
    t=a/d
    s_p(int(x0*(1-2*t+t**2)+2*x1*(t-t**2)+x2*(t**2)),int(y0*(1-2*t+t**2)+2*y1*(t-t**2)+y2*(t**2)),(0,0,0))

#set nth bit of an integer i to 1
def set_1_at(i,n):
  n |= 1<< i

#set nth bit of an integer i to 0
def set_0_at(i,n):
  n &= ~(1 << i)

#set nth bit of an integer i to 0 or 1
def set_at(n,bit,i):
  i = (i & (~(1 << n))) | (bit << n)

#return the value of the nth bit of an integer i
def get_at(n, i):
  return (i >> n) & 1