在MATLAB中绘制曲线文本

在MATLAB中绘制曲线文本,matlab,text,curve,Matlab,Text,Curve,我希望沿着给定的向量(可能是任何东西——不一定是椭圆或直线)绘制文本。文本必须与曲线保持相切,如中所示 沿着一些简单的方程(直线或椭圆线)做这件事的方法在数学上相对简单。 但是,这在MATLAB中会很复杂: 使用insertText()或vision.TextInserter将每个字符转换为图像 计算直线上每个字符的坐标 使用TFORM计算适当的变换 使用imwarp()为每个角色应用它 由于代码将创建至少数千个图像,每个图像都有几个字符,并将包括其他渲染操作,因此我正在寻找一种更简单/更经济的

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

沿着一些简单的方程(直线或椭圆线)做这件事的方法在数学上相对简单。 但是,这在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