[英]WinAPI Polygon Deform on Rotation
我的多邊形(正方形)在問題上有點卡住,它在旋轉時變形,嘗試使用標准功能SetWorldTransform,但感到失望。 旋轉功能正常。 可能的主要問題是每次旋轉后都會出現錯誤。
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);
}
將您的點存儲為帶有雙精度的自定義點結構,而不是ints對所有邏輯運算使用此類型而不是POINT
struct PrecisePoint
{
double x;
double y;
}
然后將它們復制到POLYgon(hdc,pnts,5)之前的POINT數組中; 您可以添加如下方法:
precisePointsToPoints( PrecisePoint[] src, POINT[] dst, length);
您的坐標將作為浮點數旋轉,然后被強制為整數以存儲回POINT
結構中。 截斷誤差正在累積並導致失真。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.