我希望沿着给定的向量绘制文本(可能是任何东西 - 不一定是椭圆形或直线)。文本必须与曲线保持切线,如this example。
在Java中,沿着一些简单的等式(直线或椭圆线)进行的方法相对简单。 但是,这在MATLAB中会很复杂:
由于代码将创建至少数千个图像,每个图像包含多个字符,并且将包含其他渲染操作,我正在寻找一种更简单/更经济的方式。
此外,在一般向量的情况下,这没有提供解决方案。
有什么建议吗?如果可以解决问题,添加库不是问题。
答案 0 :(得分: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
是描述任何2D路径的2-by-n
矩阵。输入str
是要绘制的文本,varargin
允许您指定任何标准Name,Value
对,就像使用text
一样。
工作原理:
spline
和linspace(1,n,m+1)
将曲线参数化为m+1
等距片段,其中m
是str
中的字符数。
dXY
计算连续点对之间的差异。
arrayfun
和atan2
计算每个字母的旋转角度(以弧度表示)。
XY = (XY(:,1:end-1)+XY(:,2:end))/2;
对连续的点对进行平均,以便在m
插值点之间绘制m+1
个字母。
然后我们使用text
和rotation
属性(转换为度)循环遍历每个字符。注意varargin
被输入text
命令。