在MATLAB中绘制曲线文本
我希望沿着给定的向量(可能是任何东西——不一定是椭圆或直线)绘制文本。文本必须与曲线保持相切,如中所示 沿着一些简单的方程(直线或椭圆线)做这件事的方法在数学上相对简单。 但是,这在MATLAB中会很复杂:在MATLAB中绘制曲线文本,matlab,text,curve,Matlab,Text,Curve,我希望沿着给定的向量(可能是任何东西——不一定是椭圆或直线)绘制文本。文本必须与曲线保持相切,如中所示 沿着一些简单的方程(直线或椭圆线)做这件事的方法在数学上相对简单。 但是,这在MATLAB中会很复杂: 使用insertText()或vision.TextInserter将每个字符转换为图像 计算直线上每个字符的坐标 使用TFORM计算适当的变换 使用imwarp()为每个角色应用它 由于代码将创建至少数千个图像,每个图像都有几个字符,并将包括其他渲染操作,因此我正在寻找一种更简单/更经济的
有什么建议吗?如果这样可以解决问题,那么添加库不是问题。我也在寻找解决方案,并决定编写自己的: 如代码注释部分所述,输入
xy
是描述任何2D路径的2xn
矩阵。输入的str
是要打印的文本,varargin
允许您指定任何标准的名称、值
对,就像使用文本
一样
工作原理:
spline
和linspace(1,n,m+1)
一起将曲线参数化为m+1
等距段,其中m
是str
中的字符数
dXY
计算连续点对之间的差异
arrayfun
和atan2
计算每个字母的旋转角度(弧度)
XY=(XY(:,1:end-1)+XY(:,2:end))/2
对连续的点对求平均值,以便在m+1
插值点之间绘制m
字母
然后我们使用
文本
和旋转
属性(转换为度)循环每个字符。请注意,varargin
被输入到text
命令中。除了您的建议之外,我看不到任何其他方法。MATLAB用于数据分析和处理。。。也许可以创建一些好看的GUI,但从来没有像绘制与曲线向量相切的文本这样复杂的东西。在我看来,除了你已经描述过的,我认为没有一种简单的方法可以做到这一点!谢谢那么,你能推荐一些其他基于脚本的语言/环境来完成这项工作吗?如果你链接到的脚本对你来说足够好,那么你就可以了。Matlab可以比较好地集成Java
库。请看下面的例子:您的解决方案简短、优雅,而且比我的建议简单得多。尽管我最终用纯C/ImageMagick解决了这个问题,但您的解决方案确实解决了这个问题。谢谢@Geoff,我不能用这个来提供曲线文本:curvytext([10:20;(10:20)。^2],“这是一个测试”)
。如图所示:db.tt/Kr4Bn25H。@TobiasDK脚本的最后一行,axis equal
,对于保持纵横比很重要。如果在使用curvytext
后更改轴,字母看起来不会垂直于曲线,即使从技术上讲它们是垂直的。@TobiasDK如果必须具有不等的纵横比,一个想法是在varargin
之前添加第三个输入参数,例如c
,将字母旋转一个附加的常量值c
。通过使用这个值,你可能会得到想要的效果。@Geoff,谢谢你的回答。它不会给我所需的输出,所以我将在tikz-LaTeX:-)中完成它。你好。
function curvytext(xy,str,varargin)
%//
%// Input:
%// xy 2-by-n matrix of x (row 1) and y (row 2) coordinates
%// describing any 2D path
%// str length m string to be plotted
%// varargin standard variable arguments for modifying text
%// appearance
%//
if size(xy,1)>2; xy=xy'; end;
n = size(xy,2);
m = length(str);
XY = spline(1:n,xy,linspace(1,n,m+1));
dXY = XY(:,2:end)-XY(:,1:end-1);
theta = (arrayfun(@(y,x) atan2(y,x),dXY(2,:),dXY(1,:)))/2/pi*360;
XY = (XY(:,1:end-1)+XY(:,2:end))/2;
plot(XY(1,:),XY(2,:),'k-'); hold on;
for i=1:m
text(XY(1,i),XY(2,i),str(i),'rotation',theta(i),...
'horizontalalignment','center','verticalalignment','bottom',varargin{:});
end
axis equal
end