在MATLAB中绘制曲线文本

时间:2014-12-23 17:05:36

标签: matlab text curve

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

Curvy text example

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是描述任何2D路径的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插值点之间绘制m+1个字母。

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