Fonction pour assigner un angle à un point dans un graphique classique

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

François Bonnot
Messages : 537
Enregistré le : 10 Nov 2004, 15:19
Contact :

Re: Fonction pour assigner un angle à un point dans un graphique classique

Messagepar François Bonnot » 10 Avr 2020, 13:00

Il suffit d'une très petite modification des 2 lignes après le for, comme ceci :

Code : Tout sélectionner

polyg2 <- function(xcenter,ycenter,radius,angle,bg,fg,lwd=1,edges=3) {
    angle <- angle*pi/180
    theta <- ((0:(edges-1)))*2*pi/edges
    centers <- cbind(xcenter,ycenter)
    if (length(radius)==1) radius <- rep(radius,nrow(centers))
    for (i in 1:nrow(centers)) {
        x <- cos(theta+angle[i])*radius[i] ; x <- x-x[1]
        y <- sin(theta+angle[i])*radius[i] ; y <- y-y[1]
        polygon(centers[i,1]+x,centers[i,2]+y,border=fg,col=bg,lwd=lwd,density=-1)
        points(centers[i,1]+x[1],centers[i,2]+y[1],col="red",pch=16)
    }
}

df <- expand.grid(x=1:5, y=1:5)
plot(df$x,df$y,xlim=c(0,6),ylim=c(0,6), asp=1) ; grid(col="black")
df$angle <- (0:(nrow(df)-1)*10) ## en degrés
df$radius <- (1:nrow(df))/nrow(df)*0.4 + 0.1
polyg2(df$x,df$y,radius=df$radius,angle=df$angle,bg="yellow",fg="blue",lwd=1)
François

Anthony Sturbois
Messages : 38
Enregistré le : 07 Nov 2019, 07:49

Re: Fonction pour assigner un angle à un point dans un graphique classique

Messagepar Anthony Sturbois » 11 Avr 2020, 07:17

Ok. Je viens de comprendre.
Merci une nouvelle fois!

Anthony Sturbois
Messages : 38
Enregistré le : 07 Nov 2019, 07:49

Re: Fonction pour assigner un angle à un point dans un graphique classique

Messagepar Anthony Sturbois » 13 Avr 2020, 15:43

François,
Cette après midi j'ai essayé de modifier la dernière fonction que tu m'as proposé en me disant que je pourrai me passer du point rouge au somment si le triangle n'était pas isocèle.
Voici ce que j'ai réalisé afin d'obtenir une petite base et deux côtés plus grands

Code : Tout sélectionner

 x <- cos(theta+angle[i])*((radius[i])*.5) ; x <- x-x[1]
    y <- sin(theta+angle[i])*(radius[i]) ; y <- y-y[1]


Ça a marché pour les angle = 180°, les autres triangles apparaissant "déformés". Faut il partir une une formule avec des conditions en fonction de la valeur de l'angle?
Merci d'avance
Antò

Anthony Sturbois
Messages : 38
Enregistré le : 07 Nov 2019, 07:49

Re: Fonction pour assigner un angle à un point dans un graphique classique

Messagepar Anthony Sturbois » 13 Avr 2020, 15:48

j'oubliais, j'ai essayé d'appliquer un vecteur de couleur à fg et bg mais seul le premier élément est considéré.
Merci d'avance
Antò

François Bonnot
Messages : 537
Enregistré le : 10 Nov 2004, 15:19
Contact :

Re: Fonction pour assigner un angle à un point dans un graphique classique

Messagepar François Bonnot » 14 Avr 2020, 14:49

Comme ceci par exemple... mais c'est valable seulement pour des triangles.

Code : Tout sélectionner

polyg3 <- function(xcenter,ycenter,radius,angle,ouverture=60,bg,fg,lwd=1) {
    angle <- angle*pi/180
    theta <- c(0,180-ouverture, 180+ouverture)*pi/180
    centers <- cbind(xcenter,ycenter)
    if (length(radius)==1) radius <- rep(radius,nrow(centers))
    for (i in 1:nrow(centers)) {
        x <- cos(theta+angle[i])*radius[i] ; x <- x-x[1]
        y <- sin(theta+angle[i])*radius[i] ; y <- y-y[1]
        polygon(centers[i,1]+x,centers[i,2]+y,border=fg[i],col=bg[i],lwd=lwd,density=-1)
        points(centers[i,1]+x[1],centers[i,2]+y[1],col="red",pch=16)
    }
}

df <- expand.grid(x=1:5, y=1:5)
plot(df$x,df$y,xlim=c(0,6),ylim=c(0,6), asp=1) ; grid(col="black")
df$angle <- (0:(nrow(df)-1)*10) ## en degrés
df$radius <- (1:nrow(df))/nrow(df)*0.4 + 0.1
df$bg <- rainbow(nrow(df))
df$fg <- rev(df$bg)
polyg3(df$x,df$y,radius=df$radius,angle=df$angle,ouverture=30,bg=df$bg,fg=df$fg,lwd=1)
François

François Bonnot
Messages : 537
Enregistré le : 10 Nov 2004, 15:19
Contact :

Re: Fonction pour assigner un angle à un point dans un graphique classique

Messagepar François Bonnot » 14 Avr 2020, 15:29

Autre idée (df est le même que ci-dessus) :

Code : Tout sélectionner

polyg4 <- function(xcenter,ycenter,radius,angle,ouverture=60,bg,fg,lwd=1) {
    angle <- angle*pi/180
    theta <- c(0,180-ouverture, 0, 180+ouverture)*pi/180
    ratio <- c(1,1,0,1)
    centers <- cbind(xcenter,ycenter)
    if (length(radius)==1) radius <- rep(radius,nrow(centers))
    for (i in 1:nrow(centers)) {
        x <- cos(theta+angle[i])*radius[i]*ratio ; x <- x-x[1]
        y <- sin(theta+angle[i])*radius[i]*ratio ; y <- y-y[1]
        polygon(centers[i,1]+x,centers[i,2]+y,border=fg[i],col=bg[i],lwd=lwd,density=-1)
        points(centers[i,1]+x[1],centers[i,2]+y[1],col="red",pch=16)
    }
}

polyg4(df$x,df$y,radius=df$radius,angle=df$angle,ouverture=30,bg=df$bg,fg=df$fg,lwd=1)
François

Anthony Sturbois
Messages : 38
Enregistré le : 07 Nov 2019, 07:49

Re: Fonction pour assigner un angle à un point dans un graphique classique

Messagepar Anthony Sturbois » 14 Avr 2020, 15:58

Merci Francois,
Bien vu avec polyg4!!!
depuis polyg3, la fonction ne me trace cependant qu'un triangle, le premier du vecteur, alors que tous les points rouges sont quant eux tracés.
Je compare par rapport à polyg2 qui prend le vecteur et je ne vois pas d’où ça vient.

J'aurai pu y penser pour le côté vecteur de couleur... mais maintenant c'est bon je retiens la leçon!

Pour info, en poursuivant mes recherches avant ta réponse je suis tombé sur la fonction filledmultigonal du package shape qui aurait pu offrir des solutions à mon problème une fois mise dans un boucle. Pour info, possibilité de renseigner un radius x et un radius y directement dans les arguments.

Merci encore et bonne soirée

Antò

Anthony Sturbois
Messages : 38
Enregistré le : 07 Nov 2019, 07:49

Re: Fonction pour assigner un angle à un point dans un graphique classique

Messagepar Anthony Sturbois » 14 Avr 2020, 16:20

C bon j'ai trouvé, j'étais resté sur une couleur unique,et maintenant il lui faut obligatoirement un vecteur.
Just perfect!


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité