解释

解释

我尝试使用圆弧来获得下面的图片,但我必须为每个圆弧指定一个特定的中心,因为它们没有在它们应该结束的位置结束。我想使用曲线路径来定义填充区域,而不是圆弧。如何绘制或在我的代码中包含曲线路径?也许还有其他解决方案。我需要你的帮助。

\documentclass[10pt,a4paper]{book}

\usepackage{tikz}

\begin{document}

\begin{tikzpicture}

\draw[step=.2cm,gray!15,very thin](-2cm,-2cm)grid(2cm,2cm);

\draw[gray!30](-2cm,0) -- (2cm,0);
\draw[gray!30](0cm,-2cm) -- (0,2cm);
\draw (0cm,1.5576cm)--(0cm,.6227cm).. controls (.05cm,.28cm) and (.25cm,.2cm) ..(.6512cm,0cm)--(.6512cm,.9076cm) .. controls (.4cm,1cm)and(.1cm,1.1cm)..(0cm,1.5576cm);

\draw (0cm,1.5576cm).. controls (.12cm,1.2cm)and(.45cm,1.1cm)..(.8118cm,.9918cm)--(.8118cm,.0931cm)--(.9764cm,.2014cm)--(.9764cm,1.0681cm) .. controls (.45cm,1.12cm)and(.15cm,1.31cm)..(0cm,1.5576cm);

\draw (0cm,1.5576cm).. controls (.2cm,1.32cm)and(.7cm,1.21cm)..(1.141cm,1.1644cm)--(1.141cm,.3418cm)--(1.3016cm,.6227cm)--(1.3016cm,1.2727cm) .. controls (.7cm,1.3cm)and(.2cm,1.4cm)..(0cm,1.5576cm);

\draw (0cm,1.5576cm).. controls (.2cm,1.47cm)and(.7cm,1.3cm)..(1.3016cm,1.4212cm)--(1.3016cm,1.5576cm) .. controls (.7cm,1.45cm)and(.2cm,1.5cm)..(0cm,1.5576cm);

\end{tikzpicture}


\end{document}

期望的输出:

图像

MWE 的输出:

关于

这张图片展示了我想要解决的问题,我想定义圆弧的中心。此外,除了绘制圆弧,我还想包含曲线路径以包含不同的半径。
埃

答案1

以下是我的看法。首先,结果如下:

结果

现在给出代码,然后给出解释。

\documentclass{standalone}
\usepackage{ifthen}
\usepackage{tikz}
\usetikzlibrary{calc}

\begin{document}
\begin{tikzpicture}[x=3mm, y=3mm]
    \coordinate (spine) at (-4,4);
    \def\contour{(spine) -- ++(8,0) -- ++(0, -6)
       to[out=-110, in=30] ++(-4,-4)
       to[out=150, in=-70] ++(-4, 4) -- cycle
    }

    % Clipping to the above contour
    \clip\contour;
    % Draw each page
    \foreach \xx in {6,5,...,0} {
      % Following coordinates are tricky
      \coordinate (corner) at (\xx,0.75*\xx);
      \coordinate (center) at ($(spine)!.5!(corner)!5*\xx*\xx+2 cm!90:(corner)$);

      \ifthenelse{\isodd{\xx}}   % Alternating colors
      {\edef\mycolor{white}}
      {\edef\mycolor{red!80!black!80!white}}

      \fill[fill=\mycolor]   % Tricky code again
         let \p1 = ($(center)-(spine)$),
            \p2 = ($(center)-(corner)$),
            \n0 = {veclen(\x1,\y1)},
            \n1 = {atan2(\x1,\y1)},
            \n2 = {atan2(\x2,\y2)}
        in
        (spine) arc(\n1:\n2:-\n0) -- +(0, -10) -| (spine) -- cycle ;
     % Debugging commands
     %    \draw (center) [fill=red] circle(2pt) node[above] {c\xx};
     %    \draw (corner) [fill=red] circle(2pt) node[above] {\xx};
 }
 % Debugging command
 %  \draw \contour;
\end{tikzpicture}
\end{document}

解释

Percusse 在一条评论中给了我一个想法,将每页绘制为一个矩形,然后裁剪结果。但是由于顶部边框呈卷曲状,所以每页都不是矩形。

显然,边框是圆弧,但不清楚每个边框的半径是多少。由于没有徽标的设计指南,我不得不从图像中猜测一些东西。

首先,我假设书中每一页的角都是直线(即使那些因为裁剪而看不见的角也是如此)。其次,我假设每页顶部圆弧的半径都不同(前几页看起来更“弯曲”)。

然后,tikz 用来绘制弧线的语法很不方便,因为它需要一个起始角度、终止角度和半径,而所有这些量都是未知的。我使用语法let...in以更方便的方式绘制弧线,即知道它的起点((spine)节点)、它的终止点((corner)节点,书中的每一页都不同)和它的中心,这仍然是未知的。

每个圆弧的中心必须垂直于直线的中点(spine)--(corner),所以我使用语法($(spine)!.5!(corner)$)来找到该点,然后从该点开始,我使用语法($(point)!amount cm!90:(corner)$)找到与直线成 90 度角(point)--(corner)且距离amount cm的点(point)。基本上,通过这种方式,我找到了圆弧的中心,并且amount cm是半径。

现在我必须发明一个公式来实现可变半径,具体取决于页面。我得出的结果是 2cm + 5n^2,其中 n 是页面数。我通过反复试验找到了这个公式。

现在,如果您想查看“幕后”图片,只需注释掉该\clip行(显示构成书页的所有矩形),并取消注释最后几行有关调试的代码,这些代码绘制了剪切轮廓和每个圆弧的中心。您将获得以下内容:

幕后

相关内容