[Résolu] Récupérer les arguments de size

Tout ce qui concerne l'utilisation ou l'installation d'Asymptote.

Modérateur: gdm_asy

Règles du forum
Merci d'éviter le style SMS dans vos messages et de penser à utiliser la fonction Recherche avant de poster un message. Pour joindre des fichiers à vos messages, consulter ce sujet.
> Penser à utiliser les balises Code pour poster du code.

Re: [Asymptote] Récupérer les arguments de size

Messagepar chellier » Mardi 16 Février 2010, 12:44

GMaths a écrit:C'est justement l'avantage !! tracer des path/segments correspondant aux intervalles de solutions.

Et, puis en revoyant ce que proposait Olivier initialement, on peut gérer la couleur des crochets et tu peux mettre le chemin en couleur "invisible" si tu préfères.


Oui, c'est vrai. En fait au départ je n'avais pas vu la chose comme ça.
Problème des crochets réglé. 8) ... Mais par contre pour tracer un segment d'une longueur insensible à size ou unitsize :?: (j'en ai pas vraiment besoin, c'est juste pour faire avancé... euh je sais pas quoi :mrgreen: )
chellier
Modérateur
 
Messages: 355
Inscription: Samedi 25 Juillet 2009, 11:25
Localisation: Le Creusot
Statut actuel: Actif et salarié | Enseignant

Publicité

Re: [Asymptote] Récupérer les arguments de size

Messagepar GMaths » Mardi 16 Février 2010, 13:56

chellier a écrit:Mais par contre pour tracer un segment d'une longueur insensible à size ou unitsize :?: (j'en ai pas vraiment besoin, c'est juste pour faire avancé... euh je sais pas quoi :mrgreen: )


Je t'ai déjà donné le truc ! Un exemple plus démonstratif :

Code: Tout sélectionner
% !TEX TS-program = pdflatex
% !TEX encoding = Latin1
\documentclass[11pt]{article}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[a4paper,%
            hmargin={1cm,1cm},%
            vmargin={1cm,1cm},%
            headheight=15pt,%
            nohead,nofoot]{geometry}
\usepackage{fourier}   
\usepackage[francais]{babel}
\usepackage{graphicx}
\usepackage{amsmath,amsfonts}   
\setlength{\parindent}{0pt}
\usepackage{asymptote}   
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}

\section{premier essai avec unitsize(1cm)}

\begin{asy}

unitsize(1cm);
path rec=box((0,0),(5,2));
draw(rec,blue);

picture pic; unitsize(pic,.5cm);
draw(pic,rec,red);
add(pic.fit());
\end{asy}

\section{deuxième essai avec unitsize(2cm)}

\begin{asy}
unitsize(2cm);
path rec=box((0,0),(5,2));
draw(rec,blue);

picture pic; unitsize(pic,.5cm);
draw(pic,rec,red);
add(pic.fit());
\end{asy}

\section{troisième essai avec size(4cm)}

\begin{asy}
size(4cm);
path rec=box((0,0),(5,2));
draw(rec,blue);

picture pic; unitsize(pic,.5cm);
draw(pic,rec,red);
add(pic.fit());
\end{asy}

\section{quatrième essai avec size(6cm)}

\begin{asy}
size(6cm);
path rec=box((0,0),(5,2));
draw(rec,blue);

picture pic; unitsize(pic,.5cm);
draw(pic,rec,red);
add(pic.fit());
\end{asy}

\section{Conclusion}

\Large Dans les quatre cas, le rectangle rouge a les mêmes dimensions : 5x0,5 cm sur 2x0,5cm !

\end{document}


longueur_independante_de_size_unitsize.pdf
(31.75 Kio) Téléchargé 88 fois
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: [Asymptote] Récupérer les arguments de size

Messagepar OG » Mardi 16 Février 2010, 14:56

Bonjour

On peut aussi spécifier la longueur du segment dans le code
Code: Tout sélectionner
size(100,0);
draw((0,0)--(1,0));
picture pic;
draw(pic,scale(1cm)*((0,0)--(1,0))); // segment de 1cm
add(pic,(0,1)); //ajouter à la "current picture" position (0,1)


Pour les crochets j'espère que c'est réglé. Par contre pour les hachures
je suppose que tu vas revenir à la charge dans peu de temps.

O.G.
OG
Modérateur
 
