
\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}
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 line
in 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));
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:
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 hatch
und 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 line
Mustern nicht auftritt. Hier ein Workaround. Es reicht aus, einen neuen Stift wie Stift zu definieren, dotted
aber 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
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"));