Page 1 sur 2

Léger changement de perspective entre render=4 et render=0

Posté : lun. 7 mai 2012, 07:50
par dohtreb
Bonjour,

Question de débutant. Je cherche à réaliser un graphique 3D avec une surface z(x,y) tirée d'un fichier de données, des axes et des labels. Jusque là rien de spécial. Comme beaucoup d'autres, je voudrais que la surface soit pixellisée mais que les axes et les labels soient vectoriels (il n'y a pas de problèmes d'intersection dans mon cas). Mon approche est de fabriquer l'image en trois temps: (1) générer la surface avec render=4 et un "pen" invisible pour les axes etc; (2) générer les axes et les labels avec render=0 et un "pen" invisible pour la surface; (3) superposer les deux images avec latex. Cela fonctionne, sauf que la perpective change un petit peu en passant de render=4 à render=0, donc les deux images ne se superposent pas parfaitement. Le petit shell ci-dessous illustre le problème: le changement de perspective fait que les deux cubes ne se recouvrent pas.

Peut-on s'assurer que la projection soit exactement la même avec les deux méthodes de rendering?

Merci de votre aide.

[Asymptote 2.13 sur mac (10.7.3) avec texlive 2011]

Code : Tout sélectionner

#!/bin/bash
cat << EOF > test.tex
\documentclass{article}
\usepackage{asymptote}
\begin{document}
\begin{asy}
import graph3; size(8cm); draw(unitbox);
\end{asy}

\vspace{-7.61cm}

\hspace{1.9cm}%
\begin{asy}
import graph3; size(8cm); draw(unitbox,red);
\end{asy}
\end{document}
EOF

pdflatex test
asy -noV -noprc -f pdf test-1.asy
asy -noV -noprc -f pdf -render=0 test-2.asy
pdflatex test

Re: Léger changement de perspective entre render=4 et render=0

Posté : lun. 7 mai 2012, 08:52
par GM
Bonjour,

dohtreb a écrit :Question de débutant.

je ne trouve pas... et je la trouve plutôt étonnante et pas facile.

J'ai tenté d'indiquer une projection dans chaque script : c'est un peu mieux et pas parfait.

Code : Tout sélectionner

\documentclass{article}
\usepackage{asymptote}
\begin{document}
\begin{asy}
settings.prc=false;
settings.outformat="pdf";
settings.render=4;
import graph3;
currentprojection=orthographic(camera=(5,4,1));
size(8cm); draw(unitbox);
\end{asy}

\vspace{-6.98cm}

\hspace{1.95cm}%
\begin{asy}
settings.prc=false;
settings.outformat="pdf";
settings.render=0;
import graph3;
currentprojection=orthographic(camera=(5,4,1));
size(8cm); draw(unitbox,red);
\end{asy}
\end{document}


Image


Pourquoi le décalage... dans l'instant, je ne sais pas.

J'espère qu'il n'y a pas des dizaines à faire ainsi... car sinon, bon courage pour les réglages des "hspace" et "vspace".

Re: Léger changement de perspective entre render=4 et render=0

Posté : lun. 7 mai 2012, 08:57
par GM
GM a écrit :J'ai tenté d'indiquer une projection dans chaque script : c'est un peu mieux et pas parfait.

Mais je réalise que j'ai choisi orthographic et qu'il faut peut-être perspective, avec lequel le résultat ne sera peut-être pas satisfaisant.

Re: Léger changement de perspective entre render=4 et render=0

Posté : lun. 7 mai 2012, 09:00
par GM
GM a écrit :
GM a écrit :J'ai tenté d'indiquer une projection dans chaque script : c'est un peu mieux et pas parfait.

Mais je réalise que j'ai choisi orthographic et qu'il faut peut-être perspective, avec lequel le résultat ne sera peut-être pas satisfaisant.

Et effectivement, je viens de tester : avec perspective, on a le problème.

Re: Léger changement de perspective entre render=4 et render=0

Posté : lun. 7 mai 2012, 09:16
par GM
... mais j'y pense : elle est positionnée comment la surface vis à vis des axes ? Il ne va pas y avoir un problème de position relative ?

Peut-on avoir un aperçu (voire le script pour tester) de ce qui ne va pas quand surface et axes sont dans le même script ?

Re: Léger changement de perspective entre render=4 et render=0

Posté : lun. 7 mai 2012, 09:34
par dohtreb
En effet, le problème n'existe pas en projection orthographique.

Voici comment se présente l'image:

Code : Tout sélectionner

\documentclass{article}
\usepackage{asymptote}
\begin{document}

\begin{asy}
settings.prc=false;
settings.outformat="pdf";
settings.render=4;
usepackage("mathdesign",options="charter");
usepackage("amsmath");
import graph3;

real Xrange=6; real Yrange=5;
int Nx=121; int Ny=101;