Messages: 2285
Inscription: Lundi 12 Mars 2007, 11:20
Localisation: Rouen
Statut actuel: Actif et salarié | Maître de conférence

Re: [Asymptote] Récupérer les arguments de size

Messagepar GMaths » Mardi 16 Février 2010, 15:15

OG a écrit:On peut aussi spécifier la longueur du segment dans le code
Code: Tout sélectionner
size(100,0);
draw((0,0)--(1,0));
picture pic;
draw(pic,scale(1cm)*((0,0)--(1,0))); // segment de 1cm
add(pic,(0,1)); //ajouter à la "current picture" position (0,1)

N'est ce pas plutôt comme ci-dessous ? A vérifier.

Code: Tout sélectionner
size(100,0);
draw((0,0)--(1,0));
picture pic;
draw(pic,scale(1cm)*((0,0)--(1,0))); // segment de 1cm
add(pic.fit(),(0,1)); //ajouter à la "current picture" position (0,1)
Dernière édition par GMaths le Mardi 16 Février 2010, 22:07, édité 1 fois.
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: [Asymptote] Récupérer les arguments de size

Messagepar chellier » Mardi 16 Février 2010, 15:17

Ça y est j'ai compris :D Comme vous avez pu le constater, je comprends vite, mais faut m'expliquer longtemps :wink:

J'ai résolu mon problème comme ça :
Code: Tout sélectionner
import graph;

size(6*cm,0);
//unitsize(1*cm);

int lsol=0, rsol=1;

void solaxis(string a="",
        real sol,      
        int dirsol,
        string crochet,
        pen couleur=currentpen,
        real xMin=sol-3, real xMax=sol+3,
        ticks ticks=Ticks(),
        real ech=1)
{
// Placer la "borne solution" sur l'axe
  label(Label(a,couleur),(sol,0),3.5*N);
// Tracé de l'axe
  xlimits(min=xMin,max=xMax);
  xaxis(Label("$x$",align=N),ticks,Arrow);
////////// C'est ici que tout se passe ///////////
// Crochet
picture pic; unitsize(pic,1cm);
if (crochet=="]"){
   draw(pic,(-.2,-.3)--(0,-.3)--(0,.3)--(-.2,.3),1.5*bp+couleur);}
  else {
   draw(pic,(.2,-.3)--(0,-.3)--(0,.3)--(.2,.3),1.5*bp+couleur);}

add(pic.fit(),(sol,0));  // C'est ce (sol,0) qui me manquait pour avoir le crochet au bon endroit
///////////////////////////////////////////
// Solutions en couleur
  if (dirsol==0){draw((sol,0)--(xMin,0),1.5*bp+couleur);}
  else {draw((sol,0)--(xMax,0),1.5*bp+couleur);}

}

solaxis("$\frac{3}{2}$",1.5,rsol,"]",.8*red,1,2,Ticks());


Le crochet est bien insensible à size et sa couleur est indépendante de la couleur "solutions" :D

Pour les hachures, je pense que je doit pouvoir procéder comme ça aussi, mais si ça va pas, vous inquiétez pas, je viendrai vous déranger :wink:

Merci beaucoup pour l'aide et la patience :D

Christophe
chellier
Modérateur
 
Messages: 355
Inscription: Samedi 25 Juillet 2009, 11:25
Localisation: Le Creusot
Statut actuel: Actif et salarié | Enseignant

Re: [Asymptote] Récupérer les arguments de size

Messagepar chellier » Mercredi 17 Février 2010, 12:43

Bonjour,
OG a écrit:Par contre pour les hachures
je suppose que tu vas revenir à la charge dans peu de temps.
O.G.


Bien vu OG :wink: mais pour donner un semblant de solution 8)
J'ai réussi à répondre au sujet de ce post : Récupérer les arguments de size
D'après ce que j'ai compris, si size est utilisé, currentpicture.xunitsize est nul. et si unitsize est utilisé, alors c'est currentpicture.xsize qui est nul.

Le problème est de pouvoir dessiner un rectangle dont une dimension dépende de la largeur finale de la figure, mais dont l'autre dimension soit insensible aux changements d'échelle.
Donc voila mon "semblant de solution" :
Code: Tout sélectionner
import graph;

//size(10cm,0);
unitsize(2cm);

