Guest User

Untitled

a guest
Jun 1st, 2018
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 27.63 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.radarWidth = 600
  10. self.radarHeight = 300
  11. self.radarPixelSize = 3
  12.  
  13.  
  14. self.pics = {}
  15. self.record = Record.AB(5,31)
  16. self.recordPath = [self.record]
  17. self.squareWidth = 2
  18. self.buildWindow()
  19. self.redrawCanvas()
  20.  
  21.  
  22.  
  23. def canvasClick(self,event):
  24. eOff = event.x // self.radarPixelSize
  25. nOff = event.y // self.radarPixelSize
  26.  
  27. e = self.record[0]
  28. n = self.record[1]
  29.  
  30. whereWeAreX = self.radarWidth // (self.radarPixelSize * 2)
  31. whereWeAreY = self.radarHeight // (self.radarPixelSize * 2)
  32.  
  33. shiftE = eOff - whereWeAreX
  34. shiftN = nOff - whereWeAreY
  35.  
  36. newE = e + shiftE
  37. newN = n + shiftN
  38.  
  39. if(self.xGridOn):
  40. xVal = self.record[3]
  41. aTest = (xVal*xVal + e)*(1.0) / (2*n)
  42. if(aTest % 1 == 0):
  43. self.changeRecord(Record.ENX(newE,newN,xVal))
  44. return
  45.  
  46. if(self.dGridOn):
  47. dVal = self.record[2]
  48. xBase = -newN
  49. inRoot = newN*newN - (newE - 2*newN*dVal)
  50. rootTest = intSqrt(inRoot)
  51. if(rootTest*rootTest == inRoot):
  52. xVal = xBase + rootTest
  53. self.changeRecord(Record.ENX(newE,newN,xVal))
  54. return
  55.  
  56. self.findRec(newE, newN)
  57.  
  58. def changeRecord(self,newRec):
  59. self.recordPath.append(newRec)
  60. self.record = newRec
  61. addToDic(newRec)
  62. self.redrawCanvas()
  63.  
  64. def findRec(self,E,N):
  65. if(E in RECORD_DIC.keys() and N in RECORD_DIC[E].keys()):
  66. self.changeRecord(RECORD_DIC[E][N][0])
  67. return
  68.  
  69. for xVal in range(E%2, 100, 2):
  70. aVal = (xVal*xVal + E)*(1.0) / (2*N)
  71. if(aVal % 1 == 0):
  72. addToDic(Record.ENX(E,N,xVal))
  73.  
  74. if(E not in RECORD_DIC.keys()):
  75. return
  76. if(N not in RECORD_DIC[E]):
  77. return
  78.  
  79. self.changeRecord(RECORD_DIC[E][N][0])
  80.  
  81. def zoomIn(self):
  82. self.squareWidth += 1
  83. self.redrawCanvas()
  84.  
  85. def zoomOut(self):
  86. self.squareWidth -= 1
  87. if(self.squareWidth < 1):
  88. self.squareWidth = 1
  89. self.redrawCanvas()
  90.  
  91. def updateAB(self):
  92. aVal = int(self.aEntry.get())
  93. bVal = int(self.bEntry.get())
  94. self.changeRecord(Record.AB(aVal,bVal))
  95. self.redrawCanvas()
  96.  
  97. def createRecord(self):
  98. string = self.createVar.get()
  99. strings, creates = Record.createStuff()
  100. i = strings.index(string)
  101. self.record = creates[i](int(self.oneEntry.get()), int(self.twoEntry.get()), int(self.threeEntry.get()))
  102. self.redrawCanvas()
  103.  
  104. def redrawCanvas(self):
  105. #leftSide
  106. recString = rec2String(self.record)
  107. if(recString not in self.pics.keys()):
  108. self.pics[recString] = {}
  109.  
  110. ww = self.squareWidth
  111.  
  112. if(ww not in self.pics[recString]):
  113. IMG = generateSquare(self.record, squareWidth = ww)
  114. tkim = ImageTk.PhotoImage(IMG)
  115. self.pics[recString][ww] = tkim
  116.  
  117. tkim = self.pics[recString][ww]
  118.  
  119. self.canvas.delete(ALL)
  120. self.imagesprite = self.canvas.create_image(200,200,image=tkim)
  121. self.canvas.pack(side=BOTTOM)
  122.  
  123. mapPic = makeMap(self.record, self.radarPixelSize, self.radarWidth, self.radarHeight,self.radarParams)
  124. spriteImage = ImageTk.PhotoImage(mapPic)
  125. self.radarCanvas.delete(ALL)
  126. self.radarSpriteImage = spriteImage
  127. self.radarSprite = self.radarCanvas.create_image(self.radarWidth//2,self.radarHeight//2,image=spriteImage)
  128. self.radarCanvas.pack(side=TOP)
  129.  
  130. #rightside
  131. self.updateRightLabels()
  132. #self.root.mainloop()
  133.  
  134.  
  135.  
  136. def updateRightLabels(self):
  137. frm = self.bottomRightFrame
  138. for widget in frm.winfo_children():
  139. widget.destroy()
  140.  
  141. for i in range(len(Record.strs())):
  142. newframe = Frame(frm)
  143. newframe.pack(side=LEFT)
  144.  
  145. label = Label(newframe, text=Record.strs()[i])
  146. value = Label(newframe, text=str(self.record.vals()[i]))
  147. label.pack(side=TOP)
  148. value.pack(side=BOTTOM)
  149.  
  150.  
  151.  
  152. def canvasZoomOut(self):
  153. if(self.radarPixelSize == 1):
  154. return
  155. self.radarPixelSize -= 1
  156.  
  157. self.redrawCanvas()
  158.  
  159. def canvasZoomIn(self):
  160. self.radarPixelSize += 1
  161.  
  162. self.redrawCanvas()
  163.  
  164. def upE(self,event):
  165. self.UPE()
  166.  
  167. def UPE(self):
  168. e = self.record[0]
  169. n = self.record[1]
  170. x = self.record[3]
  171. newE = e + 2*n
  172.  
  173. self.changeRecord(Record.ENX(newE, n, x))
  174.  
  175. def downE(self,event):
  176. self.DOWNE()
  177.  
  178. def DOWNE(self):
  179. e = self.record[0]
  180. n = self.record[1]
  181. x = self.record[3]
  182. newE = e - 2*n
  183. self.changeRecord(Record.ENX(newE, n, x))
  184.  
  185. def plusD(self):
  186. a = self.record[4]
  187. b = self.record[5]
  188. newD = self.record[2] + 1
  189. self.changeRecord(Record.ABD(a,b,newD))
  190.  
  191. def minusD(self):
  192. a = self.record[4]
  193. b = self.record[5]
  194. newD = self.record[2] - 1
  195. self.changeRecord(Record.ABD(a,b,newD))
  196.  
  197. def minusT(self):
  198. e = self.record[0]
  199. n = self.record[1]
  200. x = self.record[3] - 2
  201.  
  202. aVal = (x*x + e)*(1.0)/(2*n)
  203. while(aVal%1 != 0 or (x+n)%2 == 0):
  204. x -= 2
  205. aVal = (x*x + e)*(1.0)/(2*n)
  206.  
  207. self.changeRecord(Record.ENX(e,n,x))
  208. self.redrawCanvas()
  209.  
  210.  
  211. def plusT(self):
  212. e = self.record[0]
  213. n = self.record[1]
  214. x = self.record[3] + 2
  215.  
  216. aVal = (x*x + e)*(1.0)/(2*n)
  217. while(aVal%1 != 0):
  218. x += 2
  219. aVal = (x*x + e)*(1.0)/(2*n)
  220.  
  221. self.changeRecord(Record.ENX(e,n,x))
  222. self.redrawCanvas()
  223.  
  224. def WEAKFACT(self,event):
  225. self.weakFactor()
  226.  
  227. def DEFACT(self,event):
  228. self.deFactor()
  229.  
  230. def weakFactor(self):
  231. e = self.record[0]
  232. d = self.record[2]
  233. c = d*d + e
  234.  
  235. fact = self.record[4] + 1
  236. if(fact == 0):
  237. fact = 1
  238.  
  239. while(c%fact != 0):
  240. fact += 1
  241.  
  242. if(fact == c):
  243. return
  244.  
  245. aVal = fact
  246. bVal = c//fact
  247.  
  248. if(aVal>bVal):
  249. return
  250.  
  251. self.changeRecord(Record.ABD(aVal,bVal,d))
  252. self.redrawCanvas()
  253.  
  254. def deFactor(self):
  255. e = self.record[0]
  256. d = self.record[2]
  257. c = d*d + e
  258.  
  259. if(self.record[4] == 1):
  260. return
  261.  
  262. fact = self.record[4] - 1
  263. if(fact == 0):
  264. fact = -1
  265. while(c%fact > 0):
  266. fact -= 1
  267.  
  268. bVal = c//fact
  269.  
  270. self.changeRecord(Record.ABD(fact,bVal,d))
  271. self.redrawCanvas()
  272.  
  273.  
  274. def toggleDGrid(self):
  275. self.dGridOn = not self.dGridOn
  276. if(self.dGridOn):
  277. if('d' not in self.radarParams):
  278. self.radarParams.append('d')
  279. else:
  280. if('d' in self.radarParams):
  281. self.radarParams.remove('d')
  282. self.redrawCanvas()
  283.  
  284. def toggleXGrid(self):
  285. self.xGridOn = not self.xGridOn
  286. if(self.xGridOn):
  287. if('x' not in self.radarParams):
  288. self.radarParams.append('x')
  289. else:
  290. if('x' in self.radarParams):
  291. self.radarParams.remove('x')
  292. self.redrawCanvas()
  293.  
  294. def printPath(self):
  295. Record.printRecs(self.recordPath)
  296.  
  297. def scanRadar(self):
  298. sxAmt = self.radarWidth // self.radarPixelSize
  299. syAmt = self.radarHeight // self.radarPixelSize
  300.  
  301. hX = sxAmt // 2
  302. hY = syAmt // 2
  303.  
  304. e = self.record[0]
  305. n = self.record[1]
  306.  
  307. eStart = e-hX
  308. nStart = n-hY
  309.  
  310. for X in range(sxAmt):
  311. eVal = eStart + X
  312. for Y in range(syAmt):
  313. nVal = nStart + Y
  314. if(nVal == 0):
  315. continue
  316.  
  317. for xVal in range(e%2, 100, 2):
  318. aTest = (xVal*xVal + eVal)*(1.0) / (2*nVal)
  319. if(aTest % 1 == 0):
  320. addToDic(Record.ENX(eVal,nVal,xVal))
  321. addToMapDic(eVal,nVal)
  322. continue
  323. self.redrawCanvas()
  324.  
  325.  
  326.  
  327.  
  328. def buildWindow(self):
  329. print('Building Window...')
  330. self.root = Tk()
  331. root = self.root
  332.  
  333. root.bind('<Left>', self.downE)
  334. root.bind('<Right>', self.upE)
  335. root.bind('<Up>', self.WEAKFACT)
  336. root.bind('<Down>', self.DEFACT)
  337.  
  338. self.leftFrame = Frame(root)
  339. self.rightFrame = Frame(root)
  340. self.leftFrame.pack(side=LEFT)
  341. self.rightFrame.pack(side=RIGHT)
  342. leftFrame = self.leftFrame
  343. rightFrame = self.rightFrame
  344.  
  345. #left side
  346. self.topToolFrame = Frame(leftFrame)
  347. topToolFrame = self.topToolFrame
  348. self.ZObutton = Button(topToolFrame, text="-", command=self.zoomOut)
  349. self.ZIbutton = Button(topToolFrame, text="+", command=self.zoomIn)
  350. self.ZObutton.pack(side=LEFT)
  351. self.ZIbutton.pack(side=RIGHT)
  352. self.topToolFrame.pack(side=TOP)
  353.  
  354. self.canvas = Canvas(leftFrame, width=400, height=400)
  355. IMG = generateSquare(self.record, squareWidth = self.squareWidth)
  356. tkim = ImageTk.PhotoImage(IMG)
  357. self.imagesprite = self.canvas.create_image(200,200,image=tkim)
  358. self.canvas.pack(side=BOTTOM)
  359.  
  360. #right side
  361.  
  362. #top right
  363. self.topRightFrame = Frame(self.rightFrame, padx = 10, pady = 10)
  364. self.topRightFrame.pack(side=TOP)
  365.  
  366. self.ABLabel = Label(self.topRightFrame, text="AB:")
  367. self.ABLabel.pack(side=LEFT)
  368.  
  369. self.aEntry = Entry(self.topRightFrame, width=5)
  370. self.aEntry.pack(side=LEFT)
  371. self.bEntry = Entry(self.topRightFrame, width=5)
  372. self.bEntry.pack(side=LEFT)
  373.  
  374. self.ABButton = Button(self.topRightFrame, text="AB", command = self.updateAB)
  375. self.ABButton.pack(side=RIGHT)
  376.  
  377. #mid right
  378. self.midRightFrame = Frame(self.rightFrame)
  379. self.midRightFrame.pack(side=TOP)
  380.  
  381. listOptions, funcList = Record.createStuff()
  382. self.createVar = StringVar(self.midRightFrame)
  383. self.popMenu = OptionMenu(self.midRightFrame, self.createVar, *listOptions)
  384. self.popMenu.config(width = 8)
  385. self.popMenu.pack(side=LEFT)
  386.  
  387. self.oneEntry = Entry(self.midRightFrame, width=5)
  388. self.oneEntry.pack(side=LEFT)
  389. self.twoEntry = Entry(self.midRightFrame, width=5)
  390. self.twoEntry.pack(side=LEFT)
  391. self.threeEntry = Entry(self.midRightFrame, width=5)
  392. self.threeEntry.pack(side=LEFT)
  393.  
  394. self.CreateButton = Button(self.midRightFrame, text="Create", command = self.createRecord)
  395. self.CreateButton.pack(side=RIGHT)
  396.  
  397. #bottom right
  398. self.bottomRightFrame = Frame(self.rightFrame)
  399. self.bottomRightFrame.pack()
  400. self.updateRightLabels()
  401.  
  402. #last row
  403. self.bottomBottomRight = Frame(self.rightFrame)
  404. self.bottomBottomRight.pack()
  405.  
  406. self.e2nButtonU = Button(self.bottomBottomRight, text="e-2n", command=self.DOWNE)
  407. self.e2nButtonU.pack(side=LEFT)
  408. self.e2nButtonD = Button(self.bottomBottomRight, text="e+2n", command=self.UPE)
  409. self.e2nButtonD.pack(side=LEFT)
  410. self.dTButton = Button(self.bottomBottomRight, text="-X", command=self.minusT)
  411. self.dTButton.pack(side=LEFT)
  412. self.pTButton = Button(self.bottomBottomRight, text="+X", command=self.plusT)
  413. self.pTButton.pack(side=LEFT)
  414. self.downDButton = Button(self.bottomBottomRight, text="-D", command = self.minusD)
  415. self.downDButton.pack(side=LEFT)
  416. self.upDButton = Button(self.bottomBottomRight, text="+D", command = self.plusD)
  417. self.upDButton.pack(side=LEFT)
  418. self.factorBut = Button(self.bottomBottomRight, text="Factor", command = self.weakFactor)
  419. self.factorBut.pack(side=LEFT)
  420. self.defactorBut = Button(self.bottomBottomRight, text="De-Factor", command = self.deFactor)
  421. self.defactorBut.pack(side=LEFT)
  422.  
  423. #wayBottomRight Radar
  424.  
  425. self.radarBox = Frame(self.rightFrame)
  426. self.radarBox.pack()
  427. self.radarCanvas = Canvas(self.radarBox, width=self.radarWidth, height=self.radarHeight)
  428. IMG = makeMap(self.record, self.radarPixelSize, self.radarWidth, self.radarHeight)
  429. tkim = ImageTk.PhotoImage(IMG)
  430. self.radarSprite = self.radarCanvas.create_image(self.radarWidth//2,self.radarHeight//2,image=tkim)
  431. self.radarCanvas.bind("<ButtonPress-1>", self.canvasClick)
  432. self.radarCanvas.pack()
  433.  
  434. self.radarParams = []
  435. self.canvButtonFrame = Canvas(self.radarBox, width = self.radarWidth)
  436. self.canvButtonFrame.pack(side=BOTTOM)
  437.  
  438. self.dGridOn = False
  439. self.xGridOn = False
  440.  
  441. self.canvZoomIn = Button(self.canvButtonFrame, text = "+", command = self.canvasZoomIn)
  442. self.canvZoomOut = Button(self.canvButtonFrame, text = "-", command = self.canvasZoomOut)
  443. self.canvZoomOut.pack(side = LEFT)
  444. self.canvZoomIn.pack(side=LEFT)
  445. self.canvDGrid = Button(self.canvButtonFrame, text= "Toggle dGrid", command = self.toggleDGrid)
  446. self.canvDGrid.pack(side=LEFT)
  447. self.canvXGrid = Button(self.canvButtonFrame, text = "Toggle xGrid", command = self.toggleXGrid)
  448. self.canvXGrid.pack(side=LEFT)
  449.  
  450. self.radarScanButton = Button(self.canvButtonFrame, text = "Scan", command = self.scanRadar)
  451. self.radarScanButton.pack(side=RIGHT)
  452.  
  453. self.printPathButton = Button(self.canvButtonFrame, text = "Print Path", command = self.printPath)
  454. self.printPathButton.pack(side=RIGHT)
  455. self.scanRadar()
  456.  
  457.  
  458. root.mainloop()
  459.  
  460. class Record:
  461.  
  462. @staticmethod
  463. def ABD(A,B,D):
  464. e,n,d,x,a,b = ABD(A,B,D)
  465. return Record(e,n,d,x,a,b)
  466.  
  467. @staticmethod
  468. def ENA(E,N,A):
  469. e,n,d,x,a,b = ENA(E,N,A)
  470. return Record(e,n,d,x,a,b)
  471.  
  472. @staticmethod
  473. def AB(A,B):
  474. e,n,d,x,a,b = AB(A,B)
  475. return Record(e,n,d,x,a,b)
  476.  
  477. @staticmethod
  478. def ABX(A,B,X):
  479. d = A + X
  480. return Record.ABD(A,B,d)
  481.  
  482. @staticmethod
  483. def DEA(D,E,A):
  484. e,n,d,x,a,b = DEA(D,E,A)
  485. return Record(e,n,d,x,a,b)
  486.  
  487. @staticmethod
  488. def ENX(E,N,X):
  489. e,n,d,x,a,b = ENX(E,N,X)
  490. return Record(e,n,d,x,a,b)
  491.  
  492. @staticmethod
  493. def BSLS(bs,ls):
  494. c = bs*bs - ls*ls
  495. d = int(math.sqrt(c))
  496. e = c - d * d
  497. n = bs - d
  498. x = ls - n
  499. a = d - x
  500. b = a + 2*n + 2*x
  501. return Record(e,n,d,x,a,b)
  502.  
  503. @staticmethod
  504. def tMethod(t,Ac, Bc, Xc, Dc):
  505. a = ABDguy(t,Ac)
  506. b = ABDguy(t,Bc)
  507. d = ABDguy(t,Dc)
  508. x = Xguy(t,Xc)
  509. e = a*b - d*d
  510. n = (b - a - 2*x)//2
  511. return Record(e,n,d,x,a,b)
  512.  
  513. @staticmethod
  514. def printRecs(recs):
  515. maxLen = 5
  516. for i in Record.strs():
  517. if(len(i)>maxLen):
  518. maxLen = len(i)
  519. for i in recs:
  520. for j in i.vals():
  521. if(len(str(j)) > maxLen):
  522. maxLen = len(str(j))
  523.  
  524. start = ""
  525. for i in Record.strs():
  526. start += " "*(maxLen-len(i)) + i + "|"
  527. start += "\n"
  528.  
  529. for rec in recs:
  530. for val in rec.vals():
  531. start += " "*(maxLen-len(str(val))) + str(val) + "|"
  532. start += "\n"
  533. print(start)
  534.  
  535. @staticmethod
  536. def createStuff():
  537. strings = ["ABD","ABX","ENA","DEA","ENX"]
  538. funcs = [Record.ABD, Record.ABX, Record.ENA, Record.DEA, Record.ENX]
  539. return strings,funcs
  540.  
  541. @staticmethod
  542. def strs():
  543. return ['e','n','d','x','a','b','c','(d+n)','(x+n)','f','nn','2d1n1g','f-1','n-1']
  544.  
  545. def vals(self):
  546. return [self.e, self.n, self.d, self.x, self.a, self.b, self.c,
  547. self.bs, self.ls, self.f, (self.nn,self.nn%8),
  548. (self.dd1n1,self.dd1n1%8), (self.f1,self.f1%8),
  549. (self.n1,self.n1%8)]
  550.  
  551.  
  552.  
  553. def __init__(self,E,N,D,X,A,B):
  554. self.e = E
  555. self.n = N
  556. self.d = D
  557. self.x = X
  558. self.a = A
  559. self.b = B
  560. self.c = A*B
  561. self.bs = D+N
  562. self.ls = X+N
  563. self.f = 2*D + 1 - E
  564. self.nn = N*N
  565. self.dd1n1 = (2*D-1)*(N-1)
  566. self.f1 = self.f - 1
  567. self.n1 = self.n - 1
  568. #if(self.ls%2 == 0):
  569. #print("xn even")
  570.  
  571.  
  572. def __str__(self):
  573. return str((self.e, self.n, self.d, self.x, self.a, self.b))
  574.  
  575. def __getitem__(self,indices):
  576. return self.vals()[indices]
  577.  
  578. def F(self):
  579. self.d = self.d+1
  580. self.e = self.c - self.d**2
  581. self.x = self.d - self.a
  582. self.n = (self.b + self.a)//2 - self.d
  583.  
  584.  
  585. def FI(self):
  586. self = Record.ABD(self.a, self.b, self.d-1)
  587.  
  588. def bigRec(self):
  589. return self.b**2 + self.b * self.a
  590.  
  591. def shiftE(self,W):
  592. e,n,d,x,a,b = self.e, self.n,self.d,self.x,self.a,self.b
  593. return Record(e+2*W*n, n, d+W, x, a+W, b+W)
  594.  
  595. def swapDN(self):
  596. return Record.ABD(self.a, self.b, self.n)
  597.  
  598. def zeroD(self):
  599. return Record.ABD(self.a, self.b, 0)
  600.  
  601. def shiftN(self,amt):
  602. e,n,d,x,a,b = self.e, self.n, self.d, self.x, self.a, self.b
  603. return Record(e + 2*a*amt, n + amt, d, x, a, b+2*amt)
  604.  
  605. def zeroN2(self):
  606. return self.shiftN(-self.n)
  607.  
  608. def zeroN(self):
  609. return Record.ABD(self.a, self.b, self.bs)
  610.  
  611. def oneN(self):
  612. return Record.ABD(self.a, self.b, 1).swapDN()
  613.  
  614. def shiftD(self,n):
  615. return Record.ABD(self.a, self.b, self.d + n)
  616.  
  617. def upAB(self):
  618. return Record.AB(self.a + 1, self.b + 1)
  619.  
  620. def downAB(self):
  621. return Record.AB(self.a - 1, self.b - 1)
  622.  
  623. def aubd(self):
  624. return Record.AB(self.a + 1, self.b - 1)
  625.  
  626. def abdu(self):
  627. return Record.AB(self.a - 1, self.b + 1)
  628.  
  629. def shiftAB(self, n):
  630. return Record.AB(self.a + n, self.b + n)
  631.  
  632.  
  633.  
  634. def AB(A,B):
  635. C = A * B
  636. D = intSqrt(C)
  637. E = C - D * D
  638. X = D - A
  639. N = int(((X * X)+E)/(2 * A))
  640. return (int(E),int(N),int(D),int(X),int(A),int(B))
  641.  
  642. def ABD(A,B,D):
  643. C = A * B
  644. E = C - D * D
  645. X = D - A
  646. N = int(((X * X)+E)/(2 * A))
  647. return (int(E),int(N),int(D),int(X),int(A),int(B))
  648.  
  649. def EDX(E,D,X):
  650. C = D*D + E
  651. A = D - X
  652. B = int(C/A)
  653. N = int((X*X+E)/(2*A))
  654. return (E,N,D,X,A,B)
  655.  
  656. def ENA(E,N,A):
  657. # 2na = xx + e
  658. X = intSqrt(2*N*A - E)
  659. D = X + A
  660. C = D*D + E
  661. B = C//A
  662. return (E,N,D,X,A,B)
  663.  
  664. def END(E,N,D):
  665. C = D * D + E
  666. A = D - X
  667. B = A + 2*X + 2*N
  668. return (E,N,D,X,A,B)
  669.  
  670. def ENX(E,N,X):
  671. A = int((X*X + E) / (2*N))
  672. D = X + A
  673. C = D*D + E
  674. B = A + 2*X + 2*N
  675. return (E,N,D,X,A,B)
  676.  
  677. def DEA(D,E,A):
  678. C = D*D + E
  679. B = C//A
  680. X = D - A
  681. N = (X*X + E)//(2*A)
  682. return (E,N,D,X,A,B)
  683.  
  684.  
  685. def intSqrt(n):
  686. x = n
  687. y = (x + 1) // 2
  688. while y < x:
  689. x = y
  690. y = (x + n // x) // 2
  691. return x
  692.  
  693. def rec2String(record):
  694. string = ""
  695. for i in range(6):
  696. string += str(record[i])+"-"
  697. return string
  698.  
  699.  
  700. def generateSquare(record, squareWidth = 4):
  701. n = record[1]
  702. x = record[3]
  703. d = record[2]
  704. e = record[0]
  705. nn = n*n
  706. f = 2*d + 1 - e
  707. 2
  708. xn = x+n
  709. width = xn
  710. if(xn%2==0):
  711. miniSquares = [[(25,116,171) for i in range(width)] for j in range(width)]
  712. return makeSquare(squareWidth, xn, miniSquares)
  713.  
  714. vals = [n*n, (2*d-1)*(n-1), f-1, n-1]
  715.  
  716. red = (166,52,70)
  717. green = (96,211,148)
  718. yellow = (247,240,82)
  719. blue = (35,116,171)
  720. orange = (242,129,35)
  721.  
  722. colors = [blue, green, yellow, orange]
  723. divs = []
  724. mods = []
  725. for val in vals:
  726. divs.append(val//8)
  727. mods.append(val%8)
  728.  
  729.  
  730. miniSquares = [[0 for i in range(width)] for j in range(width)]
  731. center = xn//2
  732.  
  733. baseColors = []
  734. for j in range(len(divs)):
  735. for i in range(divs[j]):
  736. baseColors.append(colors[j])
  737. if(j == 1):
  738. baseColors.append(red)
  739. baseColors.append(red)
  740.  
  741. #draw triangles part
  742.  
  743. for triangle in range(1,9):
  744.  
  745. colorDex = 0
  746.  
  747. if(triangle in [2,3,6,7]): #horizontal drawing
  748. if(triangle == 2):
  749. xStart = center
  750. yStart = center - 1
  751. yDir = -1
  752. legDir = -1
  753. if(triangle == 3):
  754. xStart = center + 1
  755. yStart = center - 1
  756. yDir = -1
  757. legDir = 1
  758. if(triangle == 6):
  759. xStart = center - 1
  760. yStart = center + 1
  761. yDir = 1
  762. legDir = -1
  763. if(triangle == 7):
  764. xStart = center
  765. yStart = center + 1
  766. yDir = 1
  767. legDir = 1
  768.  
  769. for y in range(1,center+1):
  770. for x in range(y):
  771. xCoord = xStart + (legDir * x)
  772. yCoord = (yStart + (yDir) * (y-1))
  773. miniSquares[yCoord][xCoord] = baseColors[colorDex]
  774. colorDex += 1
  775.  
  776. else:
  777. if(triangle == 1):
  778. xStart = center - 1
  779. yStart = center - 1
  780. xDir = -1
  781. legDir = -1
  782. if(triangle == 4):
  783. xStart = center + 1
  784. yStart = center
  785. xDir = 1
  786. legDir = -1
  787. if(triangle == 5):
  788. xStart = center - 1
  789. yStart = center
  790. xDir = -1
  791. legDir = 1
  792. if(triangle == 8):
  793. xStart = center + 1
  794. yStart = center + 1
  795. xDir = 1
  796. legDir = 1
  797.  
  798.  
  799. for x in range(1,center+1):
  800. for y in range(x):
  801. xCoord = xStart + (xDir * (x-1))
  802. yCoord = yStart + (legDir * y)
  803. miniSquares[yCoord][xCoord] = baseColors[colorDex]
  804. colorDex += 1
  805. res = makeSquare(squareWidth,width,miniSquares)
  806. return res
  807.  
  808.  
  809. def makeSquare(squareWidth, squares, entries):
  810. totalWidth = (squares-1) + squareWidth*(squares)
  811.  
  812. img = Image.new('RGB', (totalWidth+1,totalWidth+1))
  813. draw = ImageDraw.Draw(img)
  814.  
  815. for i in range(len(entries)):
  816. row = entries[i]
  817. for j in range(len(row)):
  818. color = row[j]
  819. fillSquare(j,i,squareWidth,draw, color)
  820. return img
  821.  
  822.  
  823. def fillSquare(x,y,squareWidth, draw, color):
  824. xPix = x*(squareWidth + 1)
  825. yPix = y*(squareWidth + 1)
  826. draw.rectangle( ((xPix,yPix),(xPix + squareWidth, yPix + squareWidth)), fill = color)
  827.  
  828.  
  829.  
  830. cLightGray = (190,190,190)
  831. cGray = (150,150,150)
  832. cYellow = (255,255,0)
  833. cRed = (255,0,0)
  834. cGreen = (0,255,0)
  835. cBlack = (0,0,0)
  836. cCyan = (0,255,255)
  837.  
  838. def makeMap(record, squareSize, width, height, params = []):
  839. img = Image.new('RGB', (width, height))
  840. draw = ImageDraw.Draw(img)
  841.  
  842. squareXAmount = width//squareSize
  843. squareYAmount = height//squareSize
  844.  
  845. halfX = squareXAmount // 2
  846. halfY = squareYAmount // 2
  847.  
  848. e = record[0]
  849. n = record[1]
  850.  
  851. eStart = e-halfX
  852. nStart = n-halfY
  853.  
  854. for X in range(squareXAmount):
  855. eVal = eStart + X
  856. for Y in range(squareYAmount):
  857. nVal = nStart + Y
  858.  
  859. if(eVal == e and nVal == n):
  860. color = cCyan
  861. fillSquare(X,Y,squareSize-1,draw,color)
  862. continue
  863. elif( (eVal in map_dic.keys()) and (nVal in map_dic[eVal].keys())):
  864. color = cBlack
  865. elif(eVal == e or nVal == n):
  866. color = cLightGray
  867. else:
  868. color = cGray
  869.  
  870. #Parameters to customize the radar
  871. hits = {}
  872. for pair in params:
  873. if(pair[0] == 'd'):
  874. dVal = record[2]
  875. xBase = -nVal
  876. inroot = nVal*nVal - (eVal - 2*nVal*dVal)
  877. rootTest = intSqrt(inroot)
  878. if(rootTest*rootTest == inroot):
  879. tempCol = (255,0,0)
  880. hits['d'] = True
  881. else:
  882. hits['d'] = False
  883.  
  884. if(pair[0] == 'x'):
  885. xVal = record[3]
  886. if(nVal == 0):
  887. continue
  888. aTest = (xVal*xVal + eVal)*(1.0) / (2*nVal)
  889. if(aTest%1 == 0):
  890. hits['x'] = True
  891. else:
  892. hits['x'] = False
  893.  
  894. if('x' in hits.keys()):
  895. if(hits['x']):
  896. color = (0,255,0)
  897. if('d' in hits.keys()):
  898. if(hits['d']):
  899. color = cRed
  900. if('x' in hits.keys() and 'd' in hits.keys()):
  901. if(hits['x'] and hits['d']):
  902. color = cYellow
  903.  
  904.  
  905. fillSquare(X,Y,squareSize-1,draw,color)
  906. return img
  907.  
  908. map_dic = {}
  909. for e in range(-200,200):
  910. if(e<0):
  911. posE = -e
  912. root = intSqrt(posE)
  913. if(root*root == posE):
  914. if(e not in map_dic.keys()):
  915. map_dic[e] = {}
  916. if(n not in map_dic[e].keys()):
  917. map_dic[e][0] = 1
  918.  
  919. for n in range(1,150):
  920. hit = False
  921. for x in range(e%2,50,2):
  922. aVal = (x*x+e)*(1.0)/(2*n)
  923. if(aVal%1 == 0):
  924. if(e not in map_dic.keys()):
  925. map_dic[e] = {}
  926. if(n not in map_dic[e].keys()):
  927. map_dic[e][n] = 1
  928. hit = True
  929. if(hit):
  930. continue
  931.  
  932. def addToMapDic(e,n):
  933. if(e not in map_dic.keys()):
  934. map_dic[e] = {}
  935. if(n not in map_dic[e].keys()):
  936. map_dic[e][n] = 1
  937.  
  938.  
  939. def pf(n):
  940. primfac = []
  941. d = 2
  942. while d*d <= n:
  943. while (n % d) == 0:
  944. primfac.append(d) # supposing you want multiple factors repeated
  945. n //= d
  946. d += 1
  947. if n > 1:
  948. primfac.append(n)
  949. return primfac
  950.  
  951. RECORD_DIC = {}
  952.  
  953. def addToDic(record):
  954. e = record[0]
  955. n = record[1]
  956.  
  957. if(e not in RECORD_DIC.keys()):
  958. RECORD_DIC[e] = {}
  959.  
  960. if(n not in RECORD_DIC[e].keys()):
  961. RECORD_DIC[e][n] = []
  962.  
  963. if(record in RECORD_DIC[e][n]):
  964. return
  965. RECORD_DIC[e][n].append(record)
  966.  
  967.  
  968. def generateRecords():
  969. print('Generating Records..')
  970. for i in range(250):
  971. for j in range(i):
  972. a = i-j
  973. b = i+j
  974. record = Record.AB(a,b)
  975. record2 = Record.AB(-a,-b)
  976. record3 = Record.AB(a,-b)
  977. record4 = Record.AB(-a,b)
  978.  
  979. addToDic(record)
  980.  
  981.  
  982.  
  983. generateRecords()
  984. j = EndWindow()
Advertisement
Add Comment
Please, Sign In to add comment