我已经开始使用asymptote
并且非常喜欢它作为 的替代品TikZ
。我怀念的是TikZ
的功能,它说“在从到 的(A)!0.5!42:(B)
线段上走一半,然后逆时针旋转 到度”。我可以想象在 中有通过几何图元实现这一点的方法。但是,我还希望有一种惯用的方法来实现它。有什么想法/参考吗?A
B
42
asymptote
答案1
到目前为止,Asymptote 还没有内置函数来处理该部分修改器(旋转并采取部分路程)。但是,我们可以轻松地为该任务创建一个新的 Asymptote 命令!TikZ 和 Asymptote 代码都提供了以供比较。
\documentclass[border=5mm]{standalone}
\usepackage[inline]{asymptote}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\draw[violet!50,thin] (0,0) grid (6,5);
\path
(1,1) coordinate (A) node[left]{$A$}
(5,3) coordinate (B) node[right]{$B$}
($(A)!.7!20:(B)$) coordinate (C) node[above left]{$C$}
% for comparison
([rotate around={20:(A)}]B) coordinate (Bt) node[right]{$B'$}
%($(A)!.7!(Bt)$) coordinate (C) node[right]{$C$}
;
\draw[dashed] (A)--(Bt);
\draw (A)--(B);
\draw[red] (A)--(C);
\fill (C) circle(1.5pt);
\end{tikzpicture}
\hspace{5mm}
\begin{asy}
unitsize(1cm);
import math; // for grid
add(grid(6,5,purple+white));
pair RnP(pair A, pair B, real deg=0, real pos){
pair Bt=rotate(deg,A)*B;
pair C=pos*Bt+(1-pos)*A;
return C;
}
pair A=(1,1), B=(5,3);
pair Bt=rotate(20,A)*B;
pair C=RnP(A,B,20,.7);
draw(A--Bt,dashed);
draw(A--B);
draw(A--C,red);
label("$A$",A,W);
label("$B$",B,E); label("$B'$",Bt,E);
label("$C$",C,NW);
dot(C);
\end{asy}
\end{document}
PS:我们可以用更短的代码编写函数
pair RnP(pair A, pair B, real deg=0, real pos){
return (1-pos)*A+pos*(rotate(deg,A)*B);
}
或(根据交换律),
pair RnP(pair A, pair B, real deg=0, real pos){
return rotate(deg,A)*(pos*B+(1-pos)*A);
}