Advertisement
Guest User

Untitled

a guest
Sep 19th, 2018
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.30 KB | None | 0 0
  1. import pygame as pg
  2. import math
  3. from random import randint
  4.  
  5. pg.init()
  6. pg.font.init()
  7.  
  8. valge       = [255, 255, 255]
  9. hall        = [189, 195, 199]
  10. tume_sinine = [52, 73, 94]
  11. must        = [44, 62, 80]
  12. sinine      = [52, 152, 219]
  13. punane      = [231, 76, 60]
  14. kollane     = [241, 196, 15]
  15. roheline    = [46, 204, 113]
  16. oranž       = [230, 126, 34]
  17. ametüst     = [155, 89, 182]
  18.  
  19. ekr_x = 30**2
  20. ekr_y = 2**9
  21. ekr = pg.display.set_mode([ekr_x, ekr_y])
  22. pg.display.set_caption("ruutfunktsioonid")
  23. font = pg.font.SysFont("arial", 28)
  24. väike_font = pg.font.SysFont("arial", 12)
  25.  
  26. # pikslites
  27. ruudustiku_vahe = 10
  28.  
  29. class input_kast:
  30.     def __init__(self, x, y, w, h, kirjeldus):
  31.         self.kast = pg.Rect(x, y, w, h)
  32.         self.värv = hall
  33.         self.kirjeldus = kirjeldus + ":"
  34.         self.kirjelduse_pind = font.render(self.kirjeldus, True, self.värv)
  35.         self.tekst = ""
  36.         self.teksti_pind = font.render(self.tekst, True, self.värv)
  37.         self.aktiivne = False
  38.  
  39.     def uuenda_teksti_pindu(self):
  40.         # säti teksti pinnad, et hiljem joonistada
  41.         self.kirjelduse_pind = font.render(self.kirjeldus, True, self.värv if self.aktiivne else hall)
  42.         self.teksti_pind = font.render(self.tekst, True, self.värv if self.aktiivne else hall)
  43.  
  44.     def käsitle_eventi(self, event):
  45.         if (event.type == pg.MOUSEBUTTONDOWN):
  46.             # kui kasti peale klikati
  47.             if (self.kast.move(self.kirjelduse_pind.get_width() + 10, 0).collidepoint(event.pos)):
  48.                 # muuda muutujat
  49.                 self.aktiivne = not self.aktiivne
  50.             else:
  51.                 self.aktiivne = False
  52.             # muuda värvi
  53.             self.värv = roheline if self.aktiivne else hall
  54.         if (event.type == pg.KEYDOWN):
  55.             if self.aktiivne:
  56.                 if event.key == pg.K_RETURN:
  57.                     print(self.tekst)
  58.                     self.tekst = ""
  59.                 elif event.key == pg.K_BACKSPACE:
  60.                     self.tekst = self.tekst[:-1]
  61.                 else:
  62.                     self.tekst += event.unicode
  63.  
  64.     def uuenda(self):
  65.         self.uuenda_teksti_pindu()
  66.         # uuenda kasti laiust
  67.         width = max(20, self.teksti_pind.get_width() + 8)
  68.         self.kast.w = width
  69.  
  70.     def joonista(self, ekraan):
  71.         ekraan.blit(self.kirjelduse_pind, (self.kast.x, self.kast.y))
  72.         ekraan.blit(self.teksti_pind, (self.kast.x + self.kirjelduse_pind.get_width() + 15, self.kast.y))
  73.         pg.draw.rect(ekraan, self.värv, self.kast.move(self.kirjelduse_pind.get_width() + 10, 0), 2)
  74.  
  75. def lahenda(a, b, c):
  76.     ruutjuur_ruudus = b ** 2 - 4 * a * c
  77.     if (ruutjuur_ruudus < 0):
  78.         return ("neg_root")
  79.  
  80.     if (ruutjuur_ruudus == 0.0):
  81.         return ("single", -b / (2 * a))
  82.  
  83.     ruutjuur = math.sqrt(ruutjuur_ruudus)
  84.     return (((-b - ruutjuur) / (2 * a)), ((-b + ruutjuur) / (2 * a)))
  85.  
  86. def joonista_graafik(a, b, c):
  87.     for i in range (ekr_y):
  88.         x = (ekr_y / 2 - i) / float(ruudustiku_vahe)
  89.         y = a * x**2 + b * x + c
  90.         pos1 = [ekr_y / 2 + x * ruudustiku_vahe - 6, ekr_y / 2 - y * ruudustiku_vahe - 6]
  91.         nx = (ekr_y / 2 - (i + 1)) / float(ruudustiku_vahe)
  92.         ny = a * nx ** 2 + b * nx + c
  93.         pos2 = [ekr_y / 2 + nx * ruudustiku_vahe - 6, ekr_y / 2 - ny * ruudustiku_vahe - 6]
  94.         pg.draw.line(ekr, oranž, pos1, pos2, 2)
  95.  
  96. def main():
  97.     kell = pg.time.Clock()
  98.     input_kastid = [
  99.         input_kast(ekr_y + 15, 10, 140, 32, "ruutliikme kordaja"),
  100.         input_kast(ekr_y + 15, 10 + 42, 140, 32, "lineaarliikme kordaja"),
  101.         input_kast(ekr_y + 15, 10 + 84, 140, 32, "vabaliige")
  102.     ]
  103.     valmis = False
  104.  
  105.     while not valmis:
  106.         for event in pg.event.get():
  107.             if event.type == pg.QUIT:
  108.                 valmis = True
  109.             for kast in input_kastid:
  110.                 kast.käsitle_eventi(event)
  111.  
  112.         for kast in input_kastid:
  113.             kast.uuenda()
  114.  
  115.         ekr.fill(valge)
  116.  
  117.         # ruudustiku joonistamine
  118.         for i in range(int(ekr_y / ruudustiku_vahe)):
  119.             if (int(ekr_y / ruudustiku_vahe / 2) == i):
  120.                 pg.draw.line(ekr, must, (ruudustiku_vahe * i, 0), (ruudustiku_vahe * i, ekr_y), 1)
  121.                 pg.draw.line(ekr, must, (0, ruudustiku_vahe * i), (ekr_y, ruudustiku_vahe * i), 1)
  122.             else:
  123.                 pg.draw.line(ekr, hall, (ruudustiku_vahe * i, 0), (ruudustiku_vahe * i, ekr_y), 1)
  124.                 pg.draw.line(ekr, hall, (0, ruudustiku_vahe * i), (ekr_y, ruudustiku_vahe * i), 1)
  125.  
  126.         for i in range(int(ekr_y / ruudustiku_vahe)):
  127.             if (i - int(ekr_y / ruudustiku_vahe / 2)) % 3 == 0 and i - int(ekr_y / ruudustiku_vahe / 2) != 0:
  128.                 pg.draw.line(ekr, must, (ruudustiku_vahe * i, ekr_y / 2 - ruudustiku_vahe + 1), (ruudustiku_vahe * i, ekr_y / 2 - 2), 1)
  129.                 pg.draw.line(ekr, must, (ekr_y / 2 - ruudustiku_vahe + 1, ruudustiku_vahe * i), (ekr_y / 2 - 2, ruudustiku_vahe * i), 1)
  130.                 tekst = väike_font.render(str(i - int(ekr_y / ruudustiku_vahe / 2)), 1, must)
  131.                 ekr.blit(tekst, (ruudustiku_vahe * i - tekst.get_width() / 2, int(ekr_y / 2) - ruudustiku_vahe + tekst.get_height() / 2))
  132.                 tekst2 = väike_font.render(str(-i + int(ekr_y / ruudustiku_vahe / 2)), 1, must)
  133.                 ekr.blit(tekst2, (int(ekr_y / 2) - ruudustiku_vahe + 10, ruudustiku_vahe * i - tekst.get_height() / 2))
  134.         tekst_null = väike_font.render("0", 1, must)
  135.         ekr.blit(tekst_null, (int(ekr_y / 2) - 15, int(ekr_y / 2) - 5))
  136.  
  137.         konst = ruudustiku_vahe * int(ekr_y / ruudustiku_vahe)
  138.         pg.draw.line(ekr, hall, (konst + 1, 0), (konst + 1, ekr_y), 2)
  139.         pg.draw.line(ekr, hall, (0, konst), (ekr_y, konst), 2)
  140.  
  141.         for kast in input_kastid:
  142.             kast.joonista(ekr)
  143.  
  144.         try:
  145.             if (input_kastid[0].tekst and float(input_kastid[0].tekst) != 0.0):
  146.                 vastused = lahenda(
  147.                     float(input_kastid[0].tekst),
  148.                     float(input_kastid[1].tekst) if input_kastid[1].tekst else 0.0,
  149.                     float(input_kastid[2].tekst) if input_kastid[2].tekst else 0.0
  150.                 )
  151.                 if (vastused != "neg_root"):
  152.                     if (vastused[0] == "single"):
  153.                         ekr.blit(font.render("lahend: " + str(vastused[1] if vastused[1] != 0.0 else str(vastused[1])[1:]), 1, sinine), (ekr_y + 15, 140))
  154.                     else:
  155.                         ekr.blit(font.render("1. lahend: " + str(vastused[0]), 1, sinine), (ekr_y + 15, 140))
  156.                         ekr.blit(font.render("2. lahend: " + str(vastused[1]), 1, sinine), (ekr_y + 15, 165))
  157.                 else:
  158.                      ekr.blit(font.render("reaalarvulised lahendid puuduvad", 1, punane), (ekr_y + 15, 140))
  159.  
  160.                 joonista_graafik(
  161.                     float(input_kastid[0].tekst),
  162.                     float(input_kastid[1].tekst) if input_kastid[1].tekst else 0.0,
  163.                     float(input_kastid[2].tekst) if input_kastid[2].tekst else 0.0
  164.                 )
  165.             else:
  166.                 ekr.blit(font.render("tegemist ei ole ruutfunktsiooniga", 1, punane), (ekr_y + 15, 140))
  167.         except ValueError:
  168.             pass
  169.    
  170.         pg.display.flip()
  171.  
  172.         kell.tick(10)
  173.  
  174. if __name__ == "__main__":
  175.     main()
  176.     pg.quit()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement