2 votes

Je ne peux pas dessiner toutes les fonctions avec mon script.

J'ai créé un script, qui doit prendre l'entrée utilisateur d'une fonction mathématique (f(x)=...) et la dessiner. J'ai utilisé pygame pour cela car je veux utiliser cette mécanique pour un jeu.

Je dois exécuter le code d'une fonction une fois sans aucun résultat, mais après cela, il fonctionne parfaitement. voici le code :

import pygame

def replace_x(function):
    f = lambda x: eval(function)
    return f

def convert_y(y_coords):
    y_coords = 540 - y_coords
    return y_coords

def convert_x(x_coord):
    x_coord = x_coord + 960
    return x_coord

# variables
background_colour = (255, 255, 255)
screen = pygame.display.set_mode((1920, 1080))
running = True
current_y = 0
previous_y = 0

pygame.init()
pygame.display.set_caption('Mathe Kreativarbeit')

screen.fill(background_colour)

pygame.display.flip()
function_input = input("Funktion: ")
function_input = function_input.replace("^", "**")
pygame.display.flip()

for x_coords in range(-15, 17):
    f = replace_x(function_input)
    current_y = convert_y(f(x_coords))
    previous_y = convert_y(f(x_coords - 1))
    start_pos = (convert_x((x_coords - 1) * 60), previous_y)
    end_pos = (convert_x(x_coords * 60), current_y)
    print(start_pos)
    print(end_pos)
    pygame.draw.aaline(screen, (0, 0, 0), start_pos, end_pos)

    pygame.display.flip()

while running:

    for event in pygame.event.get():

        if event.type == pygame.QUIT:
            running = False

1voto

Rabbid76 Points 52493

Créer une liste de points à partir de la fonction :

f = replace_x(function_input)
pt_list = []
for x in range(-20, 20):
    pt_list.append((x, f(x)))

Soit imprimer la liste des points :

print(pt_list)

ou imprimer la liste dans une boucle :

for pt in pt_list:
    print(pt)

Créer une liste de coordonnées d'écran à partir de la liste de points :

coord_list = []
for pt in pt_list:
    x = round(convert_x(pt[0] * 20))
    y = round(convert_y(pt[1]))
    coord_list.append((x, y))

Dessinez la courbe dans la boucle d'application avec pygame.draw.aalines() :

clock = pygame.time.Clock()
running = True
while running:
    clock.tick(60)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    pygame.draw.aalines(screen, (0, 0, 0), False, coord_list)
    pygame.display.flip()

pygame.quit()

Exemple de saisie x**3 :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X