Les courbes de Rose

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(θ)

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")
}





Aucun commentaire:

Enregistrer un commentaire