2014-12-23 3 views
0

주어진 벡터 (반드시 타원형 또는 직선 일 필요는 없음)를 따라 텍스트를 그리려합니다. 텍스트는 곡선의 접선 방향이어야합니다 (예 : this example).MATLAB에서 곡선 된 텍스트 그리기

간단한 방정식 (직선 또는 타원형 선)을 따라 수행하는 방법은 Java에서 비교적 간단합니다. 그러나이 MATLAB 복잡 할 것이다 :

  1. 은 직선으로 각각의 캐릭터의 좌표를 계산 있는 InsertText() 또는 vision.TextInserter
  2. 를 이용하여 화상을 각 문자 변환
  3. TFORM을 사용하여 적절한 변환 계산
  4. 을 사용하여 각 문자에 적용합니다. imwarp()

코드는 수천 개의 이미지를 만들려고하는데, 각 이미지는 여러 문자로 구성되며 다른 렌더링 작업도 포함되므로 더 간단하고 경제적 인 방법을 찾고 있습니다.

또한 일반 벡터의 경우에는 해결책이 없습니다.

제안 사항? 이것이 문제를 해결할 수 있다면 라이브러리를 추가하는 것은 문제가되지 않습니다.

+0

내가 제안한 것 이외의 다른 방법을 찾을 수 없습니다. MATLAB은 데이터 분석 및 처리를위한 것이 었습니다 ... 그리고 아마도 멋진 GUI를 만들었지 만 곡선 벡터에 접선 방향의 텍스트를 그리는 것과 같은 정교한 것은 없었습니다. IMO, 나는 당신이 이미 설명한 것과는 다른 간단한 방법이 있다고 생각하지 않는다! – rayryeng

+0

고마워요! 그런 다음 다른 스크립트 기반 언어/환경을 제안 할 수 있습니까? – Yellows

+0

링크 된 [java 예제] (http://stackoverflow.com/questions/5159845/curved-text-in-java)가 충분하면 괜찮습니다. Matlab은'Java' 라이브러리를 비교적 잘 통합 할 수 있습니다. [문서] (http://uk.mathworks.com/help/matlab/using-java-libraries-in-matlab.html) – Hoki

답변

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 

, 입력 xy2-by-n 행렬 2D 경로를 설명합니다. 입력 str은 플롯 할 텍스트이고 varargintext을 사용하는 것처럼 표준 Name,Value 쌍을 지정할 수 있습니다.

splinelinspace(1,n,m+1) 함께 mstr의 문자 수는 m+1 등 간격 조각으로 곡선을 매개 변수화 : 작동 원리

.

dXY은 연속 된 점 쌍 간의 차이점을 계산합니다.

arrayfunatan2은 각 문자의 회전 각도 (라디안)를 계산합니다.

XY = (XY(:,1:end-1)+XY(:,2:end))/2;은 보간 점 사이에 m 글자가 그려집니다.

그런 다음 textrotation 속성 (도수로 변환 됨)을 사용하여 각 문자를 반복합니다. 알림 varargintext 명령에 입력됩니다.

+0

귀하의 솔루션은 제 생각보다 짧고 우아하며 훨씬 간단합니다. 비록 내가 평범한 C/ImageMagick으로 문제를 마침내 해결했지만, 당신의 솔루션은 분명히 문제 해결을 해결합니다. 감사! – Yellows

+0

@Geoff, 나는 curvytext ([10:20; (10:20).^2], 'This is a test')'와 같이 곡선 텍스트를 제공 할 수 없습니다. 여기 그림을 참조하십시오 : db.tt/Kr4Bn25H. – TobiasDK

+0

@TobiasDK 스크립트의 마지막 줄인 '축 평등'은 종횡비를 유지하는 데 중요합니다. 'curvytext'를 사용한 후에 축을 바꾸는 경우 글자는 기술적으로도 곡선에 수직으로 보이지 않습니다. – Geoff