Bei meinem ersten Versuch, eine Asymptote-Grafik zu erzeugen, erhalte ich keine Vektor-Grafik, sondern nur eine Raster-Grafik.

Nach dem ersten Kompilieren der .tex-Datei mit pdfLaTeX, erhalte ich eine .asy-Datei, die vor dem Grafik-Code, den ich selbst im Dokument eingegeben habe, noch den folgenden Code enthält:

if(!settings.multipleView) settings.batchView=false;
settings.tex="pdflatex";
defaultfilename="<Dateiname der TeX-Datei>-1";
if(settings.render < 0) settings.render=4;
settings.outformat="";
settings.inlineimage=true;
settings.embed=true;
settings.toolbar=false;
viewportmargin=(2,2);

Anschließend rufe ich (bzw. mein Editor) Asy wie folgt auf (dies habe ich so nach der Konfigurationsanleitung von Asymptote mal eingeben):

asy -gs="C:\Program Files\System\gs9.05\bin\gswin64c.exe" <Dateiname der TeX-Datei>-1.asy

Nach einem weiteren Kompilieren mit pdfLaTeX erhalte ich eine PDF-Datei, die neben der gerasterten Grafik auch noch einen großen „Play“-Button enthält, der mir nach einem Mausklick die Datei <Dateiname der TeX-Datei>-1+0.asy zum Speichern anbieten will.

Neben einer PDF-Datei <Dateiname der TeX-Datei>-1+0_0.pdf, die die Grafik selbst enthält, ist auch noch eine (scheinbar?) leere PDF-Datei <Dateiname der TeX-Datei>-1_0.pdf vorhanden.

Zu allem Überdruss ist die Grafik auch keine Vektor-Grafik. Was mache ich falsch?

Code

\documentclass{standalone}
\usepackage{asymptote}
\begin{document}
\begin{asy}
    import three;
    currentprojection=orthographic(5,4,2,center=true);
    currentlight=(1,0,0);
    size(5cm);
    size3(3cm,5cm,8cm);
    draw(unitbox);
    dot(unitbox,black);

    draw(surface((1,0,0)--(0,0,1)--(0,1,1)--(1,1,0)--cycle),red+opacity(0.7));
    draw(surface((1,0,1)--(0,0,0)--(0,1,0)--(1,1,1)--cycle),blue+opacity(0.7));
\end{asy}
\end{document}

Outputs

alt text alt text

gefragt 17 Dez '13, 00:52

Qrrbrbirlbel's gravatar image

Qrrbrbirlbel
2.9k2815
Akzeptiert-Rate: 53%

bearbeitet 17 Dez '13, 00:56

2

Ich denke, der Play-Button könnte von deinem PDF-Betrachtungsprogramm eingeblendet werden. Falls Du die Möglichkeit dazu hast, versuch mal die PDF mit dem Adobe Reader zu öffnen (denn der kann mit dem 3D output von Asymptote auch wirklich umgehen). Auf Win7 64bit sehe ich weder mit SumatraPDF noch mit Adobe Acrobat X einen Play-Button. Eine Vektorgraphik erhältst Du, indem Du unter das import three; statement das folgende einfügst: settings.render=0;. Allerdings lässt das Ergebnis zu wünschen übrig, da die render=0-Option in vielen Fällen die Tiefenanordnung der Einzelelemente versaut.