real xMin=-2.5,xMax=3;
xlimits(min=xMin,max=xMax);
xaxis(Label("$x$",align=N),Ticks(),Arrow);

real xpic=currentpicture.xsize/cm; //vaut 10 pour size(10cm,0) et 0 si unitsize
real dy; //demi-largeur du rectangle

if (currentpicture.xsize!=0){dy=.2*(xMax-xMin)/xpic;}
else {dy=.2/(currentpicture.xunitsize/cm);}

filldraw((-1,-dy)--(2,-dy)--(2,dy)--(-1,dy)--cycle,gray,bp+black);


Bon, il reste quand même un tout petit soucis :( : La dimension qui ne devrait pas bouger reste quand même sensible si on utilise par exemple shipout(bbox(5mm,invisible)) (la largeur de la figure finale n'est pas changée, mais le dessin lui est modifé légèrement, normal !). Ça reste tout de même acceptable, mais ce n'est pas... "parfait".

Christophe, qui progresse lentement dans les subtilités d'asymptote. Mais quel formidable outil !
chellier
Modérateur
 
Messages: 355
Inscription: Samedi 25 Juillet 2009, 11:25
Localisation: Le Creusot
Statut actuel: Actif et salarié | Enseignant

Re: [Résolu][Asymptote] Récupérer les arguments de size

Messagepar Ph. Ivaldi » Jeudi 18 Février 2010, 14:11

Bonjour,

J'arrive un peu après la bataille et j'avoue que j'ai lu le fil en diagonale.
N'est-ce pas du « deferred drawing » que vous cherchez à faire.
Voici ce que je propose, à tout hasard
Code: Tout sélectionner
size(10cm,0);
// unitsize(2cm);

real h=1cm, l=5;

real operator *(transform t, explicit real x){return xpart(t*(x,0));}
real operator *(transform t, explicit int x){return xpart(t*(x,0));}

currentpicture.add(new void(frame f, transform t, transform, pair m, pair M) {
    transform it=inverse(t);
    filldraw((-l/2,it*-h/2)--(l/2,it*-h/2)--(l/2,it*h/2)--(-l/2,it*h/2)--cycle,gray,bp+black);
  });


real lp=l/1.5;
draw((-lp,0)--(lp,0),red);
draw((-lp,-lp)--(lp,lp),blue);

shipout(bbox(1cm,0.7*yellow));


La hauteur du rectangle fera toujours 1cm, quelques soit les unités utilisées.
Ph. Ivaldi
Méga-utilisateur
 
Messages: 267
Inscription: Vendredi 12 Janvier 2007, 23:27
Statut actuel: Actif et salarié

Re: [Résolu][Asymptote] Récupérer les arguments de size

Messagepar chellier » Jeudi 18 Février 2010, 14:38

Bonjour,
Ah ben oui, c'est bien ça...
Mais alors là, je risquais pas de trouver tout seul :shock: :shock: :shock:
chellier
Modérateur
 
Messages: 355
Inscription: Samedi 25 Juillet 2009, 11:25
Localisation: Le Creusot
Statut actuel: Actif et salarié | Enseignant

Re: [Résolu][Asymptote] Récupérer les arguments de size

Messagepar GMaths » Jeudi 18 Février 2010, 15:01

chellier a écrit:Mais alors là, je risquais pas de trouver tout seul :shock: :shock: :shock:
Je te rassure : moi, non plus, je n'aurais pas pu pondre cela. :mrgreen:
Par contre, j'avais une autre idée (non testée - et que je testerai plus tard) pour le problème posé.

Code: Tout sélectionner
J'arrive un peu après la bataille et j'avoue que j'ai lu le fil en diagonale.
N'est-ce pas du « deferred drawing » que vous cherchez à faire.


On apprécie toujours ton passage pour nous montrer des trucs sortis de je ne sais où. :mrgreen:

Philippe, à propos de ton code, je me pose deux questions :

  • Je suis surpris par cela :
    currentpicture.add(new void(frame f, transform t, transform, pair m, pair M)
  • Pourquoi ces deux déclarations :
    Code: Tout sélectionner
        real operator *(transform t, explicit real x){return xpart(t*(x,0));}
        real operator *(transform t, explicit int x){return xpart(t*(x,0));}
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: [Résolu][Asymptote] Récupérer les arguments de size

Messagepar Ph. Ivaldi » Jeudi 18 Février 2010, 17:46

GMaths a écrit:
chellier a écrit:Mais alors là, je risquais pas de trouver tout seul :shock: :shock: :shock:
Je te rassure : moi, non plus, je n'aurais pas pu pondre cela. :mrgreen:


Vous me faites bien rire avec ces smileys. :P
En fait, il suffit de regarder le code source de plain_picture.asy pour trouver (ou math.asy éventuellement geometry.asy ;-) )

GMaths a écrit:Je suis surpris par cela :
currentpicture.add(new void(frame f, transform t, transform, pair m, pair M)



Quel pinailleur ce Gaétan ;-)
C'est juste un copier/coller vite fait. Pour être vraiment précis il faudrait écrire
Code: Tout sélectionner
currentpicture.add(new void(frame, transform t, transform, pair, pair) {

Je te laisse aussi le soin de tester ce code de haut vol:
Code: Tout sélectionner
real toto(real){return pi;}
write(toto(0));


GMaths a écrit:Pourquoi ces deux déclarations :
Code: Tout sélectionner
    real operator *(transform t, explicit real x){return xpart(t*(x,0));}
    real operator *(transform t, explicit int x){return xpart(t*(x,0));}

Si tu les supprimes ça plante parce t*real donne un pair par polymorphisme de real vers pair avant application de t (ça en jette hein) et donc (t*real,real) ça le fait pas.
D'ailleurs…
Code: Tout sélectionner
write(scale(2)*3);

…donne (6,0).
Donc mes « operators » fixe le comportement de t*real et t*int.
Et donc…
Code: Tout sélectionner
real operator *(transform t, explicit real x){return xpart(t*(x,0));}
real operator *(transform t, explicit int x){return xpart(t*(x,0));}
write(scale(2)*3);

…donne 6.
Ph. Ivaldi
Méga-utilisateur
 
Messages: 267
Inscription: Vendredi 12 Janvier 2007, 23:27
Statut actuel: Actif et salarié

Re: [Résolu][Asymptote] Récupérer les arguments de size

Messagepar GMaths » Jeudi 18 Février 2010, 22:39

Pas le temps maintenant... mais j'étudierai cela de près Philippe... tu peux en être sûr...
(tu peux en être sûr... car Olivier ne va pas oublier de me relancer pour la série d'exemples sur le "deferred drawing". :lol: )
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: [Résolu][Asymptote] Récupérer les arguments de size

Messagepar GMaths » Jeudi 18 Février 2010, 23:52

Ph. Ivaldi a écrit:Je te laisse aussi le soin de tester ce code de haut vol:
Code: Tout sélectionner
real toto(real){return pi;}
write(toto(0));


Docile, j'ai essayé (en me demandant où tu voulais en venir)... et je n'ai rien obtenu de surprenant : c'était une blague ? :mrgreen:
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: [Résolu][Asymptote] Récupérer les arguments de size

Messagepar Ph. Ivaldi » Vendredi 19 Février 2010, 00:10

Non, ce n'est pas une blague.
Je tentais de lever ton étonnement:
Je suis surpris par cela : currentpicture.add(new void(frame f, transform t, transform, pair m, pair M)

Je pensais que l'absence de variable dans le deuxième « transform » t'avait troublé, en tout cas je trouve que c'est troublant.
Finalement c'est quoi le problème ? :D
Ph. Ivaldi
Méga-utilisateur
 
Messages: 267
Inscription: Vendredi 12 Janvier 2007, 23:27
Statut actuel: Actif et salarié

Re: [Résolu][Asymptote] Récupérer les arguments de size

Messagepar GMaths » Vendredi 19 Février 2010, 00:12

Ph. Ivaldi a écrit:Non, ce n'est pas une blague.
Je tentais de lever ton étonnement:
Je suis surpris par cela : currentpicture.add(new void(frame f, transform t, transform, pair m, pair M)

Je pensais que l'absence de variable dans le deuxième « transform » t'avait troublé, en tout cas je trouve que c'est troublant.
Finalement c'est quoi le problème ? :D


Bien sûr que je trouve troublant l'absence de variable... surtout que j'avais l'impression que currentpicture.add(new void(frame f, transform t) suffit

mais ce que je n'ai pas compris depuis, c'est le rapport avec toto ! :lol:
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: [Résolu][Asymptote] Récupérer les arguments de size

Messagepar GMaths » Vendredi 19 Février 2010, 00:16

GMaths a écrit:mais ce que je n'ai pas compris depuis, c'est le rapport avec toto ! :lol:

Je viens de regarder à nouveau l'exemple de toto et j'ai compris que tu voulais expliquer que l'on peut avoir :

Code: Tout sélectionner
real toto(real){return pi;}
write(toto(0));

au lieu de
Code: Tout sélectionner
real toto(real x){return pi;}
write(toto(0));


Mais je trouve cela différent de l'autre exemple.
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: [Résolu][Asymptote] Récupérer les arguments de size

Messagepar Ph. Ivaldi » Vendredi 19 Février 2010, 00:21

GMaths a écrit:surtout que j'avais l'impression que currentpicture.add(new void(frame f, transform t) suffit

Oui, ça suffit. J'ai l'habitude (façon de parler) d'utiliser l'autre, c'est tout.
Ph. Ivaldi
Méga-utilisateur
 
Messages: 267
Inscription: Vendredi 12 Janvier 2007, 23:27
Statut actuel: Actif et salarié

Re: [Résolu][Asymptote] Récupérer les arguments de size

Messagepar GMaths » Vendredi 19 Février 2010, 00:26

Ph. Ivaldi a écrit:
GMaths a écrit:surtout que j'avais l'impression que currentpicture.add(new void(frame f, transform t) suffit

Oui, ça suffit. J'ai l'habitude (façon de parler) d'utiliser l'autre, c'est tout.


Mais alors, excuse moi de dire que je ne vois pas à quoi cela sert ! :lol:

J'ai vu aussi que John avait fait ce genre de choses 2 ou 3 fois mais c'est mystérieux pour moi.

L'intéret serait de ... rappeler la nature des paramètres que l'on pourrait éventuellement passer ???? :lol:
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: [Résolu][Asymptote] Récupérer les arguments de size

Messagepar Ph. Ivaldi » Vendredi 19 Février 2010, 00:42

GMaths a écrit:
Ph. Ivaldi a écrit:
GMaths a écrit:surtout que j'avais l'impression que currentpicture.add(new void(frame f, transform t) suffit

Oui, ça suffit. J'ai l'habitude (façon de parler) d'utiliser l'autre, c'est tout.


Mais alors, excuse moi de dire que je ne vois pas à quoi cela sert ! :lol:

À rien, c'est toi qui a raison.

J'ai vu aussi que John avait fait ce genre de choses 2 ou 3 fois mais c'est mystérieux pour moi.
L'intéret serait de ... rappeler la nature des paramètres que l'on pourrait éventuellement passer ????

Tout est là:
Code: Tout sélectionner
// A function that draws an object to frame pic, given that the transform
// from user coordinates to true-size coordinates is t.
typedef void drawer(frame f, transform t);

// A generalization of drawer that includes the final frame's bounds.
typedef void drawerBound(frame f, transform t, transform T, pair lb, pair rt);

Soit tu utilises un drawer soit tu utilises un drawerBound.
Dans le cas qui nous occupe un drawer suffit amplement mais comme drawerBound fait plus il fait aussi moins. ;)
Ph. Ivaldi
Méga-utilisateur
 
Messages: 267
Inscription: Vendredi 12 Janvier 2007, 23:27
Statut actuel: Actif et salarié

Re: [Résolu][Asymptote] Récupérer les arguments de size

Messagepar GMaths » Vendredi 19 Février 2010, 01:08

Ph. Ivaldi a écrit:Tout est là:
Code: Tout sélectionner
// A function that draws an object to frame pic, given that the transform
// from user coordinates to true-size coordinates is t.
typedef void drawer(frame f, transform t);

// A generalization of drawer that includes the final frame's bounds.
typedef void drawerBound(frame f, transform t, transform T, pair lb, pair rt);

Soit tu utilises un drawer soit tu utilises un drawerBound.
Dans le cas qui nous occupe un drawer suffit amplement mais comme drawerBound fait plus il fait aussi moins. ;)


Je me disais bien qu'il devait y avoir une explication cachée. :-))
Maintenant, il ne reste plus qu'à essayer de comprendre... :-))
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Précédente

Retourner vers Asymptote

 


  • Articles en relation
    Réponses
    Vus
    Dernier message

Qui est en ligne

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