![背景](https://linux22.com/image/366857/%E8%83%8C%E6%99%AF.png)
它与我之前的问题但要求略有不同。与其编辑上一个可能给已接受的答案带来“不便”的问题,不如让我单独提出这个问题。
背景
用 可以很容易地构造双边闭合曲线\reversepath
。为了便于说明,我举一个简单的例子,即画一个头盔。
下面三个宏分别定义头盔的头部、眼睛和嘴巴曲线的半部分。
\documentclass[pstricks,border=1cm]{standalone}
\def\HalfHead{\psline(-2,2)(-3,4)(-4,1)(-4,-5)}
\def\HalfEye{\psline(-1,0)(-2,1)(-3,0)(-3,-2)}
\def\HalfMouth{\psline(-2,-3)(-2,-4)}
\begin{document}
\begin{pspicture}[showgrid=b](-5,-5)(5,5)
\psset{linecolor=blue,arrows=->}
\HalfHead
\HalfEye
\HalfMouth
\end{pspicture}
\end{document}
可以通过用单个曲线封闭每个曲线来获得头部、眼睛和嘴巴的完整闭合曲线,\pscustom
如下所示。
\documentclass[pstricks,border=1cm]{standalone}
\def\HalfHead{\psline(-2,2)(-3,4)(-4,1)(-4,-5)}
\def\HalfEye{\psline(-1,0)(-2,1)(-3,0)(-3,-2)}
\def\HalfMouth{\psline(-2,-3)(-2,-4)}
\begin{document}
\begin{pspicture}[showgrid=b](-5,-5)(5,5)
\pscustom
{
\HalfHead
\reversepath
\scale{-1 1}
\HalfHead
\closepath
}
\pscustom
{
\HalfEye
\reversepath
\scale{-1 1}
\HalfEye
\closepath
}
\pscustom
{
\HalfMouth
\reversepath
\scale{-1 1}
\HalfMouth
\closepath
}
\end{pspicture}
\end{document}
除了其他目的之外(例如用渐变色填充、用图案填充或剪切另一个图像),我想用纯红色填充头部、眼睛和嘴巴所包围的区域。
不幸的\pscustom
是不能嵌套。我不得不使用单个,\pscustom
如下所示,但结果令人失望。
\documentclass[pstricks,border=1cm]{standalone}
\def\HalfHead{\psline(-2,2)(-3,4)(-4,1)(-4,-5)}
\def\HalfEye{\psline(-1,0)(-2,1)(-3,0)(-3,-2)}
\def\HalfMouth{\psline(-2,-3)(-2,-4)}
\begin{document}
\begin{pspicture}[showgrid=b](-5,-5)(5,5)
\pscustom[fillstyle=eofill,fillcolor=red]
{
\HalfHead
\reversepath
\scale{-1 1}
\HalfHead
\closepath
\HalfEye
\reversepath
\scale{-1 1}
\HalfEye
\closepath
\HalfMouth
\reversepath
\scale{-1 1}
\HalfMouth
\closepath
}
\end{pspicture}
\end{document}
赫伯特的回答我之前的问题中使用了一个看起来很麻烦的技巧。它迫使我们重新追溯路径。
问题
回想一下,内置的闭合曲线,例如
psellipticwedge
psellipse
pscircle
pswedge
pspolygon
psframe
psccurve
可以单独使用\pscustom
,
我认为如果我将头部、眼睛和嘴巴的每个闭合曲线都设为单个独立的对象会更好。
怎么做
\HalfHead
\reversepath
\scale{-1 1}
\HalfHead
\closepath
作为头部的单个独立对象,以便以后可以在单个对象中一起使用pscustom
?也欢迎使用 Metapost、Asympotote、Tikz 等解决方案!
答案1
我已经在另一个问题中给了你答案!
\documentclass[pstricks,border=1cm]{standalone}
\def\HalfHead{\psline(0,-5)(-4,-5)(-4,1)(-3,4)(-2,2)(0,2)}
\def\HalfEye{\psline(0,-2)(-3,-2)(-3,0)(-2,1)(-1,0)(0,0)}
\def\HalfMouth{\psline(0,-4)(-2,-4)(-2,-3)(0,-3)}
\begin{document}
\begin{pspicture}[showgrid=b](-5,-5)(5,5)
\pscustom[fillstyle=eofill,fillcolor=red]{%
\HalfHead
\moveto(0,-2)
\HalfEye
\moveto(0,-4)
\HalfMouth
\reversepath
\scale{-1 1}
\HalfHead
\moveto(0,-2)
\HalfEye
\moveto(0,-4)
\HalfMouth
}
\end{pspicture}
\end{document}
答案2
这是 使用填充规则从头部、眼睛和嘴巴曲线的半部分 Asymptote
制作单个对象的代码,以便用于填充和剪切:gface
evenodd
PostScript
// clcurve.asy
//
// run
// asy clcurve.asy
//
// to get clcurve.pdf
//
settings.outformat="pdf";
import graph; size(9cm);
guide fpsline(... pair[] p){return graph(p);}
guide HalfHead=fpsline((-2,2),(-3,4),(-4,1),(-4,-5));
guide HalfEye=fpsline((-1,0),(-2,1),(-3,0),(-3,-2));
guide HalfMouth=fpsline((-2,-3),(-2,-4));
guide[] g={HalfHead,HalfEye,HalfMouth};
guide[] gface;
for(var v:g) gface.push(v--reverse(scale(-1,1)*v)--cycle);
filldraw(gface,evenodd+orange,deepblue+0.8bp);
picture pic;
fill(pic,circle(0,100),lightyellow);
clip(pic,gface,evenodd);
add(shift(9,0)*pic);