Suche einen Slow Down Algorithmus

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Douchbag
User
Beiträge: 9
Registriert: Freitag 4. März 2016, 17:39

Guten Tag,

ich bin momentan ein wenig mit PyGame am rumspielen. Hab nun einen Fade In Text gebastelt der langsam vom oben ins Bild reinfährt und in der Mitte stehen bleibt.

Nun möchte ich aber gerne das dieser Text zuerst schnell und dann immer langsamer wird bis er endlich am Ziel ankommt. Dafür suche ich nun einen Algorithmus. Ich weiß zB wie das in einem Graphen aussehen würde, aber ich bin im Internet nicht fündig geworden. Kann mir jemand einen Tipp und eine kleine Starthilfe geben?

Wie muss das ungefähr aussehen?


Was ich versucht habe...
Ich habe eine Geschwindigkeit "speed" angegeben. Den speed habe ich dann zB mit 0.75 immer multipliziert, Das Ergebnis habe ich genutzt um den Text auf der Y Achse zu verschieben. Aber leider war das vom Endergbnis her eine unschöne Lösung, da es auch nicht zum gewünschten Ergebnis führte.
BlackJack

@Douchbag: Wenn Start- und Endpunkt bekannt sind, würde ich ja einfach etwas schreiben was auf einer halben Sinuskurve basiert. Einfach und effektiv.
Douchbag
User
Beiträge: 9
Registriert: Freitag 4. März 2016, 17:39

Wie würde denn eine typische Funktion dafür aussehen? Ich bin gerade am rumrechnen wie verrückt. Ich glaube ich mache mir das zu kompliziert.
BlackJack

Simples Beispiel:

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf8
from __future__ import absolute_import, division, print_function
from math import pi as PI, sin
import pygame

BLACK = (0, 0, 0)
WHITE = (255, 255, 255)


def main():
    pygame.init()
    clock = pygame.time.Clock()
    screen = pygame.display.set_mode((800, 600))
    screen_rect = screen.get_rect()
    text = (
        pygame.font.Font(None, 64).render('www.python-forum.de', True, WHITE)
    )
    text_rect = text.get_rect()
    text_rect.centerx = screen_rect.centerx
    distance = screen_rect.centery + text_rect.centery
    step_count = 100
    step_number = None
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                return
            elif event.type == pygame.KEYUP and event.key == pygame.K_SPACE:
                if step_number is None:
                    step_number = 0

        if step_number is not None:
            if step_number < step_count:
                text_rect.centery = (
                    screen_rect.centery
                    - (1 - sin((PI / 2) / step_count * step_number)) * distance
                )
                screen.fill(BLACK)
                screen.blit(text, text_rect)
                step_number += 1
            else:
                step_number = None

        pygame.display.update()
        clock.tick(30)


if __name__ == '__main__':
    main()
Antworten