箭

请考虑以下示例:

在此处输入图片描述

\documentclass{article}

\usepackage{pstricks-add}

\begin{document}

\begin{pspicture}(0,-0.25)(4,6.25)
 \pnode(2,0){A}
 \pnode(0,4){B}
 \pnode(2,6){C}
 \pnode(4,4){D}
 \rput(1.5,3.5){\small{$A$}}
 \rput(1.5,4.5){\small{$B$}}
 \rput(2.5,4.5){\small{$C$}}
 \rput(2.5,3.5){\small{$D$}}
 \multido{\iA=0+1}{7}{\psline[linestyle=dashed,linecolor=blue](0,\iA)(4,\iA)}
 \multido{\iB=0+1}{5}{\psline[linestyle=dashed,linecolor=blue](\iB,0)(\iB,6)}
 \psline[linewidth=1.25pt](A)(C)
 \psline[linewidth=1.25pt](B)(D)
 \pspolygon[linewidth=2pt,linecolor=red](A)(B)(C)(D)
 \pscurve[linewidth=1pt]{->}(2.75,4.75)(2.8,5.25)(2.65,5.75)(2,6.25)(1.25,6)(0.75,5.25)
 \pscurve[linewidth=1pt]{->}(2.5,2.5)(2.95,1)(2.65,0.2)(2,-0.25)(1,0)(0.5,1.5)
\end{pspicture}

\end{document}

如何让弯曲的箭头变得平滑?

我猜想该\psbezier函数是实现该目的的方法,但我无法使它看起来美观,因此非常感谢您的帮助。

更新

如果有人发现该图有用,这里是代码的概括:

\documentclass[a4paper]{article}

\usepackage[hmargin=2.4cm,vmargin=3cm]{geometry}
\usepackage{subcaption}
\usepackage{auto-pst-pdf,pstricks-add}
\usepackage{expl3}

\ExplSyntaxOn
 \cs_new_eq:NN
  \calculate
 \fp_eval:n
\ExplSyntaxOff

