TikZ 代码审查请求:通过两点从内部指向圆圈的箭头

TikZ 代码审查请求:通过两点从内部指向圆圈的箭头

底部的代码生成了正确的绘图,如下所示。问题是我不认为我以最好的方式绘制了它;特别是,我真的不喜欢必须构造 (X) 或 (Y)(我宁愿指定半径为 2,并且射线应该沿 (p) 方向行进)。

有人可以告诉我一个更好的方法吗?

\begin{tikzpicture}
\node [fill=black, shape=circle, inner sep=1pt, label=below:$O$] (O) at (0,0) {};
\node [fill=black, shape=circle, inner sep=1pt, label=below:$p$] (p) at (0.6,1.2) {};
\node [fill=black, shape=circle, inner sep=1pt, label=below:$f(p)$] (fp) at 
(-1.2,0.7) {};
\coordinate (X) at (2,0);
\coordinate (Y) at (2.4, 1.7);
\node (C) [name path=C, draw, circle through=(X)] at (O) {};
\path [name path=fp--Y] (fp)--(Y);
\path [name intersections={of=fp--Y and C, by=F}];
\node [fill=black, shape=circle, inner sep=1pt, label=right:$r(p)$] (rp) at (F) {};
\draw [->] (fp)--(rp);
\end{tikzpicture}

正确输出

答案1

这是一个稍微简单一些的提议。假设您喜欢您的代码,除了需要手动放置 Y 之外,这里有一个简单的修复方法。乍一看,这个代码似乎比 @Zarko 的代码更笨重,但这只是因为我添加了您和 @Zarko 的代码中都缺少的东西:正确确定边界框。此代码还在圆外找到合适的 Y,以便可以计算所需的交点,但这里没有硬编码长度 2,如果 p 和 fp 选择不同,这将使 @Zarko 的代码失败。此外,实际上不需要acos计算,TiZ 在 calc 库中已经内置了这个,相关语法是($ (fp) ! 2*veclen(\x1,\y1) ! (p) $)。这里,veclen(\x1,\y1)是圆的半径,Y 和 (fp) 之间的距离选择为该半径的 2 倍,这样辅助线肯定会与圆相交。

\documentclass[tikz,border=3.14pt,varwidth]{standalone}
\usetikzlibrary{through,calc,intersections}
\begin{document}
\begin{tikzpicture}
\node [fill=black, shape=circle, inner sep=1pt, label=below:$O$] (O) at (0,0) {};
\node [fill=black, shape=circle, inner sep=1pt, label=below:$p$] (p) at (0.6,1.2) {};
\node [fill=black, shape=circle, inner sep=1pt, label=below:$f(p)$] (fp) at 
(-1.2,0.7) {};
(0.4,0.7) {};
\coordinate (X) at (2,0);
\node (C) [name path=C, draw, circle through=(X)] at (O) {};
% store the original boundary box
\begin{pgfinterruptboundingbox}
% automatically find a suitable Y : draw a line of length twice the radius
% starting from (fp) to the (t) direction (no acos computation is required)
\path let \p1 = ($ (O) - (X) $) in coordinate (Y) at ($ (fp) ! 2*veclen(\x1,\y1) ! (p) $); 
\path [name path=fp--Y] (fp)--(Y);
\path [name intersections={of=fp--Y and C, by=F}];
% restore the original boundary box
\end{pgfinterruptboundingbox}
\node [fill=black, shape=circle, inner sep=1pt, label=right:$r(p)$] (rp) at (F) {};
\draw [->] (fp)--(rp);
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案2

你可以基本上跳过 X 和 Y 定义,将线拉长到你认为会与圆相交的方向。为此,你要么得到角度,要么知道某个东西肯定沿着那个方向(这里我使用了O.east

\documentclass[tikz]{standalone}
\usetikzlibrary{intersections,calc}
\begin{document}
\begin{tikzpicture}[mydot/.style={fill=black,circle,inner sep=1pt,label={below:#1}}]
\path node [circle,draw,name path=C,minimum height=4cm](O) at (0,0) {} node[mydot=$O$]
      at(O.center){} node[mydot=$p$](p) at(0.5,1) {} node [mydot=$f(p)$] (fp) at (-1,0) {};
\path [overlay,name path=fp--Y] (fp)--($(fp)!($2*(O.east)$)!(p)$);
\path [name intersections={of=fp--Y and C, by=F}];
\node [fill=black, shape=circle, inner sep=1pt, label=right:$r(p)$] (rp) at (F) {};
\draw [->] (fp)--(p)--(rp);
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容