Wie zeichne ich dieses Muster in PSTricks und sein Äquivalent in Asymptote?

Wie zeichne ich dieses Muster in PSTricks und sein Äquivalent in Asymptote?
\documentclass[border=10pt,pstricks,12pt]{standalone}
\begin{document}
    \begin{pspicture}[showgrid](0,0)(3,3)
    \pscircle*[linecolor=gray!20](1.5,1.5){1.5}
    \pscircle[fillstyle=crosshatch*](1,2){1}
    \pscircle[hatchcolor=gray,hatchsep=5pt,hatchwidth=.5pt,fillstyle=dots*](2,1){1}
    \end{pspicture}
\end{document}

Bildbeschreibung hier eingeben

TikZ hat eine Option namens crosshatch dots, Asymptote hat dasselbe wie TikZ, hatch(1.5mm,dotted+...). Das bedeutet, dassdotted in line

Wie ich sehe, ist das Ausgabebild nicht sehr gut! Wie kann ich also dotted in linein PSTricks V-Linien, H-Linien, Schraffuren usw. hinzufügen?

Ich zeichne dieses Bild mit Asymptote, aber ich habe folgenden Fehler:

// asy -f pdf <name>.asy
import math;
import patterns;

unitsize(1cm);
defaultpen(1);
pair C1=(-3,0),C2=(2.5,0);
real r=4;
path EllipseA=scale(.75,.55)*circle(C1,r);
path EllipseB=scale(.5,.35)*circle(C2,r);

add("fillA",hatch(1.5mm,red));
add("AinterB",crosshatch(2mm,green));
add("fillB",hatch(1.5mm,dotted+blue+1.5bp));//

fill(EllipseA,pattern("fillA"));
fill(EllipseB,pattern("fillB"));

picture AinterB;
fill(AinterB,EllipseA,white);
fill(AinterB,EllipseA,pattern("AinterB"));
clip(AinterB,EllipseB);
add(AinterB);

draw(EllipseA^^EllipseB); 
label("$C$",C1,dir(180),UnFill);
label("$D$",C2,UnFill);
label("$E$",(0,0),UnFill);

pair A=point(EllipseA,1.25),B=point(EllipseB,.5);
label("$A$",A,6N);
label("$B$",shift(.2,0)*B,6N);
label("$G$",(0,2),9N); // dot((0,1));

draw(A--shift(0,.6)*A);
draw(B--shift(.2,.7)*B);
draw(shift(-2.5,.75)*(0,1)--shift(-.5,2)*(0,1));
draw(shift(.2,0)*(0,1)--shift(0,2)*(0,1));
draw(shift(1.5,0)*(0,1)--shift(.5,2)*(0,1));

add(shift(-6,-3)*grid(10,7,1bp+dotted));
shipout(bbox(5mm,white));

Bildbeschreibung hier eingeben

Sehen Sie add("fillB",hatch(1.5mm,dotted+blue+1.5bp));//, wenn ich 1,5 mm durch 1,2 ersetze, erhalte ich dasselbe Ergebnis; wenn ich 1,5 mm durch 1,75 mm oder 2 mm ersetze, erhalte ich das tatsächliche Ergebnis wie folgt:

Bildbeschreibung hier eingeben

Warum sind sie also unterschiedlich? Es ist die Funktion in Asymptote oder...

Antwort1

Über das seltsame Verhalten von Asymptote

Es scheint, dass es einen Fehler mit Asymptote gibt. Ich denke, es ist unter bestimmten Bedingungen ein Periodizitätsproblem zwischen den Parametern von hatchund dotted. Das Verhalten besteht darin, eine gepunktete Linie abzuschneiden und dann durch Kacheln und Abschneiden das Muster hinzuzufügen. Aber ich weiß nicht, warum ein solches Problem bei einfachen lineMustern nicht auftritt. Hier ein Workaround. Es reicht aus, einen neuen Stift wie Stift zu definieren, dottedaber ein hinzuzufügen offset:pen mdotted=linetype(new real[] {0,4},offset=.5);

import math;
import patterns;

unitsize(1cm);
defaultpen(1);
pair C1=(-3,0),C2=(2.5,0);
real r=4;
path EllipseA=scale(.75,.55)*circle(C1,r);
path EllipseB=scale(.5,.35)*circle(C2,r);

add("fillA",hatch(1.5mm,red));
add("AinterB",crosshatch(2mm,green));
pen mdotted=linetype(new real[] {0,4},offset=.5);
add("fillB",hatch(1.5mm,mdotted+blue+1.5bp));//

fill(EllipseA,pattern("fillA"));
fill(EllipseB,pattern("fillB"));

picture AinterB;
fill(AinterB,EllipseA,white);
fill(AinterB,EllipseA,pattern("AinterB"));
clip(AinterB,EllipseB);
add(AinterB);

draw(EllipseA^^EllipseB); 
label("$C$",C1,dir(180),UnFill);
label("$D$",C2,UnFill);
label("$E$",(0,0),UnFill);

pair A=point(EllipseA,1.25),B=point(EllipseB,.5);
label("$A$",A,6N);
label("$B$",shift(.2,0)*B,6N);
label("$G$",(0,2),9N); // dot((0,1));

draw(A--shift(0,.6)*A);
draw(B--shift(.2,.7)*B);
draw(shift(-2.5,.75)*(0,1)--shift(-.5,2)*(0,1));
draw(shift(.2,0)*(0,1)--shift(0,2)*(0,1));
draw(shift(1.5,0)*(0,1)--shift(.5,2)*(0,1));

add(shift(-6,-3)*grid(10,7,1bp+dotted));
shipout(bbox(5mm,white));

und das Ergebnis

Bildbeschreibung hier eingeben

Ich füge ein Problem hinzuhttps://github.com/vectorgraphics/asymptote/issues/133

Antwort2

Um einen gepunkteten Stift in einem PostScript-Füllmuster zu verwenden, muss man Asymptotes automatische Skalierung auf die Stiftbreite und die Anpassung der Linienlänge deaktivieren:

import patterns;
unitsize(1cm); 
pen dotted=linetype(new real[] {0,4},offset=1,scale=false,adjust=false);

add("fillA",hatch(1.5mm,red+1.5bp+opacity(0.5)));
add("fillB",hatch(1.5mm,blue+1.5bp+dotted));

fill(unitcircle,pattern("fillA"));
fill(unitcircle,pattern("fillB"));

Bildbeschreibung hier eingeben

Antwort3

Ich kann kein Problem mit PSTricks erkennen. Aktuelles TeXLive:

Bildbeschreibung hier eingeben

Es scheint ein Problem mit Ihrem Viewer zu geben. Sehen Sie sich die dviAusgabe an?

verwandte Informationen