请考虑以下示例:
\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)