![]() |
| |||||||
| S'inscrire | FAQ | Membres | Calendrier | Recherche | Messages du jour | Marquer les forums comme lus |
![]() |
| LinkBack | Outils de la discussion | Modes d'affichage |
| | ||||
| ||||
| |
| |||
| À (at) Tue, 8 Jan 2008 10:42:33 -0800 (PST), mbrassel <morgan.brassel***free.fr> écrivait (wrote): > J'utilise depuis peu tikz/pgf et je voulais savoir s'il existait un > moyen simple de tracer la normale a une courbe de Bezier (ou a des > objets comme ellipse ou parabola) en un point ? Ce n'est pas vraiment prévu dans TikZ mais, pour les courbes de Bezier, on peut ruser un peu. Voici trois exemples : \begin{tikzpicture}[allow upside down] \draw (0,0) .. controls +(left:2cm) and +(left:3cm) .. (1,1) node[sloped,above,pos=.6,minimum height=3cm](X){}; \draw[->] (X.south) -- (X.north); \end{tikzpicture} \begin{tikzpicture}[allow upside down] \draw (0,0) .. controls +(left:2cm) and +(left:3cm) .. (1,1) \foreach \p/\name in {0.4/A, 0.45/B, 0.5/C} { node[sloped,above,pos=\p,minimum height=3cm](\name){} }; \foreach \name in {A, B, C} { \draw[->] (\name.south) -- (\name.north); } \end{tikzpicture} \begin{tikzpicture}[allow upside down] \draw (0,0) .. controls +(right:2cm) and +(down:3cm) .. (5,0) \foreach \p in {0,0.02,...,1} { node[sloped,below,pos=\p,minimum height=1cm, after node path={(\tikzlastnode.south) -- (\tikzlastnode.north)} ](X){} }; \end{tikzpicture} Dans le dernier exemple, les tangentes font partie du chemin tracé, on ne peut donc pas leur ajouter de fioritures... Ce n'est évidemment pas complètement satisfaisant et il doit y avoir moyen de coder quelque chose de plus propre directement avec pgf mais je ne sais pas faire... et surtout j'ai la flemme de chercher. ;-) -- Paul Gaborit - <http://perso.enstimac.fr/~gaborit/> |
| |||
| On 9 jan, 02:33, Paul Gaborit <Paul.Gabo...***invalid.invalid> wrote: > À (at) Tue, 8 Jan 2008 10:42:33 -0800 (PST), > mbrassel <morgan.bras...***free.fr> écrivait (wrote): > > > J'utilise depuis peu tikz/pgf et je voulais savoir s'il existait un > > moyen simple de tracer la normale a une courbe de Bezier (ou a des > > objets comme ellipse ou parabola) en un point ? > > Ce n'est pas vraiment prévu dans TikZ mais, pour les courbes de > Bezier, on peut ruser un peu. > > Voici trois exemples : > > \begin{tikzpicture}[allow upside down] > \draw (0,0) .. controls +(left:2cm) and +(left:3cm) .. (1,1) > node[sloped,above,pos=.6,minimum height=3cm](X){}; > \draw[->] (X.south) -- (X.north); > \end{tikzpicture} > > \begin{tikzpicture}[allow upside down] > \draw (0,0) .. controls +(left:2cm) and +(left:3cm) .. (1,1) > \foreach \p/\name in {0.4/A, 0.45/B, 0.5/C} { > node[sloped,above,pos=\p,minimum height=3cm](\name){} > }; > > \foreach \name in {A, B, C} { > \draw[->] (\name.south) -- (\name.north); > } > \end{tikzpicture} > > \begin{tikzpicture}[allow upside down] > \draw > (0,0) .. controls +(right:2cm) and +(down:3cm) .. (5,0) > \foreach \p in {0,0.02,...,1} { > node[sloped,below,pos=\p,minimum height=1cm, > after node path={(\tikzlastnode.south) -- (\tikzlastnode.north)} > ](X){} > }; > \end{tikzpicture} > > Dans le dernier exemple, les tangentes font partie du chemin tracé, on > ne peut donc pas leur ajouter de fioritures... > > Ce n'est évidemment pas complètement satisfaisant et il doit y avoir > moyen de coder quelque chose de plus propre directement avec pgf mais > je ne sais pas faire... et surtout j'ai la flemme de chercher. ;-) > > -- > Paul Gaborit - <http://perso.enstimac.fr/~gaborit/> Merci pour votre reponse. Cette (astucieuse) solution me suffira amplement dans un premier temps ! Il me reste cependant une interrogation : est-il possible de faire varier la longueur des "normales" en fonction de leur position sur la courbe ? Ecrire, dans le dernier exemple, "minimum height=\p cm" module bien la longueur des traits, mais je voudrais pouvoir ecrire quelque chose comme "minimum height=\p * (1-\p) cm", qui ne passe pas a la compilation. Idealement, je voudrais que la longueur des normales soit fonction de la courbure, mais c'est peut-etre difficile... |
| |||
| À (at) Wed, 9 Jan 2008 01:02:44 -0800 (PST), mbrassel <morgan.brassel***free.fr> écrivait (wrote): > Il me reste cependant une interrogation : est-il possible de faire > varier la longueur des "normales" en fonction de leur position sur la > courbe ? Ecrire, dans le dernier exemple, "minimum height=\p cm" > module bien la longueur des traits, mais je voudrais pouvoir ecrire > quelque chose comme "minimum height=\p * (1-\p) cm", qui ne passe pas > a la compilation. Ça, c'est juste un problème de syntaxe pour les calculs et les unités en TikZ. En utilisant 'minimum height=\p * (1 - \p)*1cm', ça passe très bien. On voit apparaître un autre problème qui est que le node créé a une hauteur minimale imposée par le paramètre 'inner sep' par défaut. En ajoutant au node l'option 'inner sep=0cm', ça marche bien mieux. On arrive donc à : \begin{tikzpicture}[allow upside down] \draw (0,0) .. controls +(right:2cm) and +(down:3cm) .. (5,0) \foreach \p in {0,0.02,...,1} { node[ inner sep=0cm,sloped,below,pos=\p, minimum height=\p*(1-\p)*4cm, after node path={(\tikzlastnode.south) -- (\tikzlastnode.north)} ](X){} }; \end{tikzpicture} > Idealement, je voudrais que la longueur des normales soit fonction > de la courbure, mais c'est peut-etre difficile... C'est peut-être faisable mais certainement pas via l'astuce qu'on utilise ici. À moins que vous ne sachiez calculer vous-même le rayon de courbure au point \p et que vous décidiez quoi faire s'il est très grand voire infini... Il faut dire aussi qu'on sort un peu du cadre d'utilisation (actuelle) de TikZ. Des outils externes comme Asymptote ou PSTricks sont certainement plus en avance (actuellement) pour faire tout cela. -- Paul Gaborit - <http://perso.enstimac.fr/~gaborit/> |
| |||
| On 9 jan, 11:06, Paul Gaborit <Paul.Gabo...***invalid.invalid> wrote: > À (at) Wed, 9 Jan 2008 01:02:44 -0800 (PST), > mbrassel <morgan.bras...***free.fr> écrivait (wrote): > > > Il me reste cependant une interrogation : est-il possible de faire > > varier la longueur des "normales" en fonction de leur position sur la > > courbe ? Ecrire, dans le dernier exemple, "minimum height=\p cm" > > module bien la longueur des traits, mais je voudrais pouvoir ecrire > > quelque chose comme "minimum height=\p * (1-\p) cm", qui ne passe pas > > a la compilation. > > Ça, c'est juste un problème de syntaxe pour les calculs et les unités > en TikZ. En utilisant 'minimum height=\p * (1 - \p)*1cm', ça passe > très bien. On voit apparaître un autre problème qui est que le node > créé a une hauteur minimale imposée par le paramètre 'inner sep' par > défaut. En ajoutant au node l'option 'inner sep=0cm', ça marche bien > mieux. On arrive donc à : > > \begin{tikzpicture}[allow upside down] > \draw (0,0) .. controls +(right:2cm) and +(down:3cm) .. (5,0) > \foreach \p in {0,0.02,...,1} { > node[ > inner sep=0cm,sloped,below,pos=\p, > minimum height=\p*(1-\p)*4cm, > after node path={(\tikzlastnode.south) -- (\tikzlastnode.north)} > ](X){} > }; > \end{tikzpicture} > > > Idealement, je voudrais que la longueur des normales soit fonction > > de la courbure, mais c'est peut-etre difficile... > > C'est peut-être faisable mais certainement pas via l'astuce qu'on > utilise ici. À moins que vous ne sachiez calculer vous-même le rayon > de courbure au point \p et que vous décidiez quoi faire s'il est très > grand voire infini... > > Il faut dire aussi qu'on sort un peu du cadre d'utilisation (actuelle) > de TikZ. Des outils externes comme Asymptote ou PSTricks sont > certainement plus en avance (actuellement) pour faire tout cela. > > -- > Paul Gaborit - <http://perso.enstimac.fr/~gaborit/> Merci pour cette deuxieme reponse, je ne connaissais pas la manip pour les unites. Pour la courbure, je vais pouvoir me debrouiller sans. Ou bien effectivement je choisirai des exemples ou on la connait explicitement. Je me doutais que c'etait un peu du "hors-sujet" par rapport a l'utilisation classique de TikZ, mais je prefere quand-meme cette solution a PSTricks ou Asymptote. Merci encore pour votre disponibilite, et (sans doute) a bientot ! |
| |||
| On 9 jan, 17:28, mbrassel <morgan.bras...***free.fr> wrote: > On 9 jan, 11:06, Paul Gaborit <Paul.Gabo...***invalid.invalid> wrote: > > > > > À (at) Wed, 9 Jan 2008 01:02:44 -0800 (PST), > > mbrassel <morgan.bras...***free.fr> écrivait (wrote): > > > > Il me reste cependant une interrogation : est-il possible de faire > > > varier la longueur des "normales" en fonction de leur position sur la > > > courbe ? Ecrire, dans le dernier exemple, "minimum height=\p cm" > > > module bien la longueur des traits, mais je voudrais pouvoir ecrire > > > quelque chose comme "minimum height=\p * (1-\p) cm", qui ne passe pas > > > a la compilation. > > > Ça, c'est juste un problème de syntaxe pour les calculs et les unités > > en TikZ. En utilisant 'minimum height=\p * (1 - \p)*1cm', ça passe > > très bien. On voit apparaître un autre problème qui est que le node > > créé a une hauteur minimale imposée par le paramètre 'inner sep'par > > défaut. En ajoutant au node l'option 'inner sep=0cm', ça marche bien > > mieux. On arrive donc à : > > > \begin{tikzpicture}[allow upside down] > > \draw (0,0) .. controls +(right:2cm) and +(down:3cm) .. (5,0) > > \foreach \p in {0,0.02,...,1} { > > node[ > > inner sep=0cm,sloped,below,pos=\p, > > minimum height=\p*(1-\p)*4cm, > > after node path={(\tikzlastnode.south) -- (\tikzlastnode.north)} > > ](X){} > > }; > > \end{tikzpicture} > > > > Idealement, je voudrais que la longueur des normales soit fonction > > > de la courbure, mais c'est peut-etre difficile... > > > C'est peut-être faisable mais certainement pas via l'astuce qu'on > > utilise ici. À moins que vous ne sachiez calculer vous-même le rayon > > de courbure au point \p et que vous décidiez quoi faire s'il est très > > grand voire infini... > > > Il faut dire aussi qu'on sort un peu du cadre d'utilisation (actuelle) > > de TikZ. Des outils externes comme Asymptote ou PSTricks sont > > certainement plus en avance (actuellement) pour faire tout cela. > > > -- > > Paul Gaborit - <http://perso.enstimac.fr/~gaborit/> > > Merci pour cette deuxieme reponse, je ne connaissais pas la manip pour > les unites. Pour la courbure, je vais pouvoir me debrouiller sans. Ou > bien effectivement je choisirai des exemples ou on la connait > explicitement. > > Je me doutais que c'etait un peu du "hors-sujet" par rapport a > l'utilisation classique de TikZ, mais je prefere quand-meme cette > solution a PSTricks ou Asymptote. > > Merci encore pour votre disponibilite, et (sans doute) a bientot ! En fait, j'ai encore un detail a regler, et j'ai beau chercher depuis plusieurs heures, je n'y arrive pas... Je reprends le code de votre dernier exemple, mais j'aimerais ajouter une fleche aux normales tracees. Comme il n'y a qu'une seule commande draw, j'arrive au mieux a obtenir une fleche sur la derniere normale, mais pas sur toutes. Peut-on s'en sortir simplement ? Je m'excuse pour mon inexperience. J'ai sans doute mal saisi les mecanismes de path et node, malgre mes nombreuses lectures de la doc... |
| |||
| À (at) Wed, 9 Jan 2008 20:31:39 -0800 (PST), mbrassel <morgan.brassel***free.fr> écrivait (wrote): > En fait, j'ai encore un detail a regler, et j'ai beau chercher depuis > plusieurs heures, je n'y arrive pas... Je reprends le code de votre > dernier exemple, mais j'aimerais ajouter une fleche aux normales > tracees. Comme il n'y a qu'une seule commande draw, j'arrive au mieux > a obtenir une fleche sur la derniere normale, mais pas sur toutes. > Peut-on s'en sortir simplement ? J'avais prévenu : c'est de la bidouille et, comme vous avez pu le constater, il faut absolument séparer les commandes pour avoir des règlages indépendants. > Je m'excuse pour mon inexperience. J'ai sans doute mal saisi les > mecanismes de path et node, malgre mes nombreuses lectures de la > doc... On peut s'en sortir en nommant tous les noeuds : \begin{tikzpicture}[allow upside down] \draw[blue] (0,0) .. controls +(left:2cm) and +(left:3cm) .. (1,1) \foreach \p in {0,5,...,100} { node[sloped,inner sep=0cm,above,pos=\p*0.01,minimum height=\p*0.01cm] (Tan \p){} }; \foreach \p in {0,5,...,100} { \draw[->,red] (Tan \p.south) -- (Tan \p.north); } \end{tikzpicture} -- Paul Gaborit - <http://perso.enstimac.fr/~gaborit/> |
| |||
| À (at) Thu, 10 Jan 2008 11:05:03 +0100, Paul Gaborit <Paul.Gaborit***invalid.invalid> écrivait (wrote): > On peut s'en sortir en nommant tous les noeuds : [...] Pour le fun, voici un dernier exemple avec plusieurs segments de courbes et avec les tangentes et les normales (mais ce ne sont pas des vraies normales puisqu'elles ne restent toujours du même côté) : \begin{tikzpicture}[allow upside down] \draw[red,line width=1pt] (0,0) .. controls +(right:6cm) and +(left:4cm) .. (2,6) \foreach \p in {0,5,...,100} { node[sloped,inner sep=0cm,above,pos=\p*0.01, anchor=south west, minimum height=(10+\p)*0.03cm,minimum width=(10+\p)*0.03cm] (N \p){} } .. controls +(right:2cm) and +(right:3cm) .. (6,2) \foreach \p in {5,10,...,100} { node[sloped,inner sep=0cm,above,pos=\p*0.01, anchor=south west, minimum height=(110-\p)*0.03cm,minimum width=(110-\p)*0.03cm] (N2 \p){} } ; \foreach \p in {0,5,...,100} { \draw[-latex,blue] (N \p.south west) -- (N \p.north west); \draw[-latex,green!50!black] (N \p.south west) -- (N \p.south east); } \foreach \p in {5,10,...,100} { \draw[-latex,blue] (N2 \p.south west) -- (N2 \p.north west); \draw[-latex,green!50!black] (N2 \p.south west) -- (N2 \p.south east); } \end{tikzpicture} -- Paul Gaborit - <http://perso.enstimac.fr/~gaborit/> |
| |||
| On 10 jan, 11:36, Paul Gaborit <Paul.Gabo...***invalid.invalid> wrote: > À (at) Thu, 10 Jan 2008 11:05:03 +0100, > Paul Gaborit <Paul.Gabo...***invalid.invalid> écrivait (wrote):> On peut s'en sortir en nommant tous les noeuds : > > [...] > > Pour le fun, voici un dernier exemple avec plusieurs segments de > courbes et avec les tangentes et les normales (mais ce ne sont pas des > vraies normales puisqu'elles ne restent toujours du même côté) : > > \begin{tikzpicture}[allow upside down] > \draw[red,line width=1pt] (0,0) > .. controls +(right:6cm) and +(left:4cm) .. (2,6) > \foreach \p in {0,5,...,100} { > node[sloped,inner sep=0cm,above,pos=\p*0.01, > anchor=south west, > minimum height=(10+\p)*0.03cm,minimum width=(10+\p)*0.03cm] > (N \p){} > } > .. controls +(right:2cm) and +(right:3cm) .. (6,2) > \foreach \p in {5,10,...,100} { > node[sloped,inner sep=0cm,above,pos=\p*0.01, > anchor=south west, > minimum height=(110-\p)*0.03cm,minimum width=(110-\p)*0.03cm] > (N2 \p){} > } > ; > > \foreach \p in {0,5,...,100} { > \draw[-latex,blue] (N \p.south west) -- (N \p.north west); > \draw[-latex,green!50!black] (N \p.south west) -- (N \p.south east); > } > \foreach \p in {5,10,...,100} { > \draw[-latex,blue] (N2 \p.south west) -- (N2 \p.north west); > \draw[-latex,green!50!black] (N2 \p.south west) -- (N2 \p.south east); > } > \end{tikzpicture} > > -- > Paul Gaborit - <http://perso.enstimac.fr/~gaborit/> Une nouvelle fois merci, et surtout bravo ! Meme si c'est de la bidouille, ca reste tres astucieux... Je ne m'en serais jamais sorti par moi-meme. Et le resultat est precisement celui que je voulais obtenir. Pour avoir la normale du bon cote, je me contenterai d'un exemple ou la courbure ne change pas de signe. Ou bien je m'arrangerai pour que la courbe ait un point d'inflexion juste sur un des points donnes, et je changerai la seconde boucle pour inverser le sens des fleches. J'espere en tout cas ne pas avoir trop abuser de votre temps ! |
| |||
| On 10 jan, 11:36, Paul Gaborit <Paul.Gabo...***invalid.invalid> wrote: > À (at) Thu, 10 Jan 2008 11:05:03 +0100, > Paul Gaborit <Paul.Gabo...***invalid.invalid> écrivait (wrote):> On peut s'en sortir en nommant tous les noeuds : > > [...] > > Pour le fun, voici un dernier exemple avec plusieurs segments de > courbes et avec les tangentes et les normales (mais ce ne sont pas des > vraies normales puisqu'elles ne restent toujours du même côté) : > > \begin{tikzpicture}[allow upside down] > \draw[red,line width=1pt] (0,0) > .. controls +(right:6cm) and +(left:4cm) .. (2,6) > \foreach \p in {0,5,...,100} { > node[sloped,inner sep=0cm,above,pos=\p*0.01, > anchor=south west, > minimum height=(10+\p)*0.03cm,minimum width=(10+\p)*0.03cm] > (N \p){} > } > .. controls +(right:2cm) and +(right:3cm) .. (6,2) > \foreach \p in {5,10,...,100} { > node[sloped,inner sep=0cm,above,pos=\p*0.01, > anchor=south west, > minimum height=(110-\p)*0.03cm,minimum width=(110-\p)*0.03cm] > (N2 \p){} > } > ; > > \foreach \p in {0,5,...,100} { > \draw[-latex,blue] (N \p.south west) -- (N \p.north west); > \draw[-latex,green!50!black] (N \p.south west) -- (N \p.south east); > } > \foreach \p in {5,10,...,100} { > \draw[-latex,blue] (N2 \p.south west) -- (N2 \p.north west); > \draw[-latex,green!50!black] (N2 \p.south west) -- (N2 \p.south east); > } > \end{tikzpicture} > > -- > Paul Gaborit - <http://perso.enstimac.fr/~gaborit/> Une nouvelle fois merci, et surtout bravo ! Meme si c'est de la bidouille, ca reste tres astucieux... Je ne m'en serais jamais sorti par moi-meme. Et le resultat est precisement celui que je voulais obtenir. Pour avoir la normale du bon cote, je me contenterai d'un exemple ou la courbure ne change pas de signe. Ou bien je m'arrangerai pour que la courbe ait un point d'inflexion juste sur un des points donnes, et je changerai la seconde boucle pour inverser le sens des fleches. J'espere en tout cas ne pas avoir trop abuser de votre temps ! |
| |
| |
![]() |
| Tags: courbe, normale, tikzpgf |
| Outils de la discussion | |
| Modes d'affichage | |
| |
| ||||
| Discussion | Auteur | Forum | Réponses | Dernier message |
| [tikz/pgf] Gouraud shading | P.Fradin | Newsgroup fr.comp.text.tex | 8 | 12/05/2008 12h58 |
| Re: Y a t-il une réaction normale du peuple, avec un Bernard Thibault impliqué ? | Rolex | Newsgroup fr.soc.politique | 0 | 22/03/2008 22h15 |
| Re: tikz / [frenchb]babel bug | Tristram Gräbener | Newsgroup fr.comp.text.tex | 3 | 13/12/2007 14h07 |
| pb tikz beamer | Thomaspantalacci311@hotmail.com | Newsgroup fr.comp.text.tex | 3 | 12/12/2007 05h38 |
| rech a apprendre a dessiner avec l' outil "courbe de bezier" | Alfred Wallace | Newsgroup fr.comp.applications.libres | 4 | 26/05/2006 14h13 |