\newcommand*{\betegn}[3]{%
  \rput(!#1 4 div \figur\space mul #2 4 div \figur\space mul){\small{$#3$}}
}

\begin{document}

\begin{figure}[htbp]
% Figure number.
\def\figur{2}
% Constants.
\def\hoejde{\calculate{3*\figur}}
\def\bredde{\calculate{2*\figur}}
\def\faktorA{\calculate{\hoejde+1}}
\def\faktorB{\calculate{\bredde+1}}
\def\faktorC{\calculate{\hoejde-1}}
\def\faktorD{\calculate{\figur-1}}
\def\skalering{\calculate{2.5/\figur}}
\centering
\psset{
 unit=\skalering
}
\begin{subfigure}{0.58\textwidth}
 \centering
  \begin{pspicture}(\bredde,\hoejde)
   \pnode(!\figur\space 0){A}
   \pnode(!0 \bredde\space){B}
   \pnode(!\figur\space \hoejde\space){C}
   \pnode(!\bredde\space \bredde\space){D}
   \betegn{3}{7}{A}
   \betegn{3}{9}{B}
   \betegn{5}{9}{C}
   \betegn{5}{7}{D}
  \psset{
   linestyle=dashed,
   linecolor=blue
  }
   \multido{\iA=0+1}{\faktorA}{\psline(0,\iA)(\bredde\space,\iA)}
   \multido{\iB=0+1}{\faktorB}{\psline(\iB,0)(\iB,\hoejde\space)}
  \psset{
   linewidth=1.25pt,
   linestyle=solid,
   linecolor=black
  }
   \psline(A)(C)
   \psline(B)(D)
   \pspolygon[linewidth=2pt,linecolor=red](A)(B)(C)(D)
  \end{pspicture}
 \subcaption{Before the rearrangement.}
\end{subfigure}
\begin{subfigure}{0.38\textwidth}
 \centering
  \begin{pspicture}(\figur,\hoejde)
   \pnode(0,0){A}
   \pnode(!0 \bredde\space){B}
   \pnode(!0 \hoejde\space){C}
   \pnode(!\figur\space \hoejde\space){D}
   \pnode(!\figur\space \bredde\space){E}
   \pnode(!\figur\space 0){F}
   \betegn{3}{7}{A}
   \betegn{3}{9}{B}
   \betegn{1}{11}{C}
   \betegn{1}{1}{D}
  \psset{
   linestyle=dashed,
   linecolor=blue
  }
   \multido{\iC=1+1}{\faktorC}{\psline(0,\iC)(\figur\space,\iC)}
   \multido{\iD=1+1}{\faktorD}{\psline(\iD,0)(\iD,\hoejde\space)}
  \psset{
   linewidth=1.25pt,
   linestyle=solid,
   linecolor=black
  }
   \pspolygon(A)(C)(D)(F)
   \psline(B)(E)
   \psline[linewidth=2pt,linecolor=red](F)(B)(D)
  \end{pspicture}
 \subcaption{After the rearrangement.}
\end{subfigure}
\caption{Figure~$\figur$.}
\end{figure}

\end{document}

您所要做的就是改变的值\figur

该文档可以用 进行编译pdflatex -shell-escape filename.tex

答案1

您可以使用该包\pst-bezier,它为您提供了更好的贝塞尔函数\psbcurve。此包还允许使用各种修改器来帮助您调整曲线。这种方法的唯一问题是箭头不起作用。

\documentclass{article}

\usepackage{pstricks-add}
\usepackage{pst-bezier}

\begin{document}

\begin{pspicture}[showgrid=true](0,-0.25)(4,6.25)
 \pnode(2,0){A}
 \pnode(0,4){B}
 \pnode(2,6){C}
 \pnode(4,4){D}
 \pnode(2,4){E}
 \rput(1.5,3.5){\small{$A$}}
 \rput(1.5,4.5){\small{$B$}}
 \rput(2.5,4.5){\small{$C$}}
 \rput(2.5,3.5){\small{$D$}}
% \multido{\iA=0+1}{7}{\psline[linestyle=dashed,linecolor=blue](0,\iA)(4,\iA)}
% \multido{\iB=0+1}{5}{\psline[linestyle=dashed,linecolor=blue](\iB,0)(\iB,6)}
 \psline[linewidth=1.25pt](A)(C)
 \psline[linewidth=1.25pt](B)(D)
 \pspolygon[linewidth=2pt,linecolor=red](A)(B)(C)(D)
 \pscurve[linecolor=blue,linewidth=1pt]{->}(2.75,4.75)(2.8,5.25)(2.65,5.75)(2,6.25)(1.25,6)(0.75,5.25)
 \pscurve[linecolor=blue,linewidth=1pt]{->}(2.5,2.5)(2.95,1)(2.65,0.2)(2,-0.25)(1,0)(0.5,1.5)

  \psset{showpoints=false,linecolor=red,linewidth=2pt,arrows=->,arrowscale=1.5}
  \psbcurve(2.75,4.75)(2.5,6)(1.5,6.5)(0.75,5.25)
  \psbcurve(2.5,2.5)(3,0.5)(1,0)(0.5,1.5)

\end{pspicture}

\end{document}

我已将我的贝塞尔曲线(红色)叠加在你的曲线(蓝色)上。

在此处输入图片描述

为了获得箭,你还需要做更多的工作......

通过端点以及第一个和最后一个控制插值的线将与曲线相切。如果你能算出这些插值点的值,你可以通过以下方式创建箭头:

\ncnode[nodesepA=<value>,arrows=->]{interpolation_point}{end_point}

您必须创建节点才能执行此操作。如果您设置了showpoints=true该节点,则可以帮助您猜测在哪里定义节点插值点事实上,你不必真正获取插值点,你只需要获取一个与最后一个插值点和曲线终点形成的曲线相匹配的点。

经过一些调整(使用显示线条功能)

  \pnode(0.50,0){interpolationA}
  \pnode(0.5,1.5){endpointA}
  \ncline[nodesepA=4em,nodesepB=-0.1]{interpolationA}{endpointA}

导致:

在此处输入图片描述

您可以对另一侧做类似的事情。

\documentclass{article}
\usepackage{pst-node}
\usepackage{pstricks-add}
\usepackage{pst-bezier}
\pagestyle{empty}
\begin{document}

\begin{pspicture}[showgrid=true](0,-0.25)(4,6.25)
 \pnode(2,0){A}
 \pnode(0,4){B}
 \pnode(2,6){C}
 \pnode(4,4){D}
 \pnode(2,4){E}
 \rput(1.5,3.5){\small{$A$}}
 \rput(1.5,4.5){\small{$B$}}
 \rput(2.5,4.5){\small{$C$}}
 \rput(2.5,3.5){\small{$D$}}
 % \multido{\iA=0+1}{7}{\psline[linestyle=dashed,linecolor=blue](0,\iA)(4,\iA)}
 % \multido{\iB=0+1}{5}{\psline[linestyle=dashed,linecolor=blue](\iB,0)(\iB,6)}
 \psline[linewidth=1.25pt](A)(C)
 \psline[linewidth=1.25pt](B)(D)
 \pspolygon[linewidth=2pt,linecolor=red](A)(B)(C)(D)
 % \pscurve[linecolor=blue,linewidth=1pt]{->}(2.75,4.75)(2.8,5.25)(2.65,5.75)(2,6.25)(1.25,6)(0.75,5.25)
 % \pscurve[linecolor=blue,linewidth=1pt]{->}(2.5,2.5)(2.95,1)(2.65,0.2)(2,-0.25)(1,0)(0.5,1.5)

  \psset{showpoints=false,linecolor=red,linewidth=2pt,arrows=->,arrowscale=1.5}
  \psbcurve(2.75,4.75)(2.5,6)(1.5,6.5)(0.75,5.25)
  \psbcurve(2.5,2.5)(3,0.5)(1,0)(0.5,1.5)

  \pnode(0.50,0){interpolationA}
  \pnode(0.5,1.5){endpointA}
  \ncline[nodesepA=4em,nodesepB=-0.1]{interpolationA}{endpointA}

  %\psset{linecolor=black}
  \pnode(1.15,6.5){interpolationB}
  \pnode(0.75,5.25){endpointB}
  \ncline[nodesepA=4em,nodesepB=-0.2]{interpolationB}{endpointB}

\end{pspicture}

\end{document}

在此处输入图片描述

nodesepA请注意,我用和调整了曲线的两端nodesepB

答案2

获得更好形状的唯一方法是调整点。打开showpoints可让我们轻松调整点。

在此处输入图片描述

\documentclass[pstricks,border=12pt]{standalone}
\usepackage{pst-eucl}

\addtopsstyle{gridstyle}
{
    gridcolor=blue!50,
    griddots=10,
    gridlabels=0pt,
}

\begin{document}
\begin{pspicture}(0,-0.25)(4,6.25)
    \pstGeonode[PointName=none,PointSymbol=none]
        (2,0){A}
        (0,4){B}
        (2,6){C}
        (4,4){D}
        %(2,4){E} <-- I don't know why the questioner defined this unused node.
    \rput(1.5,3.5){\small{$A$}}
    \rput(1.5,4.5){\small{$B$}}
    \rput(2.5,4.5){\small{$C$}}
    \rput(2.5,3.5){\small{$D$}}
    \psgrid[style=gridstyle](0,0)(0,0)(4,6)
    \psset{linewidth=1.25pt}
    \psline(A)(C)
    \psline(B)(D)
    \pspolygon[linewidth=2pt,linecolor=red](A)(B)(C)(D)
    \psset{linewidth=1pt,arrows=->,showpoints}
    \pscurve(2.75,4.75)(2.8,5.25)(2.65,5.75)(2,6.25)(1.25,6)(0.75,5.25)
    \pscurve(2.5,2.5)(2.95,1)(2.65,0.2)(2,-0.25)(1,0)(0.5,1.5)
\end{pspicture}
\end{document}

答案3

带包装pst-bspline

 \psBspline[linewidth=1pt,arrows=->]{A}(2.75,4.75)(2.8,5.25)(2.65,5.75)(2,6.25)(1.25,6)(0.75,5.25)
\psBspline[linewidth=1pt,arrows=->]{B}(2.5,2.5)(2.95,1)(2.65,0.2)(2,-0.25)(1,0)(0.5,1.5)

相关内容