pen pa=currentpen;pen ps=lightblue;pen pl=1bp+lightmagenta;
//pen pa=invisible;pen ps=lightblue;pen pl=1bp+red;
//pen pa=currentpen;pen ps=invisible;pen pl=invisible;

//real[][] f=input("data/S1.dat").line().dimension(0,0);
triple f(pair t) {
//   int i=round(t.x); int j=round(t.y);
//   return (i*Xrange/(Nx-1),j*Yrange/(Ny-1),f[i][j]);
   return (t.x,t.y,1/(1+t.x^2+t.y^2));
}
limits((0,0,0),(Xrange,Yrange,1));
surface s=surface(f,(0,0),(Xrange,Yrange),Nx,Ny,Spline);

size3(6cm,8cm,5cm,IgnoreAspect);
currentprojection=perspective(camera=(18,-10,4),up=(0,0,1),target=(Xrange/2,Yrange/2,0.5));
xaxis3(Label(XZ()*"$x$",position=MidPoint),0,6,pa,OutTicks(XZ()*Label,endlabel=false,Step=1));
yaxis3(Label(YZ()*"$y$",position=MidPoint,align=SE),XEquals(6),0,5,pa,OutTicks(YZ()*Label,Step=1));
zaxis3(Label("$\mathscr{S}_1(x,y)$",align=N),0,1,pa,InTicks(Step=0.5,0.1));
draw(s,ps);
\end{asy}


\begin{asy}
settings.prc=false;
settings.outformat="pdf";
settings.render=4;
usepackage("mathdesign",options="charter");
usepackage("amsmath");
import graph3;

real Xrange=6; real Yrange=5;
int Nx=121; int Ny=101;

//pen pa=currentpen;pen ps=lightblue;pen pl=1bp+lightmagenta;
pen pa=invisible;pen ps=lightblue;pen pl=1bp+red;
//pen pa=currentpen;pen ps=invisible;pen pl=invisible;

//real[][] f=input("data/S1.dat").line().dimension(0,0);
triple f(pair t) {
//   int i=round(t.x); int j=round(t.y);
//   return (i*Xrange/(Nx-1),j*Yrange/(Ny-1),f[i][j]);
   return (t.x,t.y,1/(1+t.x^2+t.y^2));
}
limits((0,0,0),(Xrange,Yrange,1));
surface s=surface(f,(0,0),(Xrange,Yrange),Nx,Ny,Spline);

size3(6cm,8cm,5cm,IgnoreAspect);
currentprojection=perspective(camera=(18,-10,4),up=(0,0,1),target=(Xrange/2,Yrange/2,0.5));
xaxis3(Label(XZ()*"$x$",position=MidPoint),0,6,pa,OutTicks(XZ()*Label,endlabel=false,Step=1));
yaxis3(Label(YZ()*"$y$",position=MidPoint,align=SE),XEquals(6),0,5,pa,OutTicks(YZ()*Label,Step=1));
zaxis3(Label("$\mathscr{S}_1(x,y)$",align=N),0,1,pa,InTicks(Step=0.5,0.1));
draw(s,ps);
\end{asy}

\vspace{-6.9cm}

\hspace{1.6cm}\begin{asy}
settings.prc=false;
settings.outformat="pdf";
settings.render=0;
usepackage("mathdesign",options="charter");
usepackage("amsmath");
import graph3;

real Xrange=6; real Yrange=5;
int Nx=121; int Ny=101;

//pen pa=currentpen;pen ps=lightblue;pen pl=1bp+lightmagenta;
//pen pa=invisible;pen ps=lightblue;pen pl=1bp+red;
pen pa=currentpen;pen ps=invisible;pen pl=invisible;

//real[][] f=input("data/S1.dat").line().dimension(0,0);
triple f(pair t) {
//   int i=round(t.x); int j=round(t.y);
//   return (i*Xrange/(Nx-1),j*Yrange/(Ny-1),f[i][j]);
   return (t.x,t.y,1/(1+t.x^2+t.y^2));
}
limits((0,0,0),(Xrange,Yrange,1));
surface s=surface(f,(0,0),(Xrange,Yrange),Nx,Ny,Spline);

size3(6cm,8cm,5cm,IgnoreAspect);
currentprojection=perspective(camera=(18,-10,4),up=(0,0,1),target=(Xrange/2,Yrange/2,0.5));
xaxis3(Label(XZ()*"$x$",position=MidPoint),0,6,pa,OutTicks(XZ()*Label,endlabel=false,Step=1));
yaxis3(Label(YZ()*"$y$",position=MidPoint,align=SE),XEquals(6),0,5,pa,OutTicks(YZ()*Label,Step=1));
zaxis3(Label("$\mathscr{S}_1(x,y)$",align=N),0,1,pa,InTicks(Step=0.5,0.1));
draw(s,ps);
\end{asy}

\end{document}

Re: Léger changement de perspective entre render=4 et render=0

Posté : lun. 7 mai 2012, 09:49
par GM
L'objectif est d'obtenir le meilleur rendu possible à l'écran ? Je pose la question, car j'ai imprimé le pdf obtenu avec le source précédent... et la différence de qualité des deux figures n'est pas flagrante.

