背景

背景

它与我之前的问题但要求略有不同。与其编辑上一个可能给已接受的答案带来“不便”的问题,不如让我单独提出这个问题。

背景

用 可以很容易地构造双边闭合曲线\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制作单个对象的代码,以便用于填充和剪切:gfaceevenodd 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);

在此处输入图片描述

相关内容