我尝试使用圆弧来获得下面的图片,但我必须为每个圆弧指定一个特定的中心,因为它们没有在它们应该结束的位置结束。我想使用曲线路径来定义填充区域,而不是圆弧。如何绘制或在我的代码中包含曲线路径?也许还有其他解决方案。我需要你的帮助。
\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
行(显示构成书页的所有矩形),并取消注释最后几行有关调试的代码,这些代码绘制了剪切轮廓和每个圆弧的中心。您将获得以下内容: