def _draw(self, canvas: graphics.GraphWin, options) -> int: # Converter as posições dos vértices em posições reais na tela (pixels) vertices = [(canvas.toScreen(p.getX(), p.getY())) for p in self.vertices] # Desenhar como um polígono return canvas.create_polygon(*vertices, options)
def _draw(self, canvas: graphics.GraphWin, options: dict): print(type(canvas), type(options)) # Converte as coordenadas dos cantos para medidas reais de pixels na tela x1, y1 = canvas.toScreen(self.p1.x, self.p1.y) x2, y2 = canvas.toScreen(self.p2.x, self.p2.y) # Argumentos passados ao tkinter.Canvas. # Começando com o canvas em que está sendo operado. args = [canvas] diameter = 2 * self.radius # O raio pode ter no máximo 3/8 do tamanho do menor lado do retângulo, # devido a uma limitação do Tk/Tcl. # 2 * (3/8) = 6/8 = 3/4 = 0.75 # (Eu não entendi essa parte muito bem) maxr = 0.75 if diameter > (maxr * (x2 - x1)): diameter = maxr * (x2 - x1) if diameter > (maxr * (y2 - y1)): diameter = maxr * (y2 - y1) # Calcula os 12 pontos que contornam o retângulo, # com base nos dois cantos dados. # # A---c--------c---B \ # | | } diâmetro # c c / # | | # | | # | | # c c \ # | | } diâmetro # B---c--------c---A / # Legenda: # A - os dois cantos dados # B - os outros dois cantos do retângulo # c - pontos de guia para o processo de suavização do Tk/Tcl # # Um exemplo de como um canto será desenhado: # # | | # | | # c c # | _` # | => / # | __`` # ----c---------A ----c``` A # a1 = x1 + diameter a2 = x2 - diameter b1 = y1 + diameter b2 = y2 - diameter args.extend([ x1, y1, # A1 a1, y1, # c1 a2, y1, # c2 x2, y1, # B1 x2, b1, # c3 x2, b2, # c4 x2, y2, # A2 a2, y2, # c5 a1, y2, # c6 x1, y2, # B2 x1, b2, # c7 x1, b1, # c8 '-smooth', '1' ]) # O comando '-smooth 1' ativa o modo de suavização, # que é essencial para o funcionamento dos cantos arredondados. # Outras opções herdadas do graphics ou do tkinter.Canvas args.append(options) return graphics.GraphWin.create_polygon(*args)