Récupérer les arguments de size

Tout ce qui concerne le langage Asymptote. Ce langage est utilisable sur le forum via les balises asy.
[participation réservée aux utilisateurs inscrits]
Règles du forum
Merci de soigner la rédaction de vos messages et de consulter ce sujet avant de poster. Pensez également à utiliser la fonction recherche du forum.
chellier
Modérateur honoraire
Modérateur honoraire
Messages : 355
Inscription : samedi 25 juillet 2009, 12:25
Localisation : Le Creusot
Contact :

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

Message non lu par chellier »

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: )
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

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

Message non lu par GMaths »

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é 213 fois
OG
Modérateur spécialisé
Modérateur spécialisé
Messages : 2293
Inscription : lundi 12 mars 2007, 11:20
Localisation : Rouen

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

Message non lu par OG »

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.
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

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

Message non lu par GMaths »

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 modification par GMaths le mardi 16 février 2010, 22:07, modifié 1 fois.
chellier
Modérateur honoraire
Modérateur honoraire
Messages : 355
Inscription : samedi 25 juillet 2009, 12:25
Localisation : Le Creusot
Contact :

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

Message non lu par chellier »

Ç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 honoraire
Modérateur honoraire
Messages : 355
Inscription : samedi 25 juillet 2009, 12:25
Localisation : Le Creusot
Contact :

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

Message non lu par chellier »

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 !
Ph. Ivaldi

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

Message non lu par Ph. Ivaldi »

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.
chellier
Modérateur honoraire
Modérateur honoraire
Messages : 355
Inscription : samedi 25 juillet 2009, 12:25
Localisation : Le Creusot
Contact :

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

Message non lu par chellier »

Bonjour,
Ah ben oui, c'est bien ça...
Mais alors là, je risquais pas de trouver tout seul :shock: :shock: :shock:
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

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

Message non lu par GMaths »

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));}
    
Ph. Ivaldi

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

Message non lu par Ph. Ivaldi »

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.
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

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

Message non lu par GMaths »

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
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

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

Message non lu par GMaths »

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:
Ph. Ivaldi

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

Message non lu par Ph. Ivaldi »

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
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

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

Message non lu par GMaths »

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
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

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

Message non lu par GMaths »

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.
Ph. Ivaldi

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

Message non lu par Ph. Ivaldi »

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.
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

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

Message non lu par GMaths »

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:
Ph. Ivaldi

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

Message non lu par Ph. Ivaldi »

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. ;)
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

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

Message non lu par GMaths »

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... :-))
Répondre
  • Sujets similaires
    Réponses
    Vues
    Dernier message