2017-03-06 3 views
-1

ポリゴン(四角形)の問題にちょっと悩まされましたが、回転時に変形し、スタンドアット関数のSetWorldTransformを試しましたが、失望しました。 回転機能はOKです。おそらく、主な問題はすべての回転後のエラーです。回転時のWinAPIポリゴン変形

あなたの座標は POINT構造に戻って格納するための整数に強制次いで、浮動小数点数として回転される
int xCenter = 105; 
int yCenter = 105; 

POINT pnts[5]; 

square() 
    { 
     pnts[0].x = 70; 
     pnts[0].y = 70; 
     pnts[1].x = 140; 
     pnts[1].y = 70; 
     pnts[2].x = 140; 
     pnts[2].y = 140; 
     pnts[3].x = 70; 
     pnts[3].y = 140; 
     pnts[4].x = 70; 
     pnts[4].y = 70; 
    } 

void Drawsquare(HWND hWin) 
    { 
     HDC hdc; 
     HBRUSH hBrush; 
     HPEN hPen; 
     LOGBRUSH lBrush; 
     hdc = GetDC(hWin); 

     lBrush.lbStyle = BS_HOLLOW; 
     hBrush = CreateBrushIndirect(&lBrush); 
     hPen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0)); 
     SelectObject(hdc, hBrush); 
     SelectObject(hdc, hPen); 

     Polygon(hdc, pnts, 5); 

     ReleaseDC(hWin, hdc); 
    } 

void Rotate(HWND hWin) 
    { 
     HDC hdc; 
     RECT rect; 
     hdc = GetDC(hWin); 

     double pi = acos(-1); 
     double ang = 45 * pi/180; 

     for(int i = 0; i < 5; i++) 
     { 
      pnts[i].x = (pnts[i].x - xCenter)*cos(ang) - (pnts[i].y - yCenter)*sin(ang) + xCenter; 
      pnts[i].y = (pnts[i].x - xCenter)*sin(ang) + (pnts[i].y - yCenter)*cos(ang) + yCenter; 
     } 

     GetClientRect(hWin, &rect); 
     ClearScreen(hdc, rect); 
     Drawsquare(hWin); 
     ReleaseDC(hWin, hdc); 
    } 
+0

「x-yCenter」と「y-xCenter」がありますか? –

+0

XとYセンターは同じですので、問題はこの点ではありません、返信いただきありがとうございます。 –

+0

コードが不完全です。特に、main()関数と少なくとも1つの '#include'が欠落しているようです。コードを問題の[mcve]にするようにコードを編集してください。そうすれば、それを再現して解決することができます。 [ask]も読んでください。 –

答えて

1

。切り捨てエラーは蓄積され、ひずみの原因となります。

2

Storeはダブルスでカスタムポイント構造へのあなたのポイントではなく、右の前

struct PrecisePoint 
{ 
    double x; 
    double y; 
} 

はその後、POINT配列にコピーし、すべての論理演算に代わりPOINTのこのタイプを使用int型ポリゴン(HDC、PNTS、5); 次のようなメソッドを追加できます:

precisePointsToPoints(PrecisePoint[] src, POINT[] dst, length); 
関連する問題