反转 TikZ 描边方向以与填充规则一起使用

反转 TikZ 描边方向以与填充规则一起使用

这个问题是受到我自己的回答启发的: 如何在 tikz 图片中绘制交叉口? 我分四个阶段绘制蓝色椭圆。我认为应该只用一个\fill命令就可以绘制。为了做出正确的\clip,我需要了解默认\clip\fill非零缠绕规则,nonzero rule(手册 15.5.2 第 181 页)而不是even odd rule


在此示例中,我们可以看到,与矩形相比,圆形(和椭圆形)的笔触是反向的:

\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
 \draw[fill=red]  (0,0) circle (1) (0,0) rectangle (2,2);
 \draw[fill=green] (4,-1) rectangle (6,1) (5,0) rectangle (7,2);
 \draw[fill=blue] (9,0) circle (1) (9.5,0.5) circle (1);
\end{tikzpicture}
\end{document}

圆形和矩形重叠。红色圆形和矩形重叠部分未填充


为了制作正确的剪辑,我需要从四个重叠的椭圆和一个矩形中选择一个区域。我相信如果不改变某些椭圆的描边方向,这是不可能的!?使用 制作剪辑不会有帮助even odd rule

问题: 没有的话如何填充两个重叠圆(椭圆)的交点even odd rule

梅威瑟:

\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
 \fill (0,0) circle (2) (1,1) circle (2);
\end{tikzpicture}
\end{document}

期望输出: 重叠圆圈,无交叉填充

我在手册中找不到有关更改笔划方向的任何信息。可以做到吗?也许还有其他方法?

编辑: 我只是发现,对于我最初的目的来说,帮助使用剪辑even odd rule(可以通过范围完成)。 - 但我的问题仍然是一样的 - 没有它是否可能。

答案1

的笔画方向rectangle相对于提供的点。例如,在您的第一个代码中,尝试使用(5,2) rectangle (7,0)而不是(5,0) rectangle (7,2)。使用circle,您可以使用circle(-2 and 2)而不是circle(2)

\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
  \draw[fill=red]  (0,0) circle (1) (0,0) rectangle (2,2);
  \draw[fill=green] (4,-1) rectangle (6,1) (5,2) rectangle (7,0);
  \draw[fill=blue] (9,0) circle (1) (9.5,0.5) circle (-1 and 1);
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案2

我的spath3该库旨在对路径进行低级操作,包括反转笔划方向。公共接口有点基础,因为其目的是提供可在其他包(例如knotcalligraphyTikZ 库)中使用的功能。以下是概念证明。

\documentclass{article}
%\url{https://tex.stackexchange.com/q/568999/86}

\usepackage{tikz}
\usepackage{spath3}
\begin{document}
\begin{tikzpicture}
\path[save spath=circle1]  (0,0) circle[radius=2];
\path[save spath=circle2] (1,1) circle[radius=2];
 \fill (0,0) [insert spath=circle1] (1,1) [insert reverse spath=circle2];
\end{tikzpicture}
\end{document}

填充中使用的反转路径

由OP编辑: 我相信spath3语法已经更新。现在的工作代码是:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{spath3}
\begin{document}
\begin{tikzpicture}
\path[spath/save=circle1]  (0,0) circle[radius=2];
\path[spath/save=circle2] (1,1) circle[radius=2];
\fill (0,0) [spath/insert=circle1] (1,1) [spath/insert reverse=circle2];
\end{tikzpicture}
\end{document}

相关内容