Guest User

Untitled

a guest
May 31st, 2018
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.21 KB | None | 0 0
  1. from Tkinter import *
  2. from PIL import ImageTk, Image, ImageDraw, ImageFont
  3. import os
  4.  
  5. class EndWindow:
  6. # starts on 11, 6, 12, 7, 5, 31
  7.  
  8. def __init__(self):
  9. self.pics = {}
  10. self.record = Record.AB(5,31)
  11. self.squareWidth = 2
  12. self.buildWindow()
  13. self.redrawCanvas()
  14.  
  15.  
  16. def changeRecord(self,newRec):
  17. xn = newRec[1] + newRec[3]
  18. if(xn%2 == 0):
  19. return
  20. self.record = newRec
  21. self.redrawCanvas()
  22.  
  23.  
  24. def zoomIn(self):
  25. self.squareWidth += 1
  26. self.redrawCanvas()
  27.  
  28. def zoomOut(self):
  29. self.squareWidth -= 1
  30. if(self.squareWidth < 1):
  31. self.squareWidth = 1
  32. self.redrawCanvas()
  33.  
  34. def updateAB(self):
  35. aVal = int(self.aEntry.get())
  36. bVal = int(self.bEntry.get())
  37. self.changeRecord(Record.AB(aVal,bVal))
  38. self.redrawCanvas()
  39.  
  40. def createRecord(self):
  41. string = self.createVar.get()
  42. strings, creates = Record.createStuff()
  43. i = strings.index(string)
  44. self.record = creates[i](int(self.oneEntry.get()), int(self.twoEntry.get()), int(self.threeEntry.get()))
  45. self.redrawCanvas()
  46.  
  47. def redrawCanvas(self):
  48. #leftSide
  49. recString = rec2String(self.record)
  50. if(recString not in self.pics.keys()):
  51. self.pics[recString] = {}
  52.  
  53. ww = self.squareWidth
  54.  
  55. if(ww not in self.pics[recString]):
  56. IMG = generateSquare(self.record, squareWidth = ww)
  57. tkim = ImageTk.PhotoImage(IMG)
  58. self.pics[recString][ww] = tkim
  59.  
  60. tkim = self.pics[recString][ww]
  61.  
  62. self.canvas.delete(ALL)
  63. self.imagesprite = self.canvas.create_image(200,200,image=tkim)
  64. self.canvas.pack(side=BOTTOM)
  65.  
  66. #rightside
  67. self.updateRightLabels()
  68. #self.root.mainloop()
  69.  
  70. def updateRightLabels(self):
  71. frm = self.bottomRightFrame
  72. for widget in frm.winfo_children():
  73. widget.destroy()
  74.  
  75. for i in range(len(Record.strs())):
  76. newframe = Frame(frm)
  77. newframe.pack(side=LEFT)
  78.  
  79. label = Label(newframe, text=Record.strs()[i])
  80. value = Label(newframe, text=str(self.record.vals()[i]))
  81. label.pack(side=TOP)
  82. value.pack(side=BOTTOM)
  83.  
  84.  
  85.  
  86. def upE(self,event):
  87. self.UPE()
  88.  
  89. def UPE(self):
  90. e = self.record[0]
  91. n = self.record[1]
  92. x = self.record[3]
  93. newE = e + 2*n
  94.  
  95. self.changeRecord(Record.ENX(newE, n, x))
  96. self.redrawCanvas()
  97.  
  98. def downE(self,event):
  99. self.DOWNE()
  100.  
  101. def DOWNE(self):
  102. e = self.record[0]
  103. n = self.record[1]
  104. x = self.record[3]
  105. newE = e - 2*n
  106. self.changeRecord(Record.ENX(newE, n, x))
  107. self.redrawCanvas()
  108.  
  109. def minusT(self):
  110. e = self.record[0]
  111. n = self.record[1]
  112. x = self.record[3] - 2
  113.  
  114. aVal = (x*x + e)*(1.0)/(2*n)
  115. while(aVal%1 != 0 or (x+n)%2 == 0):
  116. x -= 2
  117. aVal = (x*x + e)*(1.0)/(2*n)
  118.  
  119. self.changeRecord(Record.ENX(e,n,x))
  120. self.redrawCanvas()
  121.  
  122.  
  123. def plusT(self):
  124. e = self.record[0]
  125. n = self.record[1]
  126. x = self.record[3] + 2
  127.  
  128. aVal = (x*x + e)*(1.0)/(2*n)
  129. while(aVal%1 != 0):
  130. x += 2
  131. aVal = (x*x + e)*(1.0)/(2*n)
  132.  
  133. self.changeRecord(Record.ENX(e,n,x))
  134. self.redrawCanvas()
  135.  
  136. def WEAKFACT(self,event):
  137. self.weakFactor()
  138.  
  139. def DEFACT(self,event):
  140. self.deFactor()
  141.  
  142. def weakFactor(self):
  143. e = self.record[0]
  144. d = self.record[2]
  145. c = d*d + e
  146. if(c<0):
  147. return
  148. fact = self.record[4] + 1
  149.  
  150. while(c%fact != 0):
  151. fact += 1
  152.  
  153. if(fact == c):
  154. return
  155.  
  156. aVal = fact
  157. bVal = c//fact
  158.  
  159. if(aVal>bVal):
  160. return
  161.  
  162. self.changeRecord(Record.ABD(aVal,bVal,d))
  163. self.redrawCanvas()
  164.  
  165. def deFactor(self):
  166. e = self.record[0]
  167. d = self.record[2]
  168. c = d*d + e
  169.  
  170. if(self.record[4] == 1):
  171. return
  172.  
  173. fact = self.record[4] - 1
  174. while(c%fact > 0):
  175. fact -= 1
  176.  
  177. bVal = c//fact
  178.  
  179. self.changeRecord(Record.ABD(fact,bVal,d))
  180. self.redrawCanvas()
  181.  
  182.  
  183.  
  184.  
  185.  
  186. def buildWindow(self):
  187. self.root = Tk()
  188. root = self.root
  189.  
  190. root.bind('<Left>', self.downE)
  191. root.bind('<Right>', self.upE)
  192. root.bind('<Up>', self.WEAKFACT)
  193. root.bind('<Down>', self.DEFACT)
  194.  
  195. self.leftFrame = Frame(root)
  196. self.rightFrame = Frame(root)
  197. self.leftFrame.pack(side=LEFT)
  198. self.rightFrame.pack(side=RIGHT)
  199. leftFrame = self.leftFrame
  200. rightFrame = self.rightFrame
  201.  
  202. #left side
  203. self.topToolFrame = Frame(leftFrame)
  204. topToolFrame = self.topToolFrame
  205. self.ZObutton = Button(topToolFrame, text="-", command=self.zoomOut)
  206. self.ZIbutton = Button(topToolFrame, text="+", command=self.zoomIn)
  207. self.ZObutton.pack(side=LEFT)
  208. self.ZIbutton.pack(side=RIGHT)
  209. self.topToolFrame.pack(side=TOP)
  210.  
  211. self.canvas = Canvas(leftFrame, width=400, height=400)
  212. IMG = generateSquare(self.record, squareWidth = self.squareWidth)
  213. tkim = ImageTk.PhotoImage(IMG)
  214. self.imagesprite = self.canvas.create_image(200,200,image=tkim)
  215. self.canvas.pack(side=BOTTOM)
  216.  
  217. #right side
  218.  
  219. #top right
  220. self.topRightFrame = Frame(self.rightFrame, padx = 10, pady = 10)
  221. self.topRightFrame.pack(side=TOP)
  222.  
  223. self.ABLabel = Label(self.topRightFrame, text="AB:")
  224. self.ABLabel.pack(side=LEFT)
  225.  
  226. self.aEntry = Entry(self.topRightFrame, width=5)
  227. self.aEntry.pack(side=LEFT)
  228. self.bEntry = Entry(self.topRightFrame, width=5)
  229. self.bEntry.pack(side=LEFT)
  230.  
  231. self.ABButton = Button(self.topRightFrame, text="AB", command = self.updateAB)
  232. self.ABButton.pack(side=RIGHT)
  233.  
  234. #mid right
  235. self.midRightFrame = Frame(self.rightFrame)
  236. self.midRightFrame.pack()
  237.  
  238. listOptions, funcList = Record.createStuff()
  239. self.createVar = StringVar(self.midRightFrame)
  240. self.popMenu = OptionMenu(self.midRightFrame, self.createVar, *listOptions)
  241. self.popMenu.config(width = 8)
  242. self.popMenu.pack(side=LEFT)
  243.  
  244. self.oneEntry = Entry(self.midRightFrame, width=5)
  245. self.oneEntry.pack(side=LEFT)
  246. self.twoEntry = Entry(self.midRightFrame, width=5)
  247. self.twoEntry.pack(side=LEFT)
  248. self.threeEntry = Entry(self.midRightFrame, width=5)
  249. self.threeEntry.pack(side=LEFT)
  250.  
  251. self.CreateButton = Button(self.midRightFrame, text="Create", command = self.createRecord)
  252. self.CreateButton.pack(side=RIGHT)
  253.  
  254. #bottom right
  255. self.bottomRightFrame = Frame(self.rightFrame)
  256. self.bottomRightFrame.pack(side = BOTTOM)
  257. self.updateRightLabels()
  258.  
  259. #last row
  260. self.bottomBottomRight = Frame(self.rightFrame)
  261. self.bottomBottomRight.pack(side=BOTTOM)
  262.  
  263. self.e2nButtonU = Button(self.bottomBottomRight, text="e+2n", command=self.UPE)
  264. self.e2nButtonU.pack(side=LEFT)
  265. self.e2nButtonD = Button(self.bottomBottomRight, text="e-2n", command=self.DOWNE)
  266. self.e2nButtonD.pack(side=LEFT)
  267. self.pTButton = Button(self.bottomBottomRight, text="+X", command=self.plusT)
  268. self.pTButton.pack(side=LEFT)
  269. self.dTButton = Button(self.bottomBottomRight, text="-X", command=self.minusT)
  270. self.dTButton.pack(side=LEFT)
  271. self.factorBut = Button(self.bottomBottomRight, text="Factor", command = self.weakFactor)
  272. self.factorBut.pack(side=LEFT)
  273. self.defactorBut = Button(self.bottomBottomRight, text="De-Factor", command = self.deFactor)
  274. self.defactorBut.pack(side=LEFT)
  275.  
  276.  
  277. root.mainloop()
  278.  
  279. class Record:
  280.  
  281. @staticmethod
  282. def ABD(A,B,D):
  283. e,n,d,x,a,b = ABD(A,B,D)
  284. return Record(e,n,d,x,a,b)
  285.  
  286. @staticmethod
  287. def ENA(E,N,A):
  288. e,n,d,x,a,b = ENA(E,N,A)
  289. return Record(e,n,d,x,a,b)
  290.  
  291. @staticmethod
  292. def AB(A,B):
  293. e,n,d,x,a,b = AB(A,B)
  294. return Record(e,n,d,x,a,b)
  295.  
  296. @staticmethod
  297. def ABX(A,B,X):
  298. d = A + X
  299. return Record.ABD(A,B,d)
  300.  
  301. @staticmethod
  302. def DEA(D,E,A):
  303. e,n,d,x,a,b = DEA(D,E,A)
  304. return Record(e,n,d,x,a,b)
  305.  
  306. @staticmethod
  307. def ENX(E,N,X):
  308. e,n,d,x,a,b = ENX(E,N,X)
  309. return Record(e,n,d,x,a,b)
  310.  
  311. @staticmethod
  312. def BSLS(bs,ls):
  313. c = bs*bs - ls*ls
  314. d = int(math.sqrt(c))
  315. e = c - d * d
  316. n = bs - d
  317. x = ls - n
  318. a = d - x
  319. b = a + 2*n + 2*x
  320. return Record(e,n,d,x,a,b)
  321.  
  322. @staticmethod
  323. def tMethod(t,Ac, Bc, Xc, Dc):
  324. a = ABDguy(t,Ac)
  325. b = ABDguy(t,Bc)
  326. d = ABDguy(t,Dc)
  327. x = Xguy(t,Xc)
  328. e = a*b - d*d
  329. n = (b - a - 2*x)//2
  330. return Record(e,n,d,x,a,b)
  331.  
  332. @staticmethod
  333. def printRecs(recs):
  334. maxLen = 5
  335. for i in Record.strs():
  336. if(len(i)>maxLen):
  337. maxLen = len(i)
  338. for i in recs:
  339. for j in i.vals():
  340. if(len(str(j)) > maxLen):
  341. maxLen = len(str(j))
  342.  
  343. start = ""
  344. for i in Record.strs():
  345. start += " "*(maxLen-len(i)) + i + "|"
  346. start += "\n"
  347.  
  348. for rec in recs:
  349. for val in rec.vals():
  350. start += " "*(maxLen-len(str(val))) + str(val) + "|"
  351. start += "\n"
  352. print(start)
  353.  
  354. @staticmethod
  355. def createStuff():
  356. strings = ["ABD","ABX","ENA","DEA","ENX"]
  357. funcs = [Record.ABD, Record.ABX, Record.ENA, Record.DEA, Record.ENX]
  358. return strings,funcs
  359.  
  360. @staticmethod
  361. def strs():
  362. return ['e','n','d','x','a','b','c','bs','ls','f','nn','2d1n1g','f-1','n-1']
  363.  
  364. def vals(self):
  365. return [self.e, self.n, self.d, self.x, self.a, self.b, self.c,
  366. self.bs, self.ls, self.f, (self.nn,self.nn%8),
  367. (self.dd1n1,self.dd1n1%8), (self.f1,self.f1%8),
  368. (self.n1,self.n1%8)]
  369.  
  370.  
  371.  
  372. def __init__(self,E,N,D,X,A,B):
  373. self.e = E
  374. self.n = N
  375. self.d = D
  376. self.x = X
  377. self.a = A
  378. self.b = B
  379. self.c = A*B
  380. self.bs = D+N
  381. self.ls = X+N
  382. self.f = 2*D + 1 - E
  383. self.nn = N*N
  384. self.dd1n1 = (2*D-1)*(N-1)
  385. self.f1 = self.f - 1
  386. self.n1 = self.n - 1
  387. if(self.ls%2 == 0):
  388. print("xn even")
  389.  
  390.  
  391. def __str__(self):
  392. return str((self.e, self.n, self.d, self.x, self.a, self.b))
  393.  
  394. def __getitem__(self,indices):
  395. return self.vals()[indices]
  396.  
  397. def F(self):
  398. self.d = self.d+1
  399. self.e = self.c - self.d**2
  400. self.x = self.d - self.a
  401. self.n = (self.b + self.a)//2 - self.d
  402.  
  403.  
  404. def FI(self):
  405. self = Record.ABD(self.a, self.b, self.d-1)
  406.  
  407. def bigRec(self):
  408. return self.b**2 + self.b * self.a
  409.  
  410. def shiftE(self,W):
  411. e,n,d,x,a,b = self.e, self.n,self.d,self.x,self.a,self.b
  412. return Record(e+2*W*n, n, d+W, x, a+W, b+W)
  413.  
  414. def swapDN(self):
  415. return Record.ABD(self.a, self.b, self.n)
  416.  
  417. def zeroD(self):
  418. return Record.ABD(self.a, self.b, 0)
  419.  
  420. def shiftN(self,amt):
  421. e,n,d,x,a,b = self.e, self.n, self.d, self.x, self.a, self.b
  422. return Record(e + 2*a*amt, n + amt, d, x, a, b+2*amt)
  423.  
  424. def zeroN2(self):
  425. return self.shiftN(-self.n)
  426.  
  427. def zeroN(self):
  428. return Record.ABD(self.a, self.b, self.bs)
  429.  
  430. def oneN(self):
  431. return Record.ABD(self.a, self.b, 1).swapDN()
  432.  
  433. def shiftD(self,n):
  434. return Record.ABD(self.a, self.b, self.d + n)
  435.  
  436. def upAB(self):
  437. return Record.AB(self.a + 1, self.b + 1)
  438.  
  439. def downAB(self):
  440. return Record.AB(self.a - 1, self.b - 1)
  441.  
  442. def aubd(self):
  443. return Record.AB(self.a + 1, self.b - 1)
  444.  
  445. def abdu(self):
  446. return Record.AB(self.a - 1, self.b + 1)
  447.  
  448. def shiftAB(self, n):
  449. return Record.AB(self.a + n, self.b + n)
  450.  
  451.  
  452.  
  453. def AB(A,B):
  454. C = A * B
  455. D = intSqrt(C)
  456. E = C - D * D
  457. X = D - A
  458. N = int(((X * X)+E)/(2 * A))
  459. return (int(E),int(N),int(D),int(X),int(A),int(B))
  460.  
  461. def ABD(A,B,D):
  462. C = A * B
  463. E = C - D * D
  464. X = D - A
  465. N = int(((X * X)+E)/(2 * A))
  466. return (int(E),int(N),int(D),int(X),int(A),int(B))
  467.  
  468. def EDX(E,D,X):
  469. C = D*D + E
  470. A = D - X
  471. B = int(C/A)
  472. N = int((X*X+E)/(2*A))
  473. return (E,N,D,X,A,B)
  474.  
  475. def ENA(E,N,A):
  476. # 2na = xx + e
  477. X = intSqrt(2*N*A - E)
  478. D = X + A
  479. C = D*D + E
  480. B = C//A
  481. return (E,N,D,X,A,B)
  482.  
  483. def END(E,N,D):
  484. C = D * D + E
  485. A = D - X
  486. B = A + 2*X + 2*N
  487. return (E,N,D,X,A,B)
  488.  
  489. def ENX(E,N,X):
  490. A = int((X*X + E) / (2*N))
  491. D = X + A
  492. C = D*D + E
  493. B = A + 2*X + 2*N
  494. return (E,N,D,X,A,B)
  495.  
  496. def DEA(D,E,A):
  497. C = D*D + E
  498. B = C//A
  499. X = D - A
  500. N = (X*X + E)//(2*A)
  501. return (E,N,D,X,A,B)
  502.  
  503.  
  504. def intSqrt(n):
  505. x = n
  506. y = (x + 1) // 2
  507. while y < x:
  508. x = y
  509. y = (x + n // x) // 2
  510. return x
  511.  
  512. def rec2String(record):
  513. string = ""
  514. for i in range(6):
  515. string += str(record[i])+"-"
  516. return string
  517.  
  518.  
  519. def generateSquare(record, squareWidth = 4):
  520. n = record[1]
  521. x = record[3]
  522. d = record[2]
  523. e = record[0]
  524. nn = n*n
  525. f = 2*d + 1 - e
  526. 2
  527. xn = x+n
  528. width = xn
  529. if(xn%2==0):
  530. return
  531.  
  532. vals = [n*n, (2*d-1)*(n-1), f-1, n-1]
  533.  
  534. red = (166,52,70)
  535. green = (96,211,148)
  536. yellow = (247,240,82)
  537. blue = (35,116,171)
  538. orange = (242,129,35)
  539.  
  540. colors = [blue, green, yellow, orange]
  541. divs = []
  542. mods = []
  543. for val in vals:
  544. divs.append(val//8)
  545. mods.append(val%8)
  546.  
  547.  
  548. miniSquares = [[0 for i in range(width)] for j in range(width)]
  549. center = xn//2
  550.  
  551. baseColors = []
  552. for j in range(len(divs)):
  553. for i in range(divs[j]):
  554. baseColors.append(colors[j])
  555. if(j == 1):
  556. baseColors.append(red)
  557. baseColors.append(red)
  558.  
  559. #draw triangles part
  560.  
  561. for triangle in range(1,9):
  562.  
  563. colorDex = 0
  564.  
  565. if(triangle in [2,3,6,7]): #horizontal drawing
  566. if(triangle == 2):
  567. xStart = center
  568. yStart = center - 1
  569. yDir = -1
  570. legDir = -1
  571. if(triangle == 3):
  572. xStart = center + 1
  573. yStart = center - 1
  574. yDir = -1
  575. legDir = 1
  576. if(triangle == 6):
  577. xStart = center - 1
  578. yStart = center + 1
  579. yDir = 1
  580. legDir = -1
  581. if(triangle == 7):
  582. xStart = center
  583. yStart = center + 1
  584. yDir = 1
  585. legDir = 1
  586.  
  587. for y in range(1,center+1):
  588. for x in range(y):
  589. xCoord = xStart + (legDir * x)
  590. yCoord = (yStart + (yDir) * (y-1))
  591. miniSquares[yCoord][xCoord] = baseColors[colorDex]
  592. colorDex += 1
  593. else:
  594. if(triangle == 1):
  595. xStart = center - 1
  596. yStart = center - 1
  597. xDir = -1
  598. legDir = -1
  599. if(triangle == 4):
  600. xStart = center + 1
  601. yStart = center
  602. xDir = 1
  603. legDir = -1
  604. if(triangle == 5):
  605. xStart = center - 1
  606. yStart = center
  607. xDir = -1
  608. legDir = 1
  609. if(triangle == 8):
  610. xStart = center + 1
  611. yStart = center + 1
  612. xDir = 1
  613. legDir = 1
  614.  
  615.  
  616. for x in range(1,center+1):
  617. for y in range(x):
  618. xCoord = xStart + (xDir * (x-1))
  619. yCoord = yStart + (legDir * y)
  620. miniSquares[yCoord][xCoord] = baseColors[colorDex]
  621. colorDex += 1
  622. res = makeSquare(squareWidth,width,miniSquares)
  623. return res
  624.  
  625. def makeSquare(squareWidth, squares, entries):
  626. totalWidth = (squares-1) + squareWidth*(squares)
  627.  
  628. img = Image.new('RGB', (totalWidth,totalWidth))
  629. draw = ImageDraw.Draw(img)
  630.  
  631. for i in range(len(entries)):
  632. row = entries[i]
  633. for j in range(len(row)):
  634. color = row[j]
  635. fillSquare(j,i,squareWidth,draw, color)
  636. return img
  637.  
  638.  
  639. def fillSquare(x,y,squareWidth, draw, color):
  640. xPix = x*(squareWidth + 1)
  641. yPix = y*(squareWidth + 1)
  642. draw.rectangle( ((xPix,yPix),(xPix + squareWidth, yPix + squareWidth)), fill = color)
  643.  
  644.  
  645.  
  646. j = EndWindow()
Advertisement
Add Comment
Please, Sign In to add comment