¡En este artículo, crearemos un patrón Rhodonea Curve y Maurer Rose en Python! ¡Antes de proceder a ver qué es exactamente una curva de rhodonea o una rosa de Maurer , necesitamos preparar la estructura básica de nuestro programa!
Estructura Básica del Programa –
Antes de pasar a aprender algo sobre las curvas de Rhodonea o los patrones de rosas de Maurer, primero debemos preparar la estructura básica de nuestro programa. De modo que cuando refactoricemos nuestro código solo modificaremos una función mientras que el resto del programa será igual. Así que aquí está la estructura básica del programa:
Python3
from math import sin from math import cos from math import radians import pygame # The width and height of our program (width, height) = (800, 600) # Setup the window and init the screen surface screen = pygame.display.set_mode((width, height)) pygame.display.set_caption('Rose Curve in Python !') # The background color of the screen screen.fill((250, 250, 205)) # lemonChiffon color # Our function for drawing the rose pattern drawPattern() # Flip the drawn canvas with the newly created canvas (double-buffering) # Basically we're refreshing the screen surface after drawing pygame.display.flip() # Our Main Loop while True : # Poll the events in the event queue for event in pygame.event.get() : # if the user closed the window if event.type == pygame.QUIT : # deactivate pygame and quit the program pygame.quit() quit() # Draws the surface object to the screen. pygame.display.update()
Si ejecuta el código, obtendrá un error de que drawPattern no está definido. Lo definiremos más adelante. ¡ Pero por ahora déjalo ser y avancemos para entender qué son las curvas de Rhodonea !
¿Qué es una curva de Rhodonea?
Rhodonea Curve (también conocida como la rosa en matemáticas) es básicamente una curva que se puede expresar en la forma en que un número entero define el número de pétalos ( si es par y cuando es impar)
¿Confundido? Vea esta imagen que compara una rosa con 12 pétalos versus una rosa con 5 pétalos:
Tenga en cuenta que las coordenadas en la ecuación anterior están en forma polar. Pero dado que en los gráficos por computadora expresamos las ubicaciones de los píxeles en forma cartesiana en lugar de en forma polar, la curva debe redescribirse como un conjunto de todos los puntos , cada uno en forma de ecuación paramétrica, como se muestra a continuación:
Ensuciándonos las manos con Rose Curves
Lo anterior fue solo la teoría y, en caso de que no haya entendido el concepto por completo, lo entenderá después de verlo en acción . Simplemente agregue lo siguiente en la línea 17 (justo arriba de donde invocamos drawPattern):
Python3
# Draws a rose with n petals and of radius size about `size` def drawRhodoneaCurve(n, size): points =[] for i in range(0, 361): # The equation of a rhodonea curve r = size * sin(radians(n * i)) # Converting to cartesian co-ordinates x = r * cos(radians(i)) y = r * sin(radians(i)) list.append(points, (width / 2 + x, height / 2 + y)) # Draws a set of line segments connected by set of vertices points # Also don't close the path and draw it black and set the width to 5 pygame.draw.lines(screen, (0, 0, 0), False, points, 5) def drawPattern(): # Try changing these values to what you want drawRhodoneaCurve(12, 200)
Esto producirá el siguiente resultado –
Explicación
- Calculamos los vértices (cada punto significativo en la rosa que luego se conectan por aristas que son simplemente segmentos de línea) usando la fórmula que discutimos en la sección anterior
- Almacenamos una lista llamada puntos que tiene todos los vértices de la rosa y luego esta lista de vértices se alimenta a pygame.draw.lines que dibuja una secuencia de líneas rectas continuas y aquí la usamos para dibujar una string poligonal (ya que una rosa es solo una string poligonal)
- Tenga en cuenta que estamos usando el método de radianes aquí. Esto se debe a que los ángulos están en formato de grados (podríamos haber usado radianes directamente, pero el rango espera solo números enteros, también para las curvas de Maurer, de todos modos tendremos que usar grados, así que ¿por qué no comenzar desde ahora?) – con suerte no tuvimos que hacer cualquier conversión nosotros mismos como Python3 proporciona grados y radianes de funciones integradas .
- También tenga en cuenta que estamos cambiando las coordenadas por (ancho/2, alto/2). Esto se debe a que, por defecto, PyGame tiene sus coordenadas en la esquina superior izquierda. Pero lo queremos en el centro, así que lo desplazamos a la mitad del ancho y la altura de la pantalla. Podríamos haber traducido todo el sistema de coordenadas, ¡pero es más fácil de esta manera!
Una nota sobre cómo hacer que el programa sea más interactivo:
el programa actualmente no es tan interactivo, pero puede hacerlo tal vez aumentando la cantidad de pétalos en una cantidad fractal en cada cuadro y, dependiendo de qué tan rápido/lento aumente, puede volverse bastante impresionante. resultados. Hacer que el programa sea interactivo está fuera del alcance (ya que eso aumentaría significativamente el recuento de LOC y quizás también aumentaría la complejidad del programa y violaría la estructura básica que creamos al principio), pero experimenté un poco y aquí está el resultado de crear primero una variable n y luego incrementarla en 0.1 en cada fotograma.
Ahora ¿Qué es una Rosa Maurer?
Ahora que sabemos acerca de las curvas de Rhodonea, pasemos a Maurer Rose:
una rosa de Maurer es una curva de Rhodonea de la forma que consta de 361 líneas conectadas por 361 puntos, cada una de las formas para cada en el conjunto , donde es un número entero.
Los valores variables de pueden crear diferentes tipos de rosas incluso si todas tienen el mismo número de pétalos (lo que significa el mismo valor de )
Ahora las coordenadas cartesianas tendrán la forma:-
Ensuciándonos las manos con Maurer Roses
Entonces, para hacer algo con lo que acabamos de aprender, sobrescribimos la función drawPattern anterior con la nueva:
Python3
# Draws a maurer rose with value n and d it's size about `size` def drawMaurerRose(n, d, size): points =[] for i in range(0, 361): # The equation of a maurer rose k = i * d r = size * sin(radians(n * k)) # Converting to cartesian co-ordinates x = r * cos(radians(k)) y = r * sin(radians(k)) list.append(points, (width / 2 + x, height / 2 + y)) # Draws a set of line segments connected by set of vertices points # Also don't close the path and draw it black and set the width to 5 pygame.draw.lines(screen, (0, 0, 0), False, points, 5) def drawPattern(): # Try changing these values to what you want drawMaurerRose(6, 79, 200)
Y ahora, cuando ejecute el programa, debería obtener el siguiente resultado:
Explicación:
solo se han cambiado las líneas resaltadas, el resto es igual:
- El nombre de la función se cambió a dibujarMaurerRose de dibujarRhodoneaCurve y ahora espera un parámetro adicional d.
- Ahora introducimos una nueva variable k que en realidad proviene de la fórmula. Su valor en cada iteración es igual a i*d, por lo que para d=1 la función es exactamente la misma que dibujarRhodoneaCurve!!
- Ahora usamos k en lugar de i y debe tenerse en cuenta que el ancho de la línea se ha cambiado de 5 a 2 (de lo contrario, algunas líneas aparecerían como una debido a su alto grosor).
- Y la declaración de invocación, por supuesto, también se ha cambiado, ahora llama a la función dibujarMaurerRose recién creada con n = 6 y d = 71. ¡Los valores se copiaron de WikiPedia ya que el valor aleatorio de d a veces puede producir rosas de aspecto extraño!
Referencias:
https://en.wikipedia.org/wiki/Rose_(mathematics)
https://www.geeksforgeeks.org/degrees-and-radians-in-python/
https://en.wikipedia.org/wiki/ Maurer_rose
http://mathworld.wolfram.com/MaurerRose.html