考虑下面的代码。在scope
环境中,我使用剪辑将椭圆保持在点之间。通过阅读,我知道使用命令,let
我可以通过在 let 命令中定义点来访问点的坐标\p2 = (P2)
。我可以访问剪辑中使用的坐标吗?
目标是,如果我改变P2
,剪辑也会改变。
\documentclass[tikz, border=5mm]{standalone}
\usetikzlibrary{arrows,calc, decorations.markings, intersections}
\begin{document}
\begin{tikzpicture}[
dot/.style = {outer sep = +0pt, inner sep = +0pt, shape = circle, draw = black, label = {#1}},
small dot/.style = {minimum size = 1pt, dot = {#1}},
big dot/.style = {minimum size = 2pt, dot = {#1}},
line join = round, line cap = round, >=triangle 45
]
\node[ fill = black, big dot = {below: \(F\)}] (F) at (0, 0) {};
\node[ fill = black, big dot = {below: \(P_1\)}] (P1) at (2, 0) {};
\node[ fill = black, big dot = {above right=.25cm:\(P_2\)}] (P2) at (-2, 2) {};
\begin{pgfinterruptboundingbox}
\begin{scope}[decoration = {markings,
mark = at position 0.5 with {\arrow{>}}
}]
\clip (2, 0) -- (-2, 0) -- (-2, 2.2) -- (2, 2.2) -- cycle;
\draw[name path global = ellp, postaction = decorate] let
\p0 = ($(P2) - (F)$),
\p1 = ($(P1) - (P2)$)
in (P2|-P1) ++ (\x1, 0) arc (0:100: \x1 and \y0);
\end{scope}
\end{pgfinterruptboundingbox}
\path[name path = aux1] (P2) circle [radius = 1bp];
\draw[name intersections = {of = ellp and aux1}, -latex] (P2) --
($(intersection-2)!.75cm!(intersection-1)$);
\draw [-latex] (P2) --
($(P2)!0.75cm!-90:($(intersection-2)!.75cm!(intersection-1)$)$);
\end{tikzpicture}
\end{document}
答案1
直接回答你的问题:是的,您可以将let..in
语法用作命令的一部分\clip
。例如:
\clip let \p1=(P2) in (\x1,\y1) rectangle (P1);
这将允许您对单独的 x 和 y 坐标进行一些算术运算,但是有一个缺点:您需要指定添加或减去的常数的单位,例如:
\clip let \p1=(P2) in (\x1 + 0.5cm, \y1) rectangle (P1);
如果您不指定单位,tikz 将使用pt
默认值。由于点非常小,因此仅使用 不会看到任何变化\x1+0.5
。
指定单位并不是最佳选择,因为这会使图形不易缩放。例如,如果您给出选项x=5mm
,则所有无量纲坐标都会减半,但常量0.5cm
不会。
A更好的解决方案是使用计算表达式,例如:
\clip ($(P2)+(0.5, 0)$) rectangle (P1);
这不仅语法更清晰,而且无需指定常量的尺寸(0.5, 0)
,因此图像很容易缩放。请注意,使用这类表达式\usetikzlibrary{calc}
是必需的(但你无论如何都有)。