Re: Léger changement de perspective entre render=4 et render=0

Posté : lun. 7 mai 2012, 10:19
par dohtreb
En effet, pour une impression cela ne fait guère de différence. L'image est destinée à être incluse dans un article distribué en format PDF. L'intérêt d'avoir des fontes vectorielles dans les figures est qu'elles sont correctement lissées lorsqu'on visualise le document PDF à l'écran, ce qui n'est pas le cas des fontes bitmap.

Re: Léger changement de perspective entre render=4 et render=0

Posté : mer. 1 août 2012, 15:18
par etienne25
Cette discussion remonte à il y a 3 mois, mais je me retrouve actuellement dans la même situation. En fait:
dohtreb a écrit :Comme beaucoup d'autres, je voudrais que la surface soit pixellisée mais que les axes et les labels soient vectoriels...

Moi je voudrais que TOUT soit vectoriel! À quoi bon utiliser Asymptote, «a powerful descriptive vector graphics language» et TeX, qui fait tous ses calculs de dimension avec le scaled point (sp) qui est 100 fois inférieur à la longueur d'onde de la lumière visible, si c'est pour obtenir une image et une police grossièrement pixelisée comme si on travaillait avec Paint??

Bon, le but de mon post n'est pas tant de faire une montée de lait avec ce sujet (bien que ça m'ait soulagé de le faire :D ) que de remarquer la chose ultra-curieuse suivante: si l'on fait un dessin 3D avec Asymptote qui est manipulable (donc lorsqu'Asymptote produit un prc), lorsqu'on clique dessus dans Reader pour "activer le contenu", tout devient vectoriel!!!! La police, le dessin, tout!!! Enfin, c'est ce que j'ai obtenu comme résultat avec tous les prc produits avec Asymptote que j'ai rencontrés jusqu'ici...

Mais alors pourquoi-pourquoi-pourquoi la perfection du vectoriel est-elle massacrée par une lamentable pixelisation lorsqu'on désactive le contenu? Elle est là, l'image vectorielle, qu'est-ce qui justifie qu'on la remplace ainsi par du bitmap?

C'est une question sans réponse, probablement... J'ai divorcé d'avec PSTricks parce que ses capacités 3D ne m'étaient plus suffisantes, mais je dois reconnaître qu'il ne m'a jamais fait le coup bas de la pixelisation :|

Re: Léger changement de perspective entre render=4 et render=0

Posté : mer. 1 août 2012, 16:10
par GM
etienne25 a écrit :Elle est là, l'image vectorielle, qu'est-ce qui justifie qu'on la remplace ainsi par du bitmap?

As-tu lu la documentation qui évoque "four choices for viewing 3D Asymptote output" ?

Tu ne veux que l'image prc dans ton pdf ? Tu compiles ainsi :

Code : Tout sélectionner

asy -f pdf nomdefichier.asy


La documentation dit, à propos du troisième choix :
A stationary preview image with a resolution of n pixels per bp can be embedded with the setting render=n; this allows the file to be viewed with other PDF viewers. Alternatively, the file externalprc.tex illustrates how the resulting PRC and rendered image files can be extracted and processed in a separate LaTeX file.


Le choix qui a été fait est celui de la prc... mais pour les "viewers" qui ne la supportent pas... ils doivent se contenter d'un aperçu fixe avec une résolution que l'on précise avec render. Mais est-il si étonnant que cet aperçu ne soit en quelque sorte qu'une photo du prc dans une position donnée ?

J'ai bien compris que tu penses facile de passer d'une figure 3D vectorielle (d'une vraie, que l'on peut tourner) en une figure 2D vectorielle que l'on pourrait ajouter au dessus de la figure prc (pour les lecteurs pdf autres qu'adobe)...donc n'hésite pas à proposer une solution aux auteurs d'Asymptote. ;-)

Quant à ta comparaison avec pstricks, j'espère que tu réalises que pstricks fait des projections 2D de vue 3D mais il ne fait pas de 3D : tu ne peux pas manipuler d'objets 3D.
Asymptote pratiquait la 3D comme pstricks dans ses premières versions (de simples projections fixes sur lesquelles tu pouvais zoomer sans perte), mais pour pouvoir offrir la possibilité de faire tourner les figures... la 3D d'Asymptote passe maintenant par le format prc et ce n'est plus comparable.

Tu aimerais le beurre et l'argent du beurre... mais pour l'instant, il y a des difficultés techniques qui nous échappent... et qui ne nous permettent pas d'avoir tout ce que l'on voudrait.

------

Tout ce que j'ai écrit est à relativiser : c'est ce que j'ai cru comprendre avec mon anglais approximatif... mais il faudrait que je connaisse bien mieux les subtilités du format prc d'Adobe et les rouages internes d'Asymptote pour avoir des certitudes en la matière.