Les courbes de Rose
Introduction
Je pourrais commencer en citant le grand Omar Sharif qui disait (je crois) "Les courbes, c'est ma grande passion". En effet, après un article précédent sur les courbes de Lissajous, on continue notre périple dans le monde merveilleux des trucs pas droit avec les courbes de Rose. Dans ce nouveau cas, le déplacement du point de dépend plus d'une double composante sinusoïdale mais suit les propriétés suivantes :
x=cos(kθ) cos(θ)
y=cos(kθ) sin(θ)
x=cos(kθ) cos(θ)
y=cos(kθ) sin(θ)
Les variations se font donc toujours en fonction d'un angle mais aussi d'un facteur k. Pour représenter en deux dimensions l'impact de ce facteur nous allons créer différentes valeurs en écrivant k=n/d et nous ferons varier les valeurs respectives de n et d entre 1 et 6. (Évidemment tout ceci est une fois de plus paramétrable). En premier lieu voici le résultat que l'on obtient.
Le résultat
Le code
On commence avec la fonction qui permettra de placer le point à chaque itération.coord=function(x,y,theta,k=1,r=.4){ return(c(x+r*cos(k*theta)*cos(theta),y+r*cos(k*theta)*sin(theta))) }
On poursuit en initialisant les valeur de N et D ainsi que les différentes valeurs de thêta et les arrays qui nous permettront de stocker a chaque itération la position des points.
S=seq(0,12*pi,by=pi/30) N=D=1:6 COL=colorRampPalette(c("lightblue","orange"))(max(c(length(N),length(D)))) XX=YY=array(0,dim=c(length(N),length(D),length(S)))
Enfin, la partie centrale du code (qui ressemble fortement au code pour les courbes de Lissajous). Il y a principalement des différences d'ordre esthétique puisque le plus gros des différences de résultats vient de la fonction de calcul des coordonnées des points.
for(theta in S){ n=match(theta,S) # Plot par(mar=c(0,0,0,0), bg="grey40"); plot(0, type="n", xlim=c(.5,length(N)+.5), ylim=c(.5,length(D)+.5)) for(i in 1:length(N)){ for(j in 1:length(D)){ # On calcule la position du point i j pour l'iteration s et on stocke yy = coord(i,length(D)-j+1,theta,k=N[i]/D[j])[2] xx = coord(i,length(D)-j+1,theta,k=N[i]/D[j])[1] XX[i,j,n]=xx YY[i,j,n]=yy # On affiche les points deja traces lines(XX[i,j,1:n],YY[i,j,1:n], col= meancol(COL[i],COL[j]), lwd=3) # On plot les elts points(x=XX[i,j,n],y=YY[i,j,n],col="white", pch=16, cex=2) } } mtext(text=D,side=2,at=rev(1:length(D)), col="white", line=-1, font=2, las=1) mtext(text=N,side=3,at=1:length(N), col="white", line=-1, font=2, las=1) text(.5,length(D)+.5,labels="d/n", font=2, col="white") }