(17 Dez '13, 05:03) carlton87

@carlton87 Du hast recht. Im Adobe Reader ist Grafik nicht mehr gerastert. Der Button ist aber immer noch da und ich kann mir die Grafik von allen Seiten anschauen und um alle Achsen drehen. Ich wusste gar nicht, dass das möglich ist.

Und ja, settings.render=0; hat seine Nachteile, aber in Adobe und im 3D-Modus ist die Grafik wieder richtig gerendert.

Wenn ich mir das Manual (asymptote.pdf) in irgendeinem Viewer anschaue, sehe ich allerdings nur Vektorgrafiken und keine Play-Buttons (und die Grafiken sind auch nicht im Adobe interaktiv).

(17 Dez '13, 15:53) Qrrbrbirlbel

Ich glaube, ich hab eine Lösung für deine Probleme gefunden. Leider hatte ich noch eine ältere Asymptote-Version, welche noch das movie15 anstelle des media9 Pakets nutzt, wodurch das Problem mit dem Play-Button bei mir nicht auftrat und ich angenommen hatte, es wäre ein PDF-Viewer-spezifisches Verhalten. Ich hoffe meine Antwort klärt alles hinreichend. Darf ich fragen, wie es kommt, dass du als absoluter TikZ-Experte anfängst dich mit Asymptote zu beschäftigen - ist es nur Neugier oder gibt es Anwendungsfälle bei denen du mit TikZ an gewisse Grenzen stößt. Entschuldige bitte meine Neugier

(17 Dez '13, 18:30) carlton87

@Carlton87 Als absoluter TikZ-Experte würde ich mich jetzt ja nicht beschreiben …

Trotzdem wage ich zu behaupten, dass TikZ für ernsthafte 3D-Grafiken nicht zu gebrauchen ist. Die Idee, Asymptote zu testen, folgte einer Frage auf TeX.sx, die zugegebenermaßen noch relativ einfach mit TikZ zu beantworten ist. Ich habe meinen Code von damals extra für TeXwElt rausgekramt, da ich denke, dass er die Grundlage für eine gute Frage bietet.

Meine eigenen Diagramme sind alle aber viel einfacher. Wenn dann greife ich gleich zu AutoCAD & Co.

(19 Dez '13, 01:16) Qrrbrbirlbel

@Qrrbrbirlbel Naja, ich würde sagen, dein TeX.SX-Profil spricht schon eine eindeutige Sprache bzgl. TikZ ;) Übrigens, dürfte für die von dir zitierte Frage, dass bsp Modul von Asymptote eine Lösung liefern, die auch ordentlichen Vektor-Output liefert. Ich bin mir bei Asymptote allerdings immer noch nicht sicher, ob sich der Aufwand es zu lernen wirklich lohnt. TikZ ist benutzerfreundlicher für 2D und da das mit dem Vektor-Output bei 3D mit Asymptote so eine Sache ist, könnte man auch POVRay stattdessen nehmen - das liefert zwar keine interaktiven PDFs ist dafür aber noch etwas schicker.

(19 Dez '13, 01:36) carlton87

Anscheinend ist der Play-Button ein neueres Feature des media9 LaTeX-Pakets, welches von Asymptote zum Einbinden von 3D-Inhalten in Dokumente genutzt wird. Asymptote kennt dieses neue Feature noch nicht und da es in dem Paket per Default eingeschaltet ist, sieht man es entsprechend auch in den erzeugten Dokumenten. Ich hätte folgende workarounds anzubieten:

  1. Bearbeite die Datei embed.asy im Asymptote-Installationsverzeichnis. Ersetze dabei

    usepackage("media9","bigfiles");
    

    durch

    usepackage("media9","bigfiles,noplaybutton");
    
  2. Wenn man nicht an dem 3D-Inhalt interessiert ist, sondern nur das 2D Bild haben möchte, dann kann man die folgende Zeile in den Asymptote-Code einfügen:

    settings.prc=false;
    

    Dadurch wird keine prc-Datei in das Dokument eingebunden und somit wohl auch nicht das media9 Paket bemüht.

  3. Man kann entweder eine ältere Version von media9 verwenden, welche den Play-Button noch nicht enthält, oder eine ältere Asymptote-Version nutzen (z.B. 2.15), die für das einbinden der prc-Dateien noch das LaTeX-Paket movie15 verwendet, welches keinen Play-Button implementiert hat.

Vektorgraphiken von 3D-Inhalten kann man in Asymptote durch die Kommandozeilen-Option -render=0 erzeugen (oder man kann sie auch direkt im Asymptote-Code durch settings.render=0; setzen). Leider unterliegt render=0 vielen Limitierungen (siehe dazu hier) und bringt häufig die Tiefenanordnung der Bildelemente durcheinander, vor allem bei sich überschneidenden Flächen (Das interaktive 3D-Objekt selbst weist diese Fehler nicht auf). Es gibt jedoch viele Fälle, in denen man tatsächlich sehr schöne Vektorgraphiken von 3D-Objekten erzeugen kann, die mit TikZ nur sehr schwer möglich wären. In 2D bestehen diese Probleme natürlich nicht.

Da Du geschrieben hast, dass Du gerade anfängst Dich mit Asymptote zu beschäftigen, kann ich Dir die folgenden Seiten mit sehr vielen Beispielen ans Herz legen:

  1. PIPRIME.FR
  2. marris.org

Interessant sind auf der ersten Seite die Unofficial packages. Mit polyhedron_js.asy und tube_js.asy kann man einige vorgefertigte geometrische Körper und Röhren nutzen, die auch mit render=0 gut funktionieren.

Permanenter link

beantwortet 17 Dez '13, 18:24

carlton87's gravatar image

carlton87
2541711
Akzeptiert-Rate: 66%

bearbeitet 17 Dez '13, 18:36

1

Statt embed.sty zu bearbeiten, habe ich mit \PassOptionsToPackage{noplaybutton}{media9} das selbe erreicht (siehe auch Warum soll ich keine Klassen oder Styles/Pakete verändern?). Auch Punkt 2. entfernt den Play-Button und die damit verbundene Interaktivität zuverlässig.

Schade aber, dass die Erstellung von Vektorgrafiken solchen Restriktionen unterlegen ist. Das Beispiel mit dem Saddle scheint aber mit den gleichen problematischen Einstellungen erstellt worden sein.

(19 Dez '13, 00:34) Qrrbrbirlbel

Gibt es denn eine einfache Einstellung, die wenigstens die Auflösung der Raster-Grafik erhöht? Oder was wäre deine Empfehlung, wie man damit umgeht? (Für den Print ist ja nicht wirklich eine Vektorgrafik nötig …)

(19 Dez '13, 00:34) Qrrbrbirlbel

@Qrrbrbirlbel Das mit \PassOptionsToPackage ist interessant. Ich hatte nur versucht das Paket vorher mit den richtigen Optionen und \usepackage zu laden, was natürlich einen option clash gegeben hat. Bezüglich der Auflösung von Raster-Grafiken mit Asymptote: Man kann sie mit dem schon angesprochenen settings.render einstellen, z.B. bei settings.render=4 ist 4 die Zahl der pro bp berechneten Punkte, was einer Auflösung von 72*4 dpi entspricht (render=0 erzeugt eine Vektorgrafik und render=-1 erzeugt eine Rastergrafik mit einem systemabhängigen Defaultwert für die Auflösung).

(19 Dez '13, 01:00) carlton87

@Qrrbrbirlbel Und noch zu dem Beispiel mit dem Saddle: Bei Zeichnungen, die hauptsächlich aus Linien bestehen, bekommt man meist keine Probleme mit render=0. Auch klar voneinander getrennte Flächen funktionieren recht gut (z.B. http://tex.stackexchange.com/a/109041/6870 ). Problematisch wird es nur, wenn sich mehrere Flächen schneiden, sodass nicht die eine immer vor der anderen im Bild ist, sondern dies wechselt. Die revolution Oberflächen (aus dem solids Modul) funktionieren auch oft gut mit Vektor-Output. Häufig sollte man einfach probieren, ob es sich vektorisieren lässt oder nicht.

(19 Dez '13, 01:09) carlton87

@Qrrbrbirlbel Das bsp Modul ermöglicht auch Vektorgrafiken mit sich überschneidenden Flächen (siehe z.B. hier: http://www.piprime.fr/747/asymptote-using-three_asy-fig0070/). Auch dieses Bild (http://www.piprime.fr/files/asymptote/odoc/index.html#fig0053 ) ergibt mit render=0 wunderbaren Vektor-Output, was für mich etwas überraschend kam. Ich glaube, dass ich schon einmal gelesen habe, dass parametrische Oberflächen generell gut mit render=0 funktionieren, aber das könnte Erinnerungsoptimismus sein.

(19 Dez '13, 01:18) carlton87
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×7

gestellte Frage: 17 Dez '13, 00:52

Frage wurde gesehen: 12,287 Mal

zuletzt geändert: 19 Dez '13, 01:37