![如何绘制线段和圆弧之间的平滑连接?](https://linux22.com/image/337024/%E5%A6%82%E4%BD%95%E7%BB%98%E5%88%B6%E7%BA%BF%E6%AE%B5%E5%92%8C%E5%9C%86%E5%BC%A7%E4%B9%8B%E9%97%B4%E7%9A%84%E5%B9%B3%E6%BB%91%E8%BF%9E%E6%8E%A5%EF%BC%9F.png)
我正在尝试创建以下路径:
\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 解决方案(使用calc
和let
计算坐标和角度):
\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}