如何在 tikz 中复制路径并围绕其中点旋转副本?
我想复制圆圈内的线(如下图所示,使用 MWE),然后垂直(或任何我想要的角度)穿过原始线绘制它。
非常感谢您的帮助,Pseudonym123
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{intersections}
\begin{document}
\begin{tikzpicture}[scale=0.3]
\path[name path=circle,draw] (0,0) circle [radius=5cm];
\path[name path=line127] (3,0) -- ++(127:10);
\path[name intersections={of=circle and line127}]
(intersection-1);
\path[save path=\name](3,0) -- (intersection-1);
\path[draw,rotate=90,use path=\name];%<--- this part isn't rotating
\end{tikzpicture}
\end{document}
答案1
如果您只需要在坐标(而不是节点)之间旋转直线,我建议自定义to path
实际起点calc
。这样您仍然可以沿路径放置节点。
我将overlay
其放在不可见的位置line127
,以便边界框不会更新,并通过 命名交叉点,\tikzset
因为不需要使用\path
。
代码
\documentclass[tikz]{standalone}
\usetikzlibrary{intersections, calc}
\tikzset{
rotate straight line/.default=90,
rotate straight line/.style={
to path={
coordinate (@middle@) at ($(\tikztostart)!.5!(\tikztotarget)$)
($(@middle@)!1!#1:(\tikztostart)$)--($(@middle@)!1!#1:(\tikztotarget)$)
\tikztonodes}}}
\begin{document}
\begin{tikzpicture}[scale=0.3]
\path[name path=circle, draw] (0,0) circle [radius=5cm];
\path[name path=line127, overlay] (3,0) -- ++(127:10);
\tikzset{name intersections={of=circle and line127}}
\draw[help lines] (3,0) -- (intersection-1);
\draw (3,0) to[rotate straight line] (intersection-1);
\draw[red] (3,0) to[rotate straight line=45] (intersection-1);
\end{tikzpicture}
\end{document}
输出
答案2
我不明白 Qrrbrbirlbel 的问题。使用软件包tkz-euclide
(我是初学者),我想出了这个。
\documentclass[border=3mm]{standalone}
\usepackage{tkz-euclide}
\begin{document}
\begin{tikzpicture}[scale=0.3]
\tkzDefPoints{0/0/P,3/0/A}
\coordinate (B) at ($(A)+(127:10)$);% we can use tikz
% (AB) is your line127
\tkzDefCircle[R](P,5) \tkzGetPoint{C}
\tkzDrawCircles(P,C)
\tkzInterLC[near](A,B)(P,C) \tkzGetPoints{d}{D}
\tkzDrawSegment(A,D)% D is the intersection point
\tkzDefMidPoint(A,D) \tkzGetPoint{M}
%\tkzDrawPoints(A,D,M)
\tkzDefPointBy[rotation in rad= center M angle -pi/2](A) \tkzGetPoint{A'}
\tkzDefPointBy[rotation in rad= center M angle -pi/2](D) \tkzGetPoint{D'}
%\tkzDrawPoints(A',D')
\tkzDrawSegment(A',D')
%\tkzLabelPoints(A,D,M,A',D')
\end{tikzpicture}
\end{document}
答案3
这是一个使用的解决方案spath3
库(它最近在 CTAN 上更新,因此您可能需要更新您的发行版)。此库允许您保存路径,然后对其进行操作,包括应用变换。键transform
上的选项use
允许您在重新使用路径之前指定要应用于路径的变换,spath cs
坐标系允许您指定沿路径的坐标。因此,使用rotate around
键,做您想做的事情并不难。
\documentclass{article}
%\url{https://tex.stackexchange.com/q/664167/86}
\usepackage{tikz}
\usetikzlibrary{
intersections,
spath3
}
\begin{document}
\begin{tikzpicture}[scale=0.3]
\path[name path=circle,draw] (0,0) circle [radius=5cm];
\path[name path=line127] (3,0) -- ++(127:10);
\path[name intersections={of=circle and line127}]
(intersection-1);
\path[draw,red,spath/save=name](3,0) -- (intersection-1);
\path[draw,blue,
spath/use={
name,
transform={
rotate around={90:(spath cs:name .5)}
}
}
];%<--- this part isn't rotating
\end{tikzpicture}
\end{document}
我还绘制了原始路径,以便您可以看到它按照您的要求执行:
答案4
这更像是一个评论而不是一个答案。
对于路径,复制/拷贝、围绕某个点旋转等都是通常路径操作;并且可以在普通的 Asymptote 中用口号“顺其自然“, 看简单代码下面。即使之前不了解 Asymptote 编程,也可以阅读并理解它。
该spath3
库增强了 TikZ 的path
操作(参见 Andrew 的回答)。即使不使用此库,仍可以在纯 TikZ 中使用一些棘手的代码完成任务。在我看来,这并不是 TikZ 的真正缺陷;这只是 TikZ 简化绘图方式的方式。
% https://www.overleaf.com/read/pjqpgyztmwcf
\documentclass{standalone}
\usepackage{asymptote}
\begin{document}
\begin{asy}
// http://asymptote.ualberta.ca/
size(6cm);
path cir=circle((0,0),5);
pair A=(3,0), B=A+10dir(127);
path line1=A--B;
pair C=intersectionpoint(cir,line1);
pair M=(A+C)/2;
dot(M,blue);
// choose 90 for perpendicular one
real al=90, be=45;
path line2=rotate(al,M)*(A--C);
path line3=rotate(be,M)*(A--C);
draw(cir);
draw(line1,lightblue+.8pt+opacity(.5));
draw(A--C,blue);
draw(line2,red);
draw(line3,orange);
\end{asy}
\end{document}