Gradients

Pour proposer des idées, ou simplement discuter

Gradients

Messagepar P.Fradin » 24 Déc 2009 11:38

Suite à une suggestion d'Alphonse, voici une macro pour dessiner une ligne avec une couleur variant " continûment":

Code: Tout sélectionner
{gradLine( <liste>, [options])
options:
        colorA, colorB: couleur début et fin
        close:
}
[$L:=%1,
 colorA:=Color, colorB:=white, close:=0,
 SaveAttr(), $aux:=%2 {options},
 $B:=L[1],  if close then Insert(L,B) fi,
 L':=[for z in L[2,0] do  {découpage par millimètre}
         $A:=B, $B:=z, $d:=Abs(B-A),
         N:= Ent(d*10) {en mm}, $u:=(B-A)/d/10,
         for $k from 0 to N do A+k*u od
      od, B],
 $N:=Nops(L'), $B:=L'[1], $k:=0,
 for z in L'[2,0] do   {dessin des tronçons}
    $A:=B, $B:=z, Inc(k,1),
    Color:=MixColor(colorA, (N-k-1)/(N-2), colorB, (k-1)/(N-2)),
    Seg(A, B),
 od,
 RestoreAttr()
]


Exemple:

Code: Tout sélectionner
[
view(-5,5,-1.5,1.5), Marges(0,0,0,0), size(8),
Axes(0,1+i), ForMinToMax:=1, L:=Get(Cartesienne(sin(x))),
Width:=12,
gradLine(L, [colorA:=blue, colorB:=yellow])
]


gradLines.png
gradLines.png (6.11 Kio) Consulté 15705 fois


gradLines.teg
(1.35 Kio) Téléchargé 783 fois
P.Fradin
Avatar de l’utilisateur
P.Fradin
Administrateur du site
 
Messages: 1887
Inscription: 29 Oct 2008 15:04

Re: Gradients

Messagepar P.Fradin » 30 Déc 2009 00:36

J'ai poussé plus loin la réflexion sur la manière de faire également des remplissages avec un gradient, je me suis limité aux gradients de types: horizontal, ou vertical ou radial. Cela pourrait faire l'objet d'un modèle. J'ai joint un fichier contenant les macros qui permettent ce type de remplissage avec un export spécifique pour tikz et pgf (pour commencer).

Exemple d'élément graphique Utilisateur:

Code: Tout sélectionner
[
view(-4.5,4.5,-2.5,4.5), Marges(0,0,0,0), size(10),
plan:=[M(0,0,-3),vecK],
LineStyle:=noline,
gradFill( Ligne([Xmin+i*Ymin,Xmax+i*Ymin,Xmax+i*Ymax,Xmin+i*Ymax],1),
          [colorA:=white, colorB:=pink, gradtype:=vertical]),
LineStyle:=solid,
gradFill( Cercle(-3+3*i,1),
          [colorA:=white, colorB:=steelblue, gradtype:=radial]),
tMin:=-3, tMax:=3,
gradFill(
         domaine1(4*exp(-x*x),-1,1),
         [colorA:=white, colorB:=lightgray, gradtype:=horizontal]),
axes(0,1+i), Width:=0.5*mm,
gradLine( Cartesienne(4*exp(-x*x)),
          [colorA:=yellow, colorB:=darkgreen])
]


EssaiGradient.png
EssaiGradient.png (18.42 Kio) Consulté 15679 fois


Le fichier source:

La macro de clipping Clip2d( liste, forme fermée convexe, close(0/1)) sera codée en dur dans la version 1.95 afin d'accélérer le dessin. Ce fichier est juste un test, il y a sûrement beaucoup à améliorer.

gradients.mac
(11.64 Kio) Téléchargé 758 fois
P.Fradin
Avatar de l’utilisateur
P.Fradin
Administrateur du site
 
Messages: 1887
Inscription: 29 Oct 2008 15:04

Re: Gradients

Messagepar Alphonse Capriani » 30 Déc 2009 00:56

Parfait : Je test tout ca la semaine prochaine...

Bonne Année!!!
Ya Ba Da Ba Dooo!!!
Avatar de l’utilisateur
Alphonse Capriani
 
Messages: 576
Inscription: 18 Juil 2009 19:10
Localisation: East Harlem - NY

Re: Gradients

Messagepar Alphonse Capriani » 02 Jan 2010 03:14

