2011-04-11 2 views
0

트루 타입 글꼴에서 b- 스플라인 좌표가 주어진 x, y 공간에 선을 그릴 수식은 무엇입니까?트루 타입 b- 스플라인 곡선에서 x, y 좌표를 구하는 공식은 무엇입니까?

+0

어느 라인 당신이 무슨 말을하는거야? ** R^2 **;에 무한히 많은 행이 있습니다.) – Blender

+0

@Blender : B 스플라인의 제어점에 의해 정의 된 선. –

+0

오, 제어점이 주어지면 * 스플라인을 그려야할까요? 선은 곡선과 완전히 다르므로 좀 더 명확하게 설명하겠습니다. – Blender

답변

2

Truetype은 글리프 정의 내에서 bspline 곡선과 직선을 허용합니다.

다음하면 MoveTo의 일련의에이 명령을 변경하고 LineTo를의 당신이 사용할 수있는 필요한 경우

:
  1. 암시 좌표 목록에 트루 타입 데이터를 변환합니다. 이것은 귀하의 OS가 당신을 위해 할 수있는 것입니다 (다음 코드는 Windows API를 사용합니다). 라인에 모든 좌표와 곡선 번역이

  2. 워크 (코드를 볼 수 아래 스니 플릿) :

    procedure TGlyphEvaluator.EvaluateFromBuffer(Action: TGlyphEvaluatorAction); 
    var 
        H         : TTPOLYGONHEADER; 
        C         : TTPOLYCURVE; 
        Points        : array of TPointFX; 
        P, PE        : DWORD; 
        i, j        : Integer; 
        F         : Double; 
        PA, PB, PC       : TPoint; 
    begin 
        SetLength(Points, 10); 
        P := 0; 
        repeat 
         // Eat the polygon header 
         Move(FBuffer[ P ], H, sizeof(H)); 
         if H.dwType <> TT_POLYGON_TYPE then Break;   // Sanity check! 
         PE := P + H.cb; 
         Inc(P, sizeof(H)); 
         Points[ 0 ] := H.pfxStart; 
         // Eat all the curve records 
         while P < PE do begin 
          // Get the curve record 
          Move(FBuffer[ P ], C, sizeof(C) - sizeof(TPointFX)); 
          Inc(P, sizeof(C) - sizeof(TPointFX)); 
    
          // Get the points from the curve record 
          if Length(Points) < C.cpfx + 1 then Setlength(Points, C.cpfx + 1); 
          Move(FBuffer[ P ], Points[ 1 ], sizeof(TPointFX) * C.cpfx); 
          Inc(P, sizeof(TPointFX) * C.cpfx); 
    
          case C.wType of 
           TT_PRIM_LINE: begin 
             MoveTo(Action, Points[ 0 ].x.value, Points[ 0 ].y.value); 
             for i := 1 to C.cpfx do 
              LineTo(Action, Points[ i ].x.value, Points[ i ].y.value); 
            end; 
           TT_PRIM_QSPLINE: begin 
             MoveTo(Action, Points[ 0 ].x.value, Points[ 0 ].y.value); 
             PA.X := Points[ 0 ].x.value; 
             PA.Y := Points[ 0 ].y.value; 
             for i := 1 to C.cpfx - 1 do begin // DrawQSpline is called C.cpfx - 1 times 
              PB.X := Points[ i ].x.value; 
              PB.Y := Points[ i ].y.value; 
              PC.X := Points[ i + 1 ].x.value; 
              PC.Y := Points[ i + 1 ].y.value; 
              if i < C.cpfx - 1 then begin 
               PC.X := (PC.X + PB.X) div 2; 
               PC.Y := (PC.Y + PB.Y) div 2; 
              end; 
              for j := 1 to 8 do begin 
               F := j/8; 
               LineTo(Action, Round((PA.x - 2 * PB.x + PC.x) * Sqr(F) + (2 * PB.x - 2 * PA.x) * F + PA.x), 
                Round((PA.y - 2 * PB.y + PC.y) * Sqr(F) + (2 * PB.y - 2 * PA.y) * F + PA.y)); 
              end; 
              PA := PC; 
             end; 
            end; 
          end; 
          // Update last point. 
          Points[ 0 ] := Points[ C.cpfx ]; 
         end; 
         MoveTo(Action, Points[ 0 ].x.value, Points[ 0 ].y.value); 
         LineTo(Action, H.pfxStart.x.value, H.pfxStart.y.value); 
        until P >= Longword(Length(FBuffer)); 
    end; 
    
+0

이 경우 서식이 잘못된 것으로 보입니다. –

+0

개정판에서 볼 수 있습니다. <> 문서를 제거하고 다시 삽입하면 문서가 올바르게 다시 표시되는 이유를 설명 할 수 있습니까? 바라건대 나 자신을 다시 할 수 있기를 바랍니다. –

+0

잘 모르겠습니다. 나는 메타 사이트에 물어 봤고 누군가가 와서 그것을 고쳤다. 그들은 나의 질문이 정확한 복제물이라고 말했다. 그러나 내가 말했던 정확한 복제물을 보았을 때, 여기서 무슨 일이 일어 났는지 이해할 수 없었다. http://meta.stackexchange.com/questions/87423/code-markup-failure-case –