# # Kantigrafik # # Version 0.2 # Date: 15.12.2022 # Author: Olaf Schnürer # Licence: https://creativecommons.org/licenses/by-sa/4.0/deed.en import pygame import time import math # Farben per Rot-, Grün- und Blauwert # (jeweils auf Skala von 0 bis 255). # rot grün blau ROT = (255, 0, 0) GRUEN = ( 0, 255, 0) BLAU = ( 0, 0, 255) GELB = (255, 255, 0) MAGENTA = (255, 0, 255) CYAN = ( 0, 255, 255) WEISS = (255, 255, 255) SCHWARZ = ( 0, 0, 0) GRAU = (100, 100, 100) HINTERGRUND_FARBE = SCHWARZ ZEICHENFARBE = WEISS def zeichenfenster(min_x, min_y, max_x, max_y, pixel_pro_einheit, titel): global leinwand global ecke_links_unten global ecke_rechts_oben global faktor ecke_links_unten = (min_x, min_y) ecke_rechts_oben = (max_x, max_y) faktor = pixel_pro_einheit pygame.init() leinwand = pygame.display.set_mode(((max_x - min_x) * pixel_pro_einheit + 1, (max_y - min_y) * pixel_pro_einheit + 1)) pygame.display.set_caption(titel) leinwand.fill(HINTERGRUND_FARBE) def neue_zeichnung(): leinwand.fill(HINTERGRUND_FARBE) def leinwandpunkt(x, y): return ((x - ecke_links_unten[0]) * faktor, (ecke_rechts_oben[1] - y) * faktor) def linie(x1, y1, x2, y2): pygame.draw.line(leinwand, ZEICHENFARBE, leinwandpunkt(x1, y1), leinwandpunkt(x2, y2)) def breite_linie(x1, y1, x2, y2, breite): pygame.draw.line(leinwand, ZEICHENFARBE, leinwandpunkt(x1, y1), leinwandpunkt(x2, y2), width=round(breite * faktor)) def kreis(x, y, r): pygame.draw.circle(leinwand, ZEICHENFARBE, leinwandpunkt(x, y), faktor * r, width=1) def gefuellter_kreis(x, y, r): pygame.draw.circle(leinwand, ZEICHENFARBE, leinwandpunkt(x, y), faktor * r, width=0) def punkt(x, y): # draw.line(leinwand, ZEICHENFARBE, leinwandpunkt(x, y), leinwandpunkt(x, y)) if ecke_links_unten[0] <= x <= ecke_rechts_oben[0] and ecke_links_unten[1] <= y <= ecke_rechts_oben[1]: a, b = leinwandpunkt(x, y) a = round(a) b = round(b) leinwand.set_at((a, b), ZEICHENFARBE) def farbe(c): global ZEICHENFARBE ZEICHENFARBE = c def raster(): for i in range(ecke_links_unten[0], ecke_rechts_oben[0] + 1): linie(i, ecke_links_unten[1], i, ecke_rechts_oben[1]) for i in range(ecke_links_unten[1], ecke_rechts_oben[1] + 1): linie(ecke_links_unten[0], i, ecke_rechts_oben[0], i) def x_achse(): linie(ecke_links_unten[0], 0, ecke_rechts_oben[0], 0) for i in range(ecke_links_unten[0], ecke_rechts_oben[0]): linie(i, -0.2, i, 0.2) linie(ecke_rechts_oben[0], 0, ecke_rechts_oben[0] - 0.2, 0.2) linie(ecke_rechts_oben[0], 0, ecke_rechts_oben[0] - 0.2, -0.2) def y_achse(): linie(0, ecke_links_unten[1], 0, ecke_rechts_oben[1]) for i in range(ecke_links_unten[1], ecke_rechts_oben[1]): linie(-0.2, i, 0.2, i) linie(0, ecke_rechts_oben[1], 0.2, ecke_rechts_oben[1] - 0.2) linie(0, ecke_rechts_oben[1], -0.2, ecke_rechts_oben[1] - 0.2) def zeige(): pygame.display.update() def warte_auf_klick(): beenden = False while not beenden: pygame.display.update() for ereignis in pygame.event.get(): if ereignis.type == pygame.QUIT: beenden = True elif ereignis.type == pygame.KEYDOWN: if ereignis.key in {pygame.K_ESCAPE, pygame.K_q}: beenden = True elif ereignis.type == pygame.MOUSEBUTTONDOWN: beenden = True quit() def speichere(dateiname): pygame.image.save(leinwand, dateiname) def pause(sekunden): time.sleep(sekunden) def schreibe(x, y, text, groesse): # schrift = pygame.font.Font('freesansbold.ttf', round(groesse * faktor)) # Mit pygame.font.SysFont kann man wohl jede der Fonts aus der Liste # pygame.font.get_fonts() # verwenden. schrift = pygame.font.SysFont('freemono', round(groesse * faktor)) formatierter_text = schrift.render(text, True, WEISS, SCHWARZ) # formatierter_text.set_alpha(127) rechteck = formatierter_text.get_rect() # rechteck.center = leinwandpunkt(x, y) rechteck.bottomleft = leinwandpunkt(x, y) # print(dir(rechteck)) leinwand.blit(formatierter_text, rechteck)