import math import sys from kivy.graphics import Color,Line,Rectangle from point import Point,l_infinity from tools import isint_nonzero,sgn,in_interval class Square(): # size size=50 def __init__(self,x,y,**kwargs): self.pos=Point(x,y) self.color=kwargs.get("color",(0,0,1)) self.selected=False # set position def setpos(self,x,y): self.pos.x=x self.pos.y=y def draw(self,**kwargs): # set color if not self.selected: Color(*self.color) else: (r,g,b)=self.color # darken selected Color(r/2,g/2,b/2) Rectangle(pos=((self.pos.x-0.5)*self.size,(self.pos.y-0.5)*self.size),size=(self.size,self.size)) # check whether a square at pos interacts with square def check_interaction(self,pos): return l_infinity(pos-self.pos)>=1 # check whether a square at position pos is touching self def check_touch(self,pos): # allow for error if in_interval(l_infinity(pos-solf.pos),1-1e-11,1+1e-11): return True return False # find position along a line that comes in contact with the line going through pos in direction v def move_on_line_to_stick(self,pos,v): # compute intersections with four lines making up square intersections=[\ Point(self.pos.x+1/2,pos.y+v.y/v.x*(self.pos.x+1/2-pos.x)),\ Point(self.pos.x-1/2,pos.y+v.y/v.x*(self.pos.x-1/2-pos.x)),\ Point(pos.x+v.x/v.y*(self.pos.y+1/2-pos.y),self.pos.y+1/2),\ Point(pos.x+v.x/v.y*(self.pos.y-1/2-pos.y),self.pos.y-1/2)\ ] # compute closest one, on square closest=None dist=math.inf for i in range(0,4): # check that it is on square if abs(intersections[i].x-self.pos.x)<=1/2+1e-11 and abs(intersections[i].y-self.pos.y)<=1/2+1e-11: if (intersections[i]-pos)**2pos.y: if relmath.ceil(rel)+1e-11 and math.ceil(rel)!=0: # stick to corner candidate.y=math.ceil(rel)+self.pos.y else: if rel>math.floor(rel)+1e-11 and newrelpos.x: if relmath.ceil(rel)+1e-11 and math.ceil(rel)!=0: # stick to corner candidate.x=math.ceil(rel)+self.pos.x else: if rel>math.floor(rel)+1e-11 and newrel