Visualiza ondas sinusoidales usando Python

Las ondas sinusoidales son las curvas periódicas trigonométricas más básicas, que también se conocen como la curva sinusoidal. Aquí veremos cómo se relaciona la función seno con un círculo. Aunque la función seno es una función trigonométrica, tiene más que ver con un círculo que con un triángulo. 

Considere una ecuación simple de un círculo:

x^2 + y^2 = r^2

donde r es el radio del círculo con centro en el origen (0,0) como se muestra en la siguiente figura.

El seno no es más que la medida del desplazamiento y desde el origen a medida que aumenta el ángulo, como se muestra en la siguiente figura:

Podemos visualizar esta definición de seno usando python y el módulo pygame . Pygame es un paquete de Python de código abierto que se utiliza principalmente para crear videojuegos.

Acercarse:

  • Crea un círculo con radio r .
  • Dibuja el radio del círculo. Los extremos del radio serán (0,0) y (r*cos a, r*sin a), donde el punto (r*cos a, r*sin a) siempre será de la circunferencia.
  • Dibujar la curva sinusoidal
  • Luego dibuja una línea que unirá el punto inicial de la onda sinusoidal y el punto final del radio del círculo. La longitud se llama la brecha en aras de la simplicidad.

Nota: Aquí, la posición del radio significa la posición de la cabeza del radio del círculo. Abdominales

Dibujar la curva sinusoidal

Dibuja un círculo y anima su radio de modo que el extremo del radio cubra todos los puntos de la circunferencia del círculo. Esto se puede hacer usando un ciclo while infinito y dibujando una línea desde el centro del círculo hasta ( r * cos t,r * sin t ). Luego declare una lista Ys para almacenar todos los valores r*sin t al principio de la lista.

Básicamente, esto mantendrá un registro de todos los valores de r*sin t desde la posición inicial del radio hasta su nueva posición actual. Estos valores se utilizarán más adelante para mostrar la curva sinusoidal. Cree un ciclo for para recorrer los elementos de Ys ​​y luego dibuje un círculo de radio 1 y ancho 1, con abscisas comenzando desde 0 hasta len (Ys) y ordenadas serán los valores de Ys ​​correspondientes, es decir, Ys[i] , donde índice i[0, len(Ys)-1]. La abscisa debe moverse una cierta cantidad suficiente para que la animación quede ordenada.

En la animación, la brecha se muestra con una línea negra que el usuario puede aumentar o disminuir.

A continuación se muestra la implementación:

Python3

import numpy as np
import pygame
from pygame.locals import *
 
 
class trig:
 
    # to collect all the ordinates
    Ys = []
 
    def __init__(self, width=1600, height=900,
                 gap=100, fps=60, radius=100):
 
        # width of the window
        self.width = width
 
        # height of the window
        self.height = height
 
        # frame rate per second
        self.fps = fps
        self.screen = pygame.display.set_mode((self.width,
                                               self.height))
 
        # setting the screen dimensions
        self.clock = pygame.time.Clock()
 
        # the distance between the radius
        self.gap = gap
 
        #  pointer and the starting point of the curve
 
        # the will be the x axis
        self.t = 0
 
        # length of the radius of the circle
        self.r = radius
 
        self.run = True
        while self.run:
            self.clock.tick(self.fps)
 
            # filling the whole canvas with white background
            self.screen.fill('white')
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    self.run = False
            if event.type == KEYDOWN:
                if event.key == K_ESCAPE:
                    pygame.quit()
 
            # center of the circle
            x, y = 400, 400
 
            x += (self.r * np.cos(self.t))
            y += (self.r * np.sin(self.t))
            pygame.draw.line(self.screen, 'grey',
                             (400, 400),
                             (400+1000, 400), 3)
 
            # this will create a horizontal line
 
            pygame.draw.line(self.screen,
                             'grey',
                             (400, 400 + self.r),
                             (400+1000, 400+self.r), 3)
 
            # this will create a horizontal line above the circle
            pygame.draw.line(self.screen,
                             'grey',
                             (400, 400 - self.r),
                             (400+1000, 400-self.r),
                             3)
 
            # this will create a horizontal
            # line below the circle
            pygame.draw.circle(self.screen,
                               'blue',
                               (400, 400),
                               self.r, 5)
 
            # this will create a circle
            # with center (400,400)
            pygame.draw.line(self.screen,
                             'green',
                             (400, 400),
                             (x, y), 3)
 
            # this will draw the radius of the circle
 
            # inserting the y values
            # at the beginning of the Ys list
            self.Ys.insert(0, y)
 
            if len(self.Ys) > 1100 - self.gap:
                self.Ys.pop()
 
            # this will restrict the length
            # of the Ys to a certain limit
            # so that the animation
            # doesn't get out of the screen
 
            pygame.draw.line(self.screen, 'black', (x, y),
                             (400+self.gap, self.Ys[0]), 3)
 
            # this will create the joining line
            # between the curve and the circle's radius
 
            for i in range(len(self.Ys)):
                pygame.draw.circle(self.screen, 'red',
                                   (i+400+self.gap, self.Ys[i]), 1, 1)
 
                # this will create the sin curve
                # it will create bunch of small circles
                # with varying centers in such a
                # way that it will trajectory of
                # the centers of all those small circles
                # will give rise to a sine curve
 
            if event.type == KEYDOWN:
                if event.key == K_RIGHT:
                    self.gap += 1
                if event.key == K_LEFT:
                    self.gap -= 1
 
             # this part of code gives the user
             # the freedom to set the speed of the
             # animation and also set the gap
             # between the circle and the sine curve
 
            self.t += 0.01
            pygame.display.update()
 
 
if __name__ == '__main__':
    sin = trig()
    pygame.quit()

Producción:

Nota: Use las flechas izquierda y derecha para disminuir o aumentar el espacio entre el círculo y la curva sinusoidal. Utilice ECS  para salir de la ventana o SALIR.

Publicación traducida automáticamente

Artículo escrito por rajarshiban13 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *