【问题标题】:Drawing curved text in MATLAB在 MATLAB 中绘制曲线文本
【发布时间】:2014-12-23 17:05:35
【问题描述】:

我希望沿着给定的矢量(可能是任何东西——不一定是椭圆或直线)绘制文本。文本必须保持与曲线相切,例如 this example

Java 中,沿着一些简单的方程(直线或椭圆线)执行此操作的方法相对简单。 但是,这在 MATLAB 中会很复杂:

  1. 使用 insertText()vision.TextInserter 将每个字符转换为图像
  2. 计算直线上每个字符的坐标
  3. 使用 TFORM 计算适当的转换
  4. 使用 imwarp() 为每个字符应用它

由于代码将创建至少数千张图像,每张图像都有几个字符,并且会包含其他渲染操作,因此我正在寻找一种更简单/更经济的方法。

此外,这在一般向量的情况下没有提供解决方案。

有什么建议吗?如果这样可以解决问题,添加库不是问题。

【问题讨论】:

  • 除了您提出的建议外,我看不到任何其他方式。 MATLAB 旨在用于数据分析和处理……也许可以创建一些漂亮的 GUI,但从来没有像绘制与弯曲矢量相切的文本那样复杂。 IMO,除了您已经描述的之外,我认为没有其他简单的方法可以做到!
  • 谢谢!那么你能推荐一些其他的基于脚本的语言/环境来完成这项工作吗?
  • 如果您链接到的java example 对您来说足够好,那么您就可以了。 Matlab 可以比较好的集成Java 库。看documentation

标签: matlab text curve


【解决方案1】:

我也在寻找解决方案,并决定自己编写:

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

如代码注释部分所述,输入xy 是一个描述任何二维路径的2-by-n 矩阵。输入 str 是要绘制的文本,varargin 允许您指定任何标准的 Name,Value 对,就像使用 text 一样。

工作原理:

splinelinspace(1,n,m+1) 一起将曲线参数化为m+1 等间距的片段,其中mstr 中的字符数。

dXY 计算连续点对之间的差异。

arrayfunatan2 计算每个字母的旋转角度(以弧度为单位)。

XY = (XY(:,1:end-1)+XY(:,2:end))/2; 对连续的点对进行平均,以便在m+1 插值点之间绘制m 字母。

然后我们使用textrotation 属性(转换为度数)遍历每个字符。注意varargin 被输入到text 命令中。

【讨论】:

  • 您的解决方案比我的建议简短、优雅且简单得多。即使我最终用普通的 C/ImageMagick 解决了这个问题,你的解决方案肯定解决了这个问题。谢谢!
  • @Geoff,我无法让它提供沿线的弯曲文本:curvytext([10:20;(10:20).^2],'This is a test')。参见此处的图:db.tt/Kr4Bn25H。
  • @TobiasDK 脚本的最后一行 axis equal 对于保持纵横比很重要。如果您在使用 curvytext 后更改轴,则字母看起来不会垂直于曲线,即使它们在技术上是垂直的。
  • @TobiasDK 如果您必须具有不相等的纵横比,一个想法是在varargin 之前添加第三个输入参数,例如c,它将字母旋转一些额外的常量值c。通过使用该值,您可能可以获得所需的效果。
  • @Geoff,感谢您的回答。它不会给我想要的输出,所以我将在 tikz - LaTeX 中完成 :-)。祝你有美好的一天。
猜你喜欢
  • 2016-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多