Ouais! En fait, je vais même tester ca demain et je te donne mes imprssions lundi (voire pendant le week-end si j'ai accs à Internet)
Ya Ba Da Ba Dooo!!!
Avatar de l’utilisateur
Alphonse Capriani
 
Messages: 576
Inscription: 18 Juil 2009 19:10
Localisation: East Harlem - NY

Re: Gradients

Messagepar Alphonse Capriani » 02 Jan 2010 18:55

Je viens de tester ton fichier et je dois admettre que c'est vraiment bien!!

Il y a quand même deux choses qui me chagrinent.

La première concerne le premier argument de tes macros gradFill et gradLine : il s'agit d'une commande graphique ce qui pour moi est assez déroutant!! Je pense qu'une liste de complexe serait peut êt(re plus approprié et moins lourd que la syntaxe actuelle. T'en penses quoi?

La deuxième remarque concerne la valeur de la variable globale "radial". En fait je ne comprends pas vraiment à quoi elle sert. Je l'ai modifié, mais j'ai pas vu de changement (c'est peut être du a une erreur de manipulation de ma part : ce serait pas la première fois :roll: )
Ya Ba Da Ba Dooo!!!
Avatar de l’utilisateur
Alphonse Capriani
 
Messages: 576
Inscription: 18 Juil 2009 19:10
Localisation: East Harlem - NY

Re: Gradients

Messagepar P.Fradin » 02 Jan 2010 20:56

Salut Alphonse!

Alphonse Capriani a écrit:Je viens de tester ton fichier et je dois admettre que c'est vraiment bien!!


Merci!

Il y a quand même deux choses qui me chagrinent.
La première concerne le premier argument de tes macros gradFill et gradLine : il s'agit d'une commande graphique ce qui pour moi est assez déroutant!! Je pense qu'une liste de complexe serait peut être plus approprié et moins lourd que la syntaxe actuelle. T'en penses quoi?


C'est beaucoup plus puissant ainsi! Et cela me paraît plus naturel aussi... La différence par rapport aux attributs classiques c'est qu'on englobe la commande graphique dans une commande:

Code: Tout sélectionner
 gradFill(
   Ligne([0,2,1+2*i],1),
   [colorA:=blue, colorB:=yellow, gradstyle:=vertical]) 


Si tout cela était codé en interne on écrirait quelque chose comme:

Code: Tout sélectionner
FillStyle:=verticalgrad, begingrad:=blue, endgrad:=yellow,  Ligne([0,2,1+2*i],1)


Est-ce vraiment si différent?

La deuxième remarque concerne la valeur de la variable globale "radial". En fait je ne comprends pas vraiment à quoi elle sert. Je l'ai modifié, mais j'ai pas vu de changement (c'est peut être du a une erreur de manipulation de ma part : ce serait pas la première fois :roll: )


radial est destiné à devenir une constante, au même titre de vertical et horizontal.
P.Fradin
Avatar de l’utilisateur
P.Fradin
Administrateur du site
 
Messages: 1887
Inscription: 29 Oct 2008 15:04

Re: Gradients

Messagepar Alphonse Capriani » 02 Jan 2010 22:01

Pour la syntaxe, je me doutait que c'était plus puissant ou efficace de procéder de cette manière! C'est vrai qu'au final, ca change rien, mais ce qui m'a dérouté initialement c'est la modification d'un attribut via une macro et non plus grâce à une affectation.

En ce qui concerne la variable "radial", je m'excuse pour la question idiote!!! J'avais pas vu les autres variables vertical, ... et j'avais pas réfléchi. La prochaine fois, j'essaierai de dormir plus de 3 heure la nuit avant que je poste un message : ca m'évitera peut être ce genre d'idiotie!!!

En espérant ne pas faire une suggestion aussi débile que ma précédente question, je te propose de trouver un moyen de modifier le centre des cercles concentriques utilisés en mode radial. Si je ne me trompe pas, dans la version actuelle, ce centre est situé dans le "coin" supérieurgauche, mais il pourrait être intéressant de le placerà un autre endroit comme au centre de gravité de la figure que l'on veut dessiner, non?
Ya Ba Da Ba Dooo!!!
Avatar de l’utilisateur
Alphonse Capriani
 
Messages: 576
Inscription: 18 Juil 2009 19:10
Localisation: East Harlem - NY

Re: Gradients

Messagepar P.Fradin » 02 Jan 2010 22:21

Alphonse Capriani a écrit:Pour la syntaxe, je me doutait que c'était plus puissant ou efficace de procéder de cette manière! C'est vrai qu'au final, ca change rien, mais ce qui m'a dérouté initialement c'est la modification d'un attribut via une macro et non plus grâce à une affectation.


Je n'ai pas le choix car je code en externe via des macros. En fait ce qui m'interesserait par la suite c'est une macro unique du genre draw() qui s'appliquerait à tout par le jeu des options.

En espérant ne pas faire une suggestion aussi débile que ma précédente question, je te propose de trouver un moyen de modifier le centre des cercles concentriques utilisés en mode radial. Si je ne me trompe pas, dans la version actuelle, ce centre est situé dans le "coin" supérieurgauche, mais il pourrait être intéressant de le placerà un autre endroit comme au centre de gravité de la figure que l'on veut dessiner, non?


Oui c'est envisageable, en adoptant le principe que la boundingbox de la forme est [0,1]X[0,1] (sans forcément la même unité sur les deux axes), le centre serait alors un complexe xc+i*yc avec xc et yc dans [0,1]. Actuellement xc=0.25 et yc=0.75.

J'ai ajouté un export svg, pstricks et eps. Je posterai une mise à jour prochainement.
P.Fradin
Avatar de l’utilisateur
P.Fradin
Administrateur du site
 
Messages: 1887
Inscription: 29 Oct 2008 15:04

Re: Gradients

Messagepar Alphonse Capriani » 06 Jan 2010 18:03

Nickel!!

C'est du bon boulot!!!
Ya Ba Da Ba Dooo!!!
Avatar de l’utilisateur
Alphonse Capriani
 
Messages: 576
Inscription: 18 Juil 2009 19:10
Localisation: East Harlem - NY

Re: Gradients

Messagepar P.Fradin » 06 Jan 2010 18:43

Salut Alphonse,

Je l'ai dit mais je ne l'avais pas encore fait! Donc je mets en ligne le fichier en question: gradients.mac, toujours à l'essai. Les deux macros essentielles sont:

1) gradFill( <commande graphique>, [options])
options:
colorA, colorB: couleurs
gradtype := radial/vertical/horizontal
radialcenter := xc+i*yc avec xc et yc dans [0;1]
frenchBabel := 0/1 (1 par défaut)

Cette macro exécute la commande graphique ( c'est à dire le dessin) et effectue un remplissage de celui-ci avec un gradient de 2 couleurs: de la couleur A vers la couleur B. Il y a trois types de gradient: horizontal (gauche vers droite), vertical (haut vers bas) et radial (centre vers extérieur). Les exports prévus sont: tikz, pgf, pstricks, eps et svg (et donc pdf, pdfc).

L'option frenchBabel sert uniquement aux exports tikz et pgf (une incompatiblité avec l'option french de Babel oblige à désactiver les caractères actifs, puis à les réactiver ensuite).

L'export pstricks exige le package pst-slpe.

2) gradLine( <commande graphique>, [options])
options:
colorA, colorB: couleur début et fin
close: 0/1 (0 par défaut)

Excécute la commande graphique et trace les traits avec un gradient de 2 couleurs.

Exemple:

Code: Tout sélectionner
[
view(-5,4.5,-2.5,5), Marges(0,0,0,0), size(10,1),
plan:=[M(0,0,-3),vecK],
LineStyle:=noline,
gradFill( Path([Xmin+i*Ymin,Xmax+i*Ymin,Xmax+i*Ymax,Xmin+i*Ymax,line]),
               [colorA:=white, colorB:=red, gradtype:=vertical]),
LineStyle:=solid,
gradFill( Ligne([-5+i,-2+i,-2+5*i],1),   [radialcenter:=0.75+i*0.25, colorA:=white, colorB:=steelblue, gradtype:=radial]),
tMin:=-3, tMax:=3,
gradFill(  domaine1(4*exp(-x*x),-1,1),   [colorA:=white, colorB:=gray, gradtype:=horizontal]),
Axes(0,1+i), Width:=0.5*mm,
gradLine( Cartesienne(4*exp(-x*x)),   [colorA:=yellow, colorB:=darkgreen])
]


gradients.png
gradients.png (23.41 Kio) Consulté 15580 fois


gradients.mac
(11.64 Kio) Téléchargé 725 fois
P.Fradin
Avatar de l’utilisateur
P.Fradin
Administrateur du site
 
Messages: 1887
Inscription: 29 Oct 2008 15:04

Re: Gradients

Messagepar Alphonse Capriani » 08 Jan 2010 16:11

Nickel!! Je regarde ca tout de suite...

(Par contre, je te suggère de mettre le lien de téléchargement dans ton premier post pour éviter de télécharger le mauvais...) :lol:
Ya Ba Da Ba Dooo!!!
Avatar de l’utilisateur
Alphonse Capriani
 
Messages: 576
Inscription: 18 Juil 2009 19:10
Localisation: East Harlem - NY

Re: Gradients

Messagepar P.Fradin » 08 Jan 2010 16:22

Alphonse Capriani a écrit:(Par contre, je te suggère de mettre le lien de téléchargement dans ton premier post pour éviter de télécharger le mauvais...) :lol:


Arf! J'avais oublié! Merci.
P.Fradin
Avatar de l’utilisateur
P.Fradin
Administrateur du site
 
Messages: 1887
Inscription: 29 Oct 2008 15:04

Re: Gradients

Messagepar Alphonse Capriani » 08 Jan 2010 16:24

Pas de problème!!!

T'as prévu un pdf concernant ce fichier?
Ya Ba Da Ba Dooo!!!
Avatar de l’utilisateur
Alphonse Capriani
 
Messages: 576
Inscription: 18 Juil 2009 19:10
Localisation: East Harlem - NY

Re: Gradients

Messagepar P.Fradin » 08 Jan 2010 16:35

Alphonse Capriani a écrit:T'as prévu un pdf concernant ce fichier?


Pour l'instant non, c'est un galop d'essai.
P.Fradin
Avatar de l’utilisateur
P.Fradin
Administrateur du site
 
Messages: 1887
Inscription: 29 Oct 2008 15:04


Revenir vers Propositions - Discussions

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 5 invités

cron