#!/usr/bin/python3 # -*- coding: utf-8 -*- import os, sys, termios, tty, time, random from math import sin, cos, tan, sqrt from time import sleep # pi is not defined by default pi = 3.1416 deg2rad = pi / 180 ######################################################################################## def berechneflugbahn(xmax, ymax, steps, startwinkel, startgeschwindigkeit, xmin=0, ymin=0, starthoehe=0, gravitation=9.81, xstep=1): x = 0 y = x**2 # in scala the resulting coordinates will be returned scala = [] startwinkel = startwinkel * deg2rad # Calculate time of flight, actually not used flugdauer = startgeschwindigkeit * sin(startwinkel) / gravitation # Calculate maximum height hoehe = 0.5 * gravitation * flugdauer**2 + starthoehe # calculate length of flight, actually not used wurfweite = ( startgeschwindigkeit * cos(startwinkel) * (startgeschwindigkeit * sin(startwinkel) + sqrt(startgeschwindigkeit**2 * sin(startwinkel) ** 2 + 2 * gravitation * starthoehe)) ) / gravitation first_run = True # cowlength is 2, if cow is an UTF8-Icon, otherwise 1 for x in range(xmin, steps - 1, xstep): # the formula, which generates the y position for the corresponding x, shamelessly ripped from some schoolbook and modified. y = (-(gravitation / (2 * startgeschwindigkeit**2 * cos(startwinkel) ** 2)) * x**2) + (tan(startwinkel) * x + starthoehe) # Ensure, that nothing has to be drawn outside the viewport if x >= xmax: x = xmax if y >= ymax: y = ymax elif y <= ymin: y = ymin # Stash away the coordinates into scala, which will be returned scala += [x, int((y * 100 + 50) / 100)] if y == ymin and not first_run: break first_run = False return scala ############################################################################################# # berechneflugbahn(cow, xmin, xmax, ymin, ymax, startwinkel, startgeschwindigkeit, starthoehe): # some useful control clear, home, curoff, curon = "'\x1b[2J\x1b[H", "\x1b[H", "\x1b[?25l", "\x1b[?25h" g_erde = 9.81 # gravitation examples mond = 1.6 jupiter = 24 # set position of cursor def curpos(x, y): print("\033[%d;%dH" % (ymax - y, x), end="", flush=True) if __name__ == "__main__": # Randomly choose a cow cows = "🐵🐒🦍🦧🐕🐯🦝🐩🐅🐴🐎🦄🦌🐗🐂🐃🐄🐪🐫🦙🦒🐹🦘🦡🐧🕊️ 🦅🦆🦉🐍🦎🐊🦜🦚🦩🐲🐉🦕" cowlistlength = len(cows) cow = cows[random.randint(0, cowlistlength - 1)] # Needed: find our screensize. We are in textmode here termsize_xy = os.get_terminal_size() ### I m p o r t a n t p a r a m e t e r s ### # X-Resolution of the display xmax = termsize_xy[0] - 1 xsteps = xmax * 2 ymax = termsize_xy[1] ymin = 0 xmin = 0 startwinkel = 34 startgeschwindigkeit = 60 starthoehe = 0 schlafzeit = 0.05 ### # needed for erasing old position xold = xmin yold = ymin x = xmin y = xmin # Call the function, which calculates the coordinates) ergebnis = berechneflugbahn(xmax, ymax, xsteps, startwinkel, startgeschwindigkeit, starthoehe, gravitation=g_erde, xstep=2) print(curoff) # here we draw the cow for count in range(xmin, len(ergebnis), 2): xold, yold = x, y x, y = ergebnis[count], ergebnis[count + 1] curpos(x, y) print(cow, end="") sleep(schlafzeit) curpos(xold, yold) print("☁️ ", end="") sleep(2) sys.exit(home + curon)