Obrót figury względem jakiegoś punktu

0

Witam
Mam problem, chce aby dla przykładu obracał się kwadrat wokół współrzędnej 400,400, o to co napisałem(w WinApi):

 
#include <windows.h>
#include <sstream>
#include <cmath>

LPCWSTR MainClassName = TEXT("MainClass");//nazwa klasy
LPCWSTR MainWindowName = TEXT("WndName");//nazwa okna


LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);//obsługa komunikatów
bool RejestracjaKlasyOkna(const HINSTANCE hinst);


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 
{
	MSG Msg;
	HWND hwnd;
	
	if(!RejestracjaKlasyOkna(hInstance))
	{
		MessageBox(NULL, L"Błąd rejestracji klasy okna", L"Błąd", MB_ICONSTOP);
		return 1;
	}
	hwnd = CreateWindowEx(0,MainClassName,MainWindowName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);

	ShowWindow(hwnd,nCmdShow);
	UpdateWindow(hwnd);

	while(GetMessage(&Msg,NULL,0,0)) 
	{
		TranslateMessage(&Msg);
		DispatchMessage(&Msg);
	}		
 
	return 0;
}

bool RejestracjaKlasyOkna(const HINSTANCE hinst) 
{
	WNDCLASSEX w;
	w.cbSize = sizeof(WNDCLASSEX);
	w.style = CS_HREDRAW|CS_VREDRAW;
	w.lpfnWndProc = WndProc;
	w.cbClsExtra = 0;
	w.cbWndExtra = 0;
	w.hInstance = hinst;
	w.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	w.hCursor = LoadCursor(NULL, IDC_ARROW);
	w.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
	w.lpszMenuName = NULL;
	w.lpszClassName = MainClassName;
	w.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
 
	if(!RegisterClassEx(&w)) return 0;
 
	return true;
}
POINT  kw[5]={400,400, 500,400, 500,500, 400,500, 400,400};
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	
	switch(msg) 
	{
	case WM_PAINT:
		{
			PAINTSTRUCT ps;
			HDC hdc=BeginPaint(hwnd,&ps);

			RECT R;
			GetClientRect(hwnd,&R);

			SetMapMode(ps.hdc,MM_ANISOTROPIC);
			SetWindowExtEx(ps.hdc,1000,1000,NULL);
			SetViewportExtEx(hdc,R.right,R.bottom,NULL);
			//SetViewportExtEx (hdc, R.right/2,-R.bottom/2, NULL) ;
			//SetViewportOrgEx (hdc, R.right / 2,  R.bottom / 2, NULL) ;
			

			Polygon(hdc,kw,5);
			HBRUSH pudelko,szyba,ob;
			szyba=CreateSolidBrush(RGB(133,1,252));
			pudelko=(HBRUSH)SelectObject(hdc,szyba);
			
			Ellipse(hdc,390,390,410,410);

			SelectObject(hdc,pudelko);
			DeleteObject(szyba);
			EndPaint(hwnd,&ps);
			break;
		}
	case WM_LBUTTONDOWN:
		{
			int kat=45;
			double PI=3.14;
			for(int i=1;i<5;i++)
			{
			kw[i].x=(kw[i].x)*cos(kat*PI/180)-(kw[i].y)*sin(kat*PI/180)+400;
			kw[i].y=(kw[i].x)*sin(kat*PI/180)+(kw[i].y)*cos(kat*PI/180)+400;
			}

			InvalidateRect(hwnd,NULL,TRUE);
			break;
		}
	case WM_DESTROY:
		PostQuitMessage(0); 
		break;
	default: { return DefWindowProc(hwnd,msg,wParam,lParam); }
	}
 
	return 0;
}


 

Co jest w tym źle.. ?
proszę o konkrety a nie o wzory, bo robię według wzorów i nic z tego nie wychodzi:)

Tylko nie przejmujcie się że to w winapi czy coś ;) chodzi mi o samo obracanie figury w okół danego punktu.

0

może mi ktoś odpowiedzieć, bo mnie *** szczeli, tyle się nad tym męczĘ

0

kw[i].x=(kw[i].x)cos(katPI/180)-(kw[i].y)sin(katPI/180)+400;

co to za +400 na końcu?

0
  1. Zrób kopię, x i y
  2. Licz nowe współrzędne używając skopiowanych x , y
  3. Jeżeli nie zrozumiałeś istotności powyższego dla twojego programu zacznij czytać od punktu 1.
0

znalazłem taki wzór na necie, najpierw mi wylicza wspołrzędne a potem dodaje do tej współrzędnej współrzędną tego punktu, wokół którego chce obrócić figure

0

_13th_Dragon

  1. co to za sens?
  2. możesz podać kawałek kodu, żebym to zobaczył ?:)
0
double KOPIA_X=kw[i].x,KOPIA_Y=kw[i].y;

Napisz którego słowa nie rozumiesz.

0

wiem o co Ci chodzi, tylko nie wiem co to zmieni, sprawdze z/w ;)

0
 
	case WM_LBUTTONDOWN:
		{
			int kat=45;
			double PI=3.14;
			for(int i=1;i<5;i++)
			{
			double KOPIA_X=kw[i].x,KOPIA_Y=kw[i].y;

			kw[i].x=(KOPIA_X)*cos(kat*PI/180)-(KOPIA_Y)*sin(kat*PI/180)+400;
			kw[i].y=(KOPIA_X)*sin(kat*PI/180)+(KOPIA_Y)*cos(kat*PI/180)+400;
			}
			
		

			InvalidateRect(hwnd,NULL,TRUE);
			break;
		}

Nic to nie zmieniło :)

0

udało mi się ;)
kw[i].x=(KOPIA_X-400)cos(katPI/180)-(KOPIA_Y-400)sin(katPI/180)+400;
kw[i].y=(KOPIA_X-400)sin(katPI/180)+(KOPIA_Y-400)cos(katPI/180)+400;
pozdro

2

Tylko te 400 możesz odjąć już przy tworzeniu tej kopii. Oraz kat*PI/180 policzyć raz przy okazji tworzenia tych kopii.

1 użytkowników online, w tym zalogowanych: 0, gości: 1