diff --git a/src/gui.py b/src/gui.py --- a/src/gui.py +++ b/src/gui.py @@ -5,6 +5,8 @@ import math from epoint import * from corners import * from grid import * +from image_analyzer import * +from go import * class Application(tk.Frame): @@ -20,24 +22,26 @@ class Application(tk.Frame): # a captured frame with overlay graphics self.imgView=tk.Canvas(self) self.imgView.configure(width=480,height=360) - imgOrig=PIL.Image.open("../images/7.jpg") + self.imgOrig=PIL.Image.open("../images/7.jpg") - self.img=ImageTk.PhotoImage(imgOrig.resize((int(self.imgView['width']),int(self.imgView['height'])),resample=PIL.Image.BILINEAR)) + self.img=ImageTk.PhotoImage(self.imgOrig.resize((int(self.imgView['width']),int(self.imgView['height'])),resample=PIL.Image.BILINEAR)) self.imgView.bind('<1>',lambda e: self.addCorner(e.x,e.y)) - self.redrawImgView() self.imgView.grid(column=0,row=0) # board with detected stones self.boardView=BoardView(self) self.boardView.grid(column=1,row=0) + + self.redrawImgView() ## Stores a grid corner located at x,y coordinates. def addCorner(self,x,y): self.corners.add(x,y) if self.corners.canonizeOrder(): self.boardGrid=Grid(self.corners) + self.boardView.setBoardGrid(self.boardGrid) self.redrawImgView() @@ -59,6 +63,15 @@ class Application(tk.Frame): self.imgView.grid() + origWidth,origHeight=self.imgOrig.size + widthRatio=origWidth/self.img.width() + heightRatio=origHeight/self.img.height() + sizeCoef=max(widthRatio,heightRatio) + + shift=EPoint(origWidth-self.img.width()*sizeCoef,origHeight-self.img.height()*sizeCoef)/2 + + self.boardView.redrawState(self.imgOrig,sizeCoef,shift) + ## Marks a point at the image with a green cross. Used for corners. def markPoint(self,x,y): self.imgView.create_line(x-3,y-3,x+4,y+4,fill="#00ff00") @@ -70,12 +83,23 @@ class Application(tk.Frame): ## Handles and presents the game state as detected by the program. class BoardView(tk.Canvas): def __init__(self, master=None): + self.detector=ImageAnalyzer() + self.boardGrid=None + tk.Canvas.__init__(self, master) self.configure(width=360,height=360,background="#ffcc00") self.drawGrid() - self.drawStones() + + self.grid() + def redrawState(self,img,sizeCoef,shift): + self.detector.analyze(img,30,65,sizeCoef,shift) + + for r,row in enumerate(self.detector.board): + for c,point in enumerate(row): + self.drawStone(r,c,point) + self.grid() def drawGrid(self): @@ -90,16 +114,24 @@ class BoardView(tk.Canvas): for c in range(4,19,6): self.create_oval(r*18-2,c*18-2,r*18+2,c*18+2,fill='#000000') - def drawStones(self): - pass - ## Draws a stone at provided coordinates. # + # For an unknown color draws nothing and returns False. + # # @param r row coordinate, [0-18], counted from top # @param c column coordinate, [0-18], counted from left - # @param color color indicator, {'b','w'} + # @param color color indicator, Go.BLACK or Go.WHITE def drawStone(self,r,c,color): - self.create_oval(r*18-9,c*18-9,r*18+9,r*18+9,'#000000' if color=='b' else '#ffffff') + if color==Go.BLACK: hexCode='#000000' + elif color==Go.WHITE: hexCode='#ffffff' + else: return False + r+=1 + c+=1 + self.create_oval(c*18-9,r*18-9,c*18+9,r*18+9,fill=hexCode) + + def setBoardGrid(self,boardGrid): + self.boardGrid=boardGrid + self.detector.setGrid(boardGrid) root = tk.Tk()