Skip to content

Instantly share code, notes, and snippets.

@caiodanielnunessantos
Created June 10, 2020 00:55
Show Gist options
  • Save caiodanielnunessantos/c79ca913b88c4b337de10cf35b784f69 to your computer and use it in GitHub Desktop.
Save caiodanielnunessantos/c79ca913b88c4b337de10cf35b784f69 to your computer and use it in GitHub Desktop.
import math
import tkinter
import random
radio = int(input("Digite o raio (entre 5 e 50)" ))
size = int(input("Agora, o tamanho da janela (entre 200 e 600)" ))
quantidade = int(input("Agora, a quantidade de bolas" ))
COLORS = ['snow', 'ghost white', 'white smoke', 'gainsboro', 'floral white', 'old lace',
'linen', 'antique white', 'papaya whip', 'blanched almond', 'bisque', 'peach puff',
'navajo white', 'lemon chiffon', 'mint cream', 'azure', 'alice blue', 'lavender',
'lavender blush', 'misty rose', 'dark slate gray', 'dim gray', 'slate gray',
'light slate gray', 'gray', 'light grey', 'midnight blue', 'navy', 'cornflower blue', 'dark slate blue',
'slate blue', 'medium slate blue', 'light slate blue', 'medium blue', 'royal blue', 'blue',
'dodger blue', 'deep sky blue', 'sky blue', 'light sky blue', 'steel blue', 'light steel blue',
'light blue', 'powder blue', 'pale turquoise', 'dark turquoise', 'medium turquoise', 'turquoise',
'cyan', 'light cyan', 'cadet blue', 'medium aquamarine', 'aquamarine', 'dark green', 'dark olive green',
'dark sea green', 'sea green', 'medium sea green', 'light sea green', 'pale green', 'spring green',
'lawn green', 'medium spring green', 'green yellow', 'lime green', 'yellow green',
'forest green', 'olive drab', 'dark khaki', 'khaki', 'pale goldenrod', 'light goldenrod yellow',
'light yellow', 'yellow', 'gold', 'light goldenrod', 'goldenrod', 'dark goldenrod', 'rosy brown',
'indian red', 'saddle brown', 'sandy brown',
'dark salmon', 'salmon', 'light salmon', 'orange', 'dark orange',
'coral', 'light coral', 'tomato', 'orange red', 'red', 'hot pink', 'deep pink', 'pink', 'light pink',
'pale violet red', 'maroon', 'medium violet red', 'violet red',
'medium orchid', 'dark orchid', 'dark violet', 'blue violet', 'purple', 'medium purple',
'thistle', 'snow2', 'snow3',
'snow4', 'seashell2', 'seashell3', 'seashell4', 'AntiqueWhite1', 'AntiqueWhite2',
'AntiqueWhite3', 'AntiqueWhite4', 'bisque2', 'bisque3', 'bisque4', 'PeachPuff2',
'PeachPuff3', 'PeachPuff4', 'NavajoWhite2', 'NavajoWhite3', 'NavajoWhite4',
'LemonChiffon2', 'LemonChiffon3', 'LemonChiffon4', 'cornsilk2', 'cornsilk3',
'cornsilk4', 'ivory2', 'ivory3', 'ivory4', 'honeydew2', 'honeydew3', 'honeydew4',
'LavenderBlush2', 'LavenderBlush3', 'LavenderBlush4', 'MistyRose2', 'MistyRose3',
'MistyRose4', 'azure2', 'azure3', 'azure4', 'SlateBlue1', 'SlateBlue2', 'SlateBlue3',
'SlateBlue4', 'RoyalBlue1', 'RoyalBlue2', 'RoyalBlue3', 'RoyalBlue4', 'blue2', 'blue4',
'DodgerBlue2', 'DodgerBlue3', 'DodgerBlue4', 'SteelBlue1', 'SteelBlue2',
'SteelBlue3', 'SteelBlue4', 'DeepSkyBlue2', 'DeepSkyBlue3', 'DeepSkyBlue4',
'SkyBlue1', 'SkyBlue2', 'SkyBlue3', 'SkyBlue4', 'LightSkyBlue1', 'LightSkyBlue2',
'LightSkyBlue3', 'LightSkyBlue4', 'SlateGray1', 'SlateGray2', 'SlateGray3',
'SlateGray4', 'LightSteelBlue1', 'LightSteelBlue2', 'LightSteelBlue3',
'LightSteelBlue4', 'LightBlue1', 'LightBlue2', 'LightBlue3', 'LightBlue4',
'LightCyan2', 'LightCyan3', 'LightCyan4', 'PaleTurquoise1', 'PaleTurquoise2',
'PaleTurquoise3', 'PaleTurquoise4', 'CadetBlue1', 'CadetBlue2', 'CadetBlue3',
'CadetBlue4', 'turquoise1', 'turquoise2', 'turquoise3', 'turquoise4', 'cyan2', 'cyan3',
'cyan4', 'DarkSlateGray1', 'DarkSlateGray2', 'DarkSlateGray3', 'DarkSlateGray4',
'aquamarine2', 'aquamarine4', 'DarkSeaGreen1', 'DarkSeaGreen2', 'DarkSeaGreen3',
'DarkSeaGreen4', 'SeaGreen1', 'SeaGreen2', 'SeaGreen3', 'PaleGreen1', 'PaleGreen2',
'PaleGreen3', 'PaleGreen4', 'SpringGreen2', 'SpringGreen3', 'SpringGreen4',
'green2', 'green3', 'green4', 'chartreuse2', 'chartreuse3', 'chartreuse4',
'OliveDrab1', 'OliveDrab2', 'OliveDrab4', 'DarkOliveGreen1', 'DarkOliveGreen2',
'DarkOliveGreen3', 'DarkOliveGreen4', 'khaki1', 'khaki2', 'khaki3', 'khaki4',
'LightGoldenrod1', 'LightGoldenrod2', 'LightGoldenrod3', 'LightGoldenrod4',
'LightYellow2', 'LightYellow3', 'LightYellow4', 'yellow2', 'yellow3', 'yellow4',
'gold2', 'gold3', 'gold4', 'goldenrod1', 'goldenrod2', 'goldenrod3', 'goldenrod4',
'DarkGoldenrod1', 'DarkGoldenrod2', 'DarkGoldenrod3', 'DarkGoldenrod4',
'RosyBrown1', 'RosyBrown2', 'RosyBrown3', 'RosyBrown4', 'IndianRed1', 'IndianRed2',
'IndianRed3', 'IndianRed4', 'sienna1', 'sienna2', 'sienna3', 'sienna4', 'burlywood1',
'burlywood2', 'burlywood3', 'burlywood4', 'wheat1', 'wheat2', 'wheat3', 'wheat4', 'tan1',
'tan2', 'tan4', 'chocolate1', 'chocolate2', 'chocolate3', 'firebrick1', 'firebrick2',
'firebrick3', 'firebrick4', 'brown1', 'brown2', 'brown3', 'brown4', 'salmon1', 'salmon2',
'salmon3', 'salmon4', 'LightSalmon2', 'LightSalmon3', 'LightSalmon4', 'orange2',
'orange3', 'orange4', 'DarkOrange1', 'DarkOrange2', 'DarkOrange3', 'DarkOrange4',
'coral1', 'coral2', 'coral3', 'coral4', 'tomato2', 'tomato3', 'tomato4', 'OrangeRed2',
'OrangeRed3', 'OrangeRed4', 'red2', 'red3', 'red4', 'DeepPink2', 'DeepPink3', 'DeepPink4',
'HotPink1', 'HotPink2', 'HotPink3', 'HotPink4', 'pink1', 'pink2', 'pink3', 'pink4',
'LightPink1', 'LightPink2', 'LightPink3', 'LightPink4', 'PaleVioletRed1',
'PaleVioletRed2', 'PaleVioletRed3', 'PaleVioletRed4', 'maroon1', 'maroon2',
'maroon3', 'maroon4', 'VioletRed1', 'VioletRed2', 'VioletRed3', 'VioletRed4',
'magenta2', 'magenta3', 'magenta4', 'orchid1', 'orchid2', 'orchid3', 'orchid4', 'plum1',
'plum2', 'plum3', 'plum4', 'MediumOrchid1', 'MediumOrchid2', 'MediumOrchid3',
'MediumOrchid4', 'DarkOrchid1', 'DarkOrchid2', 'DarkOrchid3', 'DarkOrchid4',
'purple1', 'purple2', 'purple3', 'purple4', 'MediumPurple1', 'MediumPurple2',
'MediumPurple3', 'MediumPurple4', 'thistle1', 'thistle2', 'thistle3', 'thistle4',
'gray1', 'gray2', 'gray3', 'gray4', 'gray5', 'gray6', 'gray7', 'gray8', 'gray9', 'gray10',
'gray11', 'gray12', 'gray13', 'gray14', 'gray15', 'gray16', 'gray17', 'gray18', 'gray19',
'gray20', 'gray21', 'gray22', 'gray23', 'gray24', 'gray25', 'gray26', 'gray27', 'gray28',
'gray29', 'gray30', 'gray31', 'gray32', 'gray33', 'gray34', 'gray35', 'gray36', 'gray37',
'gray38', 'gray39', 'gray40', 'gray42', 'gray43', 'gray44', 'gray45', 'gray46', 'gray47',
'gray48', 'gray49', 'gray50', 'gray51', 'gray52', 'gray53', 'gray54', 'gray55', 'gray56',
'gray57', 'gray58', 'gray59', 'gray60', 'gray61', 'gray62', 'gray63', 'gray64', 'gray65',
'gray66', 'gray67', 'gray68', 'gray69', 'gray70', 'gray71', 'gray72', 'gray73', 'gray74',
'gray75', 'gray76', 'gray77', 'gray78', 'gray79', 'gray80', 'gray81', 'gray82', 'gray83',
'gray84', 'gray85', 'gray86', 'gray87', 'gray88', 'gray89', 'gray90', 'gray91', 'gray92',
'gray93', 'gray94', 'gray95', 'gray97', 'gray98', 'gray99']
def check(ob1, ob2):
if (ob1.pos[0] - ob2.pos[0])**2 + (ob1.pos[1] - ob2.pos[1])**2 < 4 * radio**2: return True
else: return False
def colide(ob1, ob2):
temp = ob1.angle
ob1.angle = ob2.angle
ob2.angle = temp
temp = ob1.speed
ob1.speed = ob2.speed
ob2.speed = temp
def newcheck(a, b):
for element in lista:
if (element.pos[0] - a)**2 + (element.pos[1] - b)**2 <= radio**2 * 4:
return False
return True
lista = []
class bubble():
def __init__(self, pos, angle, speed):
self.pos = pos
self.angle = angle
self.speed = speed
self.color = COLORS[random.randint(0, len(COLORS) - 1)]
self.colidedobs = []
lista.append(self)
def advance(self):
self.pos[0] = self.pos[0] + math.cos(self.angle) * self.speed
self.pos[1] = self.pos[1] - math.sin(self.angle) * self.speed
def cparede(self):
if self.pos[0] < radio:
self.angle = math.pi - self.angle
elif self.pos[1] < radio:
self.angle = 2 * math.pi - self.angle
elif self.pos[0] > size - radio:
self.angle = math.pi - self.angle
elif self.pos[1] > size - radio:
self.angle = 2 * math.pi - self.angle
else:
return
roott = []
def pressionou(event):
global roott
roott = [event.x, event.y]
def soltou(event):
bubble([roott[0], roott[1]], math.atan2(- event.y + roott[1], event.x - roott[0]), random.random() * 1.8 + 0.2)
root = tkinter.Tk()
canva = tkinter.Canvas(root, height = size, width = size)
canva.pack()
canva.bind("<ButtonPress-1>", pressionou)
canva.bind("<ButtonRelease-1>", soltou)
while quantidade > 0:
a = random.random() * (size - 2 * radio) + radio
b = random.random() * (size - 2 * radio) + radio
angulo = random.random() * 2 * math.pi
vel = random.random()* 2.5 + 0.5
if angulo not in (math.pi / 2, math.pi, 3 * math.pi / 2, 2 * math.pi, 0) and newcheck(a, b):
bubble([a, b], angulo, vel)
quantidade = quantidade - 1
fmax = 16
fcounter = 0
def update():
global fcounter
for element in lista:
element.advance()
element.cparede()
if element.angle < 0: element.angle = element.angle + math.pi * 2
if element.angle > 2 * math.pi: element.angle = element.angle - math.pi * 2
fcounter = fcounter + 1
for element2 in lista:
if check(element, element2) == True and element2 not in element.colidedobs and lista.index(element) < lista.index(element2):
colide(element, element2)
if fcounter >= fmax:
canva.delete("all")
for element in lista:
canva.create_oval(element.pos[0] - radio, element.pos[1] - radio, element.pos[0] + radio, element.pos[1] + radio, fill = element.color)
canva.create_line(element.pos[0], element.pos[1], element.pos[0] + radio * math.cos(element.angle), element.pos[1] - radio * math.sin(element.angle))
for col in element.colidedobs:
a = element.pos[0]
b = element.pos[1]
c = col.pos[0]
d = col.pos[1]
med = [(a + c) / 2, (b + d) / 2]
coliding = math.atan2(b - d, a - c) + math.pi / 2
canva.create_line(med[0] - math.cos(coliding) * radio, med[1] - math.sin(coliding) * radio, med[0] + math.cos(coliding) * radio, med[1] + math.sin(coliding) * radio)
fcounter = 0
root.after(1, update)
root.after(1, update)
root.mainloop()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment