Wie kann verhindert werden, dass 3D-Beschriftungen auf Asymptote automatisch mit Farbe gefüllt werden?

Wie kann verhindert werden, dass 3D-Beschriftungen auf Asymptote automatisch mit Farbe gefüllt werden?

Ich versuche, Beschriftungen nach 3D-Vektoren in Asymptote einzufügen, die mit unterschiedlichen Farben gezeichnet werden. Ich möchte alle Beschriftungen schwarz haben, aber selbst die Angabe der Farbenachdas Label spielt keine Rolle. So sieht die Ausgabe aus:

Bildbeschreibung hier eingeben

Wie behebe ich das? Danke!

import math;
settings.outformat="pdf";
settings.prc=true;
settings.embed=true;
settings.render=0;
size(5cm,0);
import graph3;

triple F(pair uv) {
real r = uv.x;
real t = uv.y;
return (r*cos(t),r*sin(t), r);}
surface coneup = surface(F, (0,0), (1,2pi), Spline);
draw(coneup, surfacepen=material(paleyellow, emissivepen=0.2 paleyellow), light=Viewport);

triple F2(pair uv) {
real r = uv.x;
real t = uv.y;
return (r*cos(t),r*sin(t), -r);}
surface conedown = surface(F2, (0,0), (1,2pi), Spline);
draw(conedown, surfacepen=material(paleyellow, emissivepen=0.2 paleyellow), light=Viewport);

draw(O--X, Arrow3);
draw(O--Y, Arrow3);
draw(O--Z, Arrow3);

draw(O--Y+Z, L=Label("null", position=EndPoint), yellow, Arrow3);
draw(O--.5*X+1.5*Z, L=Label("timelike", position=EndPoint), green, Arrow3);
draw(O--1.5*X+0.5*Z, L=Label("spacelike", position=EndPoint), red, Arrow3);

Bearbeiten:Ich habe versucht, das Etikett in ein winziges Segment zu setzen mit

draw(0.99*(Y+Z) -- Y+Z, L=Label("null", position=EndPoint));

und es entstand nur eine komplett schwarze Etikettenbox. Das Problem sind also nicht die Farben.

Antwort1

Vielen Dank für die Meldung dieses Fehlers. Bitte melden Sie Fehler in Zukunft unterhttps://github.com/vectorgraphics/asymptote/issues

In Git ist jetzt ein Fix enthalten, der in der kommenden Version 2.84 enthalten sein wird.

Seien Sie vorsichtig bei der Verwendung von settings.render=0; bei diesem Ansatz ist nur eine begrenzte Unterstützung für die Entfernung versteckter Oberflächen, Beleuchtung und Transparenz verfügbar. Siehe https://asymptote.sourceforge.io/doc/three.html

Wenn Sie in der ZwischenzeitWirklichWenn Sie weiterhin die experimentelle Option „settings.render=0“ verwenden möchten, können Sie die folgenden mit „-“ markierten Zeilen aus Ihrer Kopie von three.asy löschen:

diff --git a/base/three.asy b/base/three.asy
index c208f59d..9dfad6ce 100644
--- a/base/three.asy
+++ b/base/three.asy
@@ -2907,11 +2907,6 @@ object embed(string prefix=outprefix(), string label=prefix,
   if((preview || (prc && settings.render == 0)) && settings.embed) {
     image=prefix;
     if(settings.inlinetex) image += "_0";
-    if(!preview && !S.pic2.empty2()) {
-      transform T=S.pic2.scaling(S.width,S.height);
-      _shipout(image,S.pic2.fit(T),newframe,nativeformat(),false,false);
-    }
-
     image += "."+nativeformat();
     if(!settings.inlinetex) file3.push(image);
     image=graphic(image,"hiresbb");

Antwort2

Ich würde das integrierte Feature unitconemit einigen geometrischen Transformationen verwenden. Was die Farbe betrifft: Verwenden Sie einfach blackinside Label, um die Zeichenfolge einzufärben. Ich hoffe, dass der Code jetzt einfach ist.

Bildbeschreibung hier eingeben

// http://asymptote.ualberta.ca/
size(6cm,0);
import three;
currentprojection=orthographic(3,2,1,zoom=.9,center=true);

surface conedown=shift(0,0,-1)*unitcone;
surface coneup=scale(1,1,-1)*conedown;
material p=material(paleyellow,emissivepen=0.2 paleyellow);
draw(coneup,surfacepen=p,light=Viewport);
draw(conedown,surfacepen=p,light=Viewport);

draw(O--X, Arrow3);
draw(O--Y, Arrow3);
draw(O--Z, Arrow3);
draw(Label("null",EndPoint,align=E,black),O--Y+Z,yellow,Arrow3);
draw(Label("time-like",EndPoint,black),O--.5*X+1.5*Z,green,Arrow3);
draw(Label("space-like",EndPoint,black),O--1.5*X+0.5*Z,red,Arrow3);

verwandte Informationen