自动 tikz 坐标计算

自动 tikz 坐标计算

现在我已经定义了这些:

\coordinate (Z1) at (0.9,0.5);
\coordinate (Z2) at (0.816,-0.112);
\coordinate (Z3) at (0.46848,-0.46336);

但我真的希望将其自动化为:

在此处输入图片描述

这样我只需指定 Z1,然后轻松改变 α 因子即可获得 Z2 和 Z3。(目前 α = 0.8)

最简单的方法是什么?我知道如何进行一些坐标计算,但这超出了我目前的技能范围。


编辑:FWIW(无论如何)这也可以表示为坐标变换 H = [1 alpha; -alpha 1]/(1+alpha^2),所以也许这是值得使用的东西。我不知道如何强制 tikz 计算变换后的坐标。

答案1

你可以做这样的事情:

\documentclass[border=3mm,tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\pgfmathsetmacro{\Xi}{0.9}
\pgfmathsetmacro{\Yi}{0.5}
\pgfmathsetmacro{\Coeff}{0.8}

\pgfmathsetmacro{\Xii}{(\Xi+\Coeff*\Yi)/(1+\Coeff^2)}
\pgfmathsetmacro{\Yii}{(\Yi-\Coeff*\Xi)/(1+\Coeff^2)}
\pgfmathsetmacro{\Xiii}{(\Xii+\Coeff*\Yii)/(1+\Coeff^2)}
\pgfmathsetmacro{\Yiii}{(\Yii-\Coeff*\Xii)/(1+\Coeff^2)}

\coordinate (Z1) at (\Xi,\Yi);
\coordinate (Z2) at (\Xii,\Yii);
\coordinate (Z3) at (\Xiii,\Yiii);

\draw (Z1) -- (Z2) -- (Z3);

\end{tikzpicture}
\end{document}

具有 4 个参数宏的版本:

\documentclass[tikz,border=2mm]{standalone}
\newcommand{\defcoords}[4][Z]{%
\pgfmathsetmacro{\Xi}{#2}
\pgfmathsetmacro{\Yi}{#3}
\pgfmathsetmacro{\Coeff}{#4}

\pgfmathsetmacro{\Xii}{(\Xi+\Coeff*\Yi)/(1+\Coeff^2)}
\pgfmathsetmacro{\Yii}{(\Yi-\Coeff*\Xi)/(1+\Coeff^2)}
\pgfmathsetmacro{\Xiii}{(\Xii+\Coeff*\Yii)/(1+\Coeff^2)}
\pgfmathsetmacro{\Yiii}{(\Yii-\Coeff*\Xii)/(1+\Coeff^2)}

\coordinate (#11) at (\Xi,\Yi);
\coordinate (#12) at (\Xii,\Yii);
\coordinate (#13) at (\Xiii,\Yiii);
}

\begin{document}
\begin{tikzpicture}
\defcoords{0.9}{0.5}{0.8}
\draw (Z1) -- (Z2) -- (Z3);

\defcoords[C]{0.9}{0.5}{2}
\draw (C1) -- (C2) -- (C3);
\end{tikzpicture}
\end{document} 

答案2

一种使用 TikZ 强大let...in语法的解决方案,可生成简短且可读的代码:

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}

\begin{document}
\def\nextZ#1{
\path let
      \p1 = (Z#1),
      \n1 = {(\x1+\coeff*\y1)/(1+\coeff^2)}, 
      \n2 = {(\y1-\coeff*\x1)/(1+\coeff^2)},
      \n3 = {int(#1+1)},
      \p2 = (\n1,\n2)
   in 
      (\p2) coordinate (Z\n3);
}

\begin{tikzpicture}[scale=2]
\coordinate (Z1) at (0.9,0.5);
\def\coeff{0.8}

\foreach \z in {1,2,3,4,5} {
 \fill[red] (Z\z) circle(2pt) node[black,above]{$Z_\z$};
  \nextZ\z
}

\end{tikzpicture}    
\end{document}

结果

答案3

使用 Lua 和 LuaLaTeX 的解决方案:

\documentclass{article}
\usepackage{luacode}
\usepackage{tikz}

\begin{document}
\luaexec{
tp = tex.print
local alfa = 0.8
local k = 1 + (0.8 * 0.8)
x = {}
y = {}
x[1] = 0.9
y[1] = 0.5
for i = 2, 3 do
    x[i] = (x[i-1] + alfa * y[i-1]) / k
    y[i] = (y[i-1] - alfa * x[i-1]) / k
end
tp("\\begin{tikzpicture}[scale=3]")
tp("\\coordinate (Z1) at ("..x[1]..","..y[1]..");")
tp("\\coordinate (Z2) at ("..x[2]..","..y[2]..");")
tp("\\coordinate (Z3) at ("..x[3]..","..y[3]..");")
tp("\\draw[-latex] (Z1)node[left]{$Z1$}--(Z2) node[right]{$Z2$};")
tp("\\draw[-latex] (Z2)--(Z3) node[right]{$Z3$};")
tp("\\end{tikzpicture}")
}

\end{document}

在此处输入图片描述

对于超过 3 个坐标计算,例如 10:

\documentclass{article}
\usepackage{luacode}
\usepackage{tikz}

\begin{document}
\luaexec{
tp = tex.print
tp("\\begin{tikzpicture}[scale=3]")
local n = 10 
local alfa = 0.8
local k = 1 + (0.8 * 0.8)
x = {}
y = {}
x[1] = 0.9
y[1] = 0.5
for i = 2, n do
    x[i] = (x[i-1] + alfa * y[i-1]) / k
    y[i] = (y[i-1] - alfa * x[i-1]) / k
tp("\\draw[-latex] ("..x[i-1]..","..y[i-1].."])--("..x[i]..","..y[i]..");")
end
tp("\\end{tikzpicture}")
}

\end{document}

在此处输入图片描述

答案4

我认为递归公式需要递归:P

\documentclass[tikz]{standalone}

\def\myrecursion#1#2#3#4{%
  \ifnum#4>0\relax%
    \pgfmathsetmacro{\tempx}{(#1+#3*#2)/(1+(#3)^2)}
    \pgfmathsetmacro{\tempy}{(#2-#3*#1)/(1+(#3)^2)}
    \pgfmathtruncatemacro{\tempc}{(#4-1)}
    \draw[line cap=round,->,very thin] (#1 cm,#2 cm)--(\tempx cm,\tempy cm);
    \edef\temp{\noexpand\myrecursion{\tempx}{\tempy}{#3}{\tempc}}\temp%
  \fi%
}

\begin{document}
\begin{tikzpicture}
\myrecursion{0.9}{0.5}{0.8}{10}
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容