2014-10-24 5 views
3

Я использую Delphi (XE5) для создания графического компонента. Одна из задач состоит в том, чтобы повернуть закрытый путь с помощью SetWorldTransform, а затем прочитать схему с помощью GetPath. Вращение работает нормально, но точки, полученные из GetPath, не вращаются (однако обход региона (PathToRegion) работает так, как ожидалось!).Вращение не влияет на GetPath?

Мой код:

procedure Rotate(DestBitmap : TBitmapEx; Radians : Single; FigureRect : TRect); 

// DestBitmap is where to draw the figure. Size of DestBitmap is computed from 
//the actual angle and figure size (not shown here). FigureRect is the plain 
//figure rectangle without rotation 

var 
    XForm: tagXFORM; 
    C, S : single; 
    Points : array of TPoint; 
    NumPoints : integer; 
    Bytes : TByteArray; 
    Rgn : HRGN; 
    X, Y : integer; 

begin 
    //Locate FigureRect to center of bitmap: 
    X := (DestBitmap.Width - FigureRect.Width) div 2; 
    Y := (DestBitmap.Height - FigureRect.Height) div 2; 
    FigureRect.Location := Point(X,Y); 

    //Set rotate mode 
    C := Cos(Radians); 
    S := Sin(Radians); 
    XForm.eM11 := C; 
    XForm.eM12 := S; 
    XForm.eM21 := -S; 
    XForm.eM22 := C; 
    XForm.eDx := (DestBitmap.Width - DestBitmap.Width * C + 
    DestBitmap.Height * S)/2; 
    XForm.eDy := (DestBitmap.Height - DestBitmap.Width * S - 
    DestBitmap.Height * C)/2; 
    SetGraphicsMode(DestBitmap.Canvas.Handle, GM_ADVANCED); 
    SetWorldTransform(DestBitmap.Canvas.Handle, XForm); 

    //Rotate the figure 
    BeginPath(DestBitmap.Canvas.Handle); 
    DestBitmap.Canvas.Rectangle(FigureRect); 
    EndPath(DestBitmap.Canvas.Handle); 
    FlattenPath(DestBitmap.Canvas.Handle); 
    NumPoints := GetPath(DestBitmap.Canvas.Handle, Points[0], Bytes[0], 0); 
    SetLength(Points, NumPoints); 
    GetPath(DestBitmap.Canvas.Handle, Points[0], Bytes[0], NumPoints); 

    //Points now describes the plain, unrotated figure, but if instead: 
    //Rgn := PathToRegion(DestBitmap.Canvas.Handle); 
    //Rgn describes the rotated area, as expected 
end; 

ответ

2

Это, как ожидается, GetPath возвращает точки в логических координатах. Принимая во внимание, что результирующая область PathToRegion использует координаты устройства - поэтому на нее не влияет преобразование. См. Документацию по обеим функциям.

Или три, SetWorldTransform преобразует логические координаты. Для всего, что в логическом мире, ничего не изменилось. Преобразование относится к устройству.

Смежные вопросы