Files
@ 1f1d49c1dbea
Branch filter:
Location: OneEye/src/gui.py - annotation
1f1d49c1dbea
3.3 KiB
text/x-python
correct corner handling
order the corners in counter-clockwise order, with the upper left first
EPoint extracted from gui.py
order the corners in counter-clockwise order, with the upper left first
EPoint extracted from gui.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | 3bc6cb7cfd8b 3bc6cb7cfd8b 3bc6cb7cfd8b 3bc6cb7cfd8b 1f1d49c1dbea eb2effd8ec35 3bc6cb7cfd8b 3bc6cb7cfd8b 3bc6cb7cfd8b 3bc6cb7cfd8b 3bc6cb7cfd8b 3bc6cb7cfd8b eb2effd8ec35 3bc6cb7cfd8b 3bc6cb7cfd8b 3bc6cb7cfd8b eb2effd8ec35 eb2effd8ec35 eb2effd8ec35 3bc6cb7cfd8b eb2effd8ec35 3bc6cb7cfd8b eb2effd8ec35 eb2effd8ec35 3bc6cb7cfd8b eb2effd8ec35 eb2effd8ec35 eb2effd8ec35 eb2effd8ec35 eb2effd8ec35 1f1d49c1dbea 1f1d49c1dbea 3bc6cb7cfd8b 3bc6cb7cfd8b 3bc6cb7cfd8b 3bc6cb7cfd8b 3bc6cb7cfd8b eb2effd8ec35 eb2effd8ec35 3bc6cb7cfd8b 3bc6cb7cfd8b 3bc6cb7cfd8b 3bc6cb7cfd8b eb2effd8ec35 eb2effd8ec35 eb2effd8ec35 eb2effd8ec35 3bc6cb7cfd8b 3bc6cb7cfd8b 3bc6cb7cfd8b 3bc6cb7cfd8b 3bc6cb7cfd8b 3bc6cb7cfd8b 3bc6cb7cfd8b eb2effd8ec35 eb2effd8ec35 eb2effd8ec35 eb2effd8ec35 1f1d49c1dbea eb2effd8ec35 eb2effd8ec35 eb2effd8ec35 eb2effd8ec35 eb2effd8ec35 eb2effd8ec35 eb2effd8ec35 1f1d49c1dbea eb2effd8ec35 eb2effd8ec35 eb2effd8ec35 eb2effd8ec35 eb2effd8ec35 eb2effd8ec35 eb2effd8ec35 1f1d49c1dbea eb2effd8ec35 eb2effd8ec35 eb2effd8ec35 eb2effd8ec35 eb2effd8ec35 eb2effd8ec35 eb2effd8ec35 3bc6cb7cfd8b eb2effd8ec35 eb2effd8ec35 eb2effd8ec35 eb2effd8ec35 eb2effd8ec35 eb2effd8ec35 eb2effd8ec35 eb2effd8ec35 eb2effd8ec35 eb2effd8ec35 eb2effd8ec35 eb2effd8ec35 eb2effd8ec35 eb2effd8ec35 eb2effd8ec35 3bc6cb7cfd8b eb2effd8ec35 eb2effd8ec35 eb2effd8ec35 eb2effd8ec35 eb2effd8ec35 eb2effd8ec35 eb2effd8ec35 eb2effd8ec35 eb2effd8ec35 3bc6cb7cfd8b 3bc6cb7cfd8b 3bc6cb7cfd8b 3bc6cb7cfd8b | import tkinter as tk
from PIL import ImageTk
import PIL
import math
from epoint import *
class Application(tk.Frame):
def __init__(self, master=None):
self.corners=[]
tk.Frame.__init__(self, master)
self.grid(column=0,row=0)
self.createWidgets()
def createWidgets(self):
# a captured frame with overlay graphics
self.imgView=tk.Canvas(self)
self.imgView.configure(width=480,height=360)
imgOrig=PIL.Image.open("../images/1.jpg")
self.img=ImageTk.PhotoImage(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)
## Stores a grid corner located at x,y coordinates.
def addCorner(self,x,y):
a=EPoint(x,y)
for i,c in enumerate(self.corners): # move an improperly placed point
if a.dist(c)<20:
self.corners[i]=a
# print(self.corners)
self.redrawImgView()
return
if len(self.corners)<4: # add a new corner
self.corners.append(a)
# print(self.corners)
self.redrawImgView()
if len(self.corners)<4: return
index,minDist=0,float('inf') # replace the corner closest to the clicked point
for i,c in enumerate(self.corners):
if a.dist(c)<minDist:
index,minDist=i,a.dist(c)
self.corners[index]=a
# print(self.corners)
self.redrawImgView()
## Redraws the current image and its overlay.
def redrawImgView(self):
self.imgView.create_image(2,2,anchor="nw",image=self.img)
for corner in self.corners:
self.markPoint(corner.x,corner.y)
self.imgView.grid()
## 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")
self.imgView.create_line(x-3,y+3,x+4,y-4,fill="#00ff00")
self.imgView.grid()
## Handles and presents the game state as detected by the program.
class BoardView(tk.Canvas):
def __init__(self, master=None):
tk.Canvas.__init__(self, master)
self.configure(width=360,height=360,background="#ffcc00")
self.drawGrid()
self.drawStones()
self.grid()
def drawGrid(self):
for i in range(19):
self.create_line(18,18*(i+1),360-18,18*(i+1),fill="#000000") # rows
self.create_line(18*(i+1),18,18*(i+1),360-18,fill="#000000") # cols
self.drawStars()
def drawStars(self):
for r in range(4,19,6):
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.
#
# @param r row coordinate, [0-18], counted from top
# @param c column coordinate, [0-18], counted from left
# @param color color indicator, {'b','w'}
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')
root = tk.Tk()
app = Application(master=root)
app.mainloop()
|