如何绘制线段和圆弧之间的平滑连接?

如何绘制线段和圆弧之间的平滑连接?

我正在尝试创建以下路径:

 \documentclass{article}
 \usepackage{tkz-euclide}
 \usetkzobj{all}
 \begin{document}
 \begin{tikzpicture}[scale=1]
 %\tkzInit[xmin=-5.1, xmax=12.1, ymin=-5.5, ymax=5]
 %\tkzClip
 \tkzDefPoints{0/0/O, 3/4/C, -3/4/B, 0/-5/o}
 \tkzDefPointBy[homothety=center o ratio .75](B)\tkzGetPoint{b}
 \tkzDefPointBy[homothety=center o ratio .75](C)\tkzGetPoint{c}
 \tkzDrawArc[thick,color=black](O,B)(C)
 \tkzDrawSegments[thick](B,b b,c c,C)
 \end{tikzpicture}
 \end{document}

结果是: 在此处输入图片描述

如果你编译这个,你会发现连接并不完美。这是被剪掉的部分(这是“猫”左耳的尖端):

在此处输入图片描述

如何修复它。我觉得应该有一个简单的方法。实际上它存在于 TixZ 中,但我不知道如何从 B 到 C 绘制以 O 为中心的圆弧(tikz-euclid 确实提供了此功能)。我很感激对这两个问题的回答。在此先感谢大家。

答案1

这里有一个纯的TikZ 解决方案(使用calclet计算坐标和角度):

\documentclass[tikz,margin=3mm]{standalone}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
  \path
  (0,0) coordinate (O)
  (3,4) coordinate (C)
  (-3,4) coordinate (B)
  (0,-5) coordinate (o)
  ($(o)!.75!(B)$) coordinate (b)
  ($(o)!.75!(C)$) coordinate (c);

  \draw[line width=5mm] let
  \p1=(B), \n1={atan2(\y1,\x1)},
  \p2=(C), \n2={atan2(\y2,\x2)},
  \n3={veclen(\x1,\y1)}
  in (B) arc(\n1:\n2+360:\n3) -- (c) -- (b) -- cycle;
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案2

问题在于它们是两条不同的曲线。解决这个问题的一种方法是将所有内容绘制TikZ为一条曲线。

更新:我按照下面评论中@cfr 的建议将其改为和(单位为 pt \pgfmathparse ... \edef ...\pgfmathsetmacro\pgfmathsetlengthmacro

在此处输入图片描述

 \documentclass{article}
 \usepackage{tkz-euclide}
 \usetkzobj{all}
 \begin{document}
 \begin{tikzpicture}[scale=1]
 %\tkzInit[xmin=-5.1, xmax=12.1, ymin=-5.5, ymax=5]
 %\tkzClip
 \tkzDefPoints{0/0/O, 3/4/C, -3/4/B, 0/-5/o}
 \tkzDefPointBy[homothety=center o ratio .75](B)\tkzGetPoint{b}
 \tkzDefPointBy[homothety=center o ratio .75](C)\tkzGetPoint{c}
 \coordinate (OB) at ($(B) - (O)$);  % get coordinate of B when origin is O
 \coordinate (OC) at ($(C) - (O)$);
 \path (OB); \pgfgetlastxy{\XB}{\YB}  % extract x,y-coordinates of B
 \path (OC); \pgfgetlastxy{\XC}{\YC}
% old code
% \pgfmathparse{atan2(\YB,\XB) - 360}   % compute the polar angle
% \edef\leftangle{\pgfmathresult}       % store result in \leftangle
% \pgfmathparse{atan2(\YC,\XC)}
% \edef\rightangle{\pgfmathresult}
% \pgfmathparse{veclen(\XB,\YB)}        % compute the radius
% \edef\radius{\pgfmathresult}

%% new code after @cfr's suggestion
\pgfmathsetmacro\leftangle{atan2(\YB,\XB) - 360}
\pgfmathsetmacro\rightangle{atan2(\YC,\XC)}
\pgfmathsetlengthmacro\radius{veclen(\XB,\YB)}
\clip ($(B) + (-1em,1em)$) rectangle ($(C|-c) + (1em,-1em)$);
\draw[thick,red] (B) arc[start angle=\leftangle,end
angle=\rightangle,radius=\radius] -- (c) -- (b) --cycle;
 \end{tikzpicture}
 \end{document}

相关内容