LRESULT CALLBACK WindowHandler(HWND hwnd, UINT umsg, WPARAM wparam, LPARAM lparam) {
LRESULT result=0;
switch(umsg) {
case WM_PAINT: {
POINT pt[4];
RECT rc;
PAINTSTRUCT ps;
HDC hdc=BeginPaint(hwnd,&ps);
GetClientRect(hwnd,&rc);
pt[0].x=pt[2].x=rc.right/2;
pt[1].y=pt[3].y=rc.bottom/2;
pt[0].y=pt[3].x=0;
pt[1].x=rc.right;
pt[2].y=rc.bottom;
HBRUSH b=CreateSolidBrush(RGB(0xf0,0,0));
HBRUSH ob=(HBRUSH)SelectObject(hdc,b);
Polygon(hdc,pt,4);
SelectObject(hdc,ob);
DeleteObject(b);
EndPaint(hwnd,&ps);
} break;
default: result=DefWindowProc(hwnd,umsg,wparam,lparam);
}
return result;
}
перемещение
Ситуация такая: нужно чтобы небольшой закрашенный прямоугольник двигался по кромки вооброжаемого круга (координаты центра и радиуса круга имеются ). Перемещение должно происходить в обоих направлениях, при нажатии клавиш "влево", "вправо". Вообщем как такое сделать?:)
Хотя нет, начнем не так, а что ты уже сделал, и что тебе не понятно?
Цитата: Ation
что конкренто? прорисовка? алгоритм? или тебе все сразу рассказать?
Хотя нет, начнем не так, а что ты уже сделал, и что тебе не понятно?
Хотя нет, начнем не так, а что ты уже сделал, и что тебе не понятно?
Собственно нарисовал прямоугольник. Пишу через win32api на visual studio 2005. Алгоритм пожалуйста;). т.е. как новые координаты прямоугольника высчитывать зная координаты центра и радиус воображаемой окружности, по кромке которой он должен двигаться
Y=(+/-)sqrt(R^2-X^2);
при выводе прибавляй к X и Y координаты цетра.
вот только проблема в том "как узнать с плюсом брать значение Y или с минусом?".
можно двигать не по одной одну окружности, а по двум дугам: у одной дуги Y всегда брать со знаком -, а у второй всегда со знаком +, т.е. сначала идти от начала к концу, Y брать за знаком +, потом от конца к началу, Y брать за знаком -
В качестве инструмента для рисования можно выбрать функции GDI, OpenGL, DirectX и т.д. и т.п.
В цикле пробегаемся от 0 до 2*Pi; значение cos будет соответствовать координате x, значение sin - координате y в декартовой системе координат XOY. Воспользуйтесь выражениями R*cos и R*sin для того, чтобы задать неединичный радиус окружности. Меняя значение угла для синуса и косинуса при обработке сообщения WM_KEYDOWN, ваша фигура (точка, квадрат, треугольник и т.п.) будет перемещаться по окружности радиуса R.
Вот в принципе и всё!
всем спасибо! А то сам уже и не надеялся сделать:)
Как найти точки на рисунки отмеченные красным цветом, зная координаты центра круга, угла альфа, радиус,и координаты точки точки Pа??? Вобщем надо сделать так, чтобы этот прямоугольник перемещался по кругу так как показано на рисунке. Может если работать с изображением (картинкой) прямоугольника это проще будет сделать?
Дело в том, что можно решить поставленную задачу, не задумываясь над математикой, если выводить графику, используя функции OpenGL или GDI+: glRotatef или Rotate соответственно. В этом случае вы рисуете программно прямоугольник посредством явного задания его вершин и при обработке сообщения WM_KEYDOWN вызываете функцию glRotate или Rotate, которая осуществляет поворот всей системы координат; в конце обработчика обязательно явно посылайте сообщение WM_PAINT.
И ещё один важный момент: внимательно следите за масштабированием окна! Так, к примеру, если ширина и высота окна, которое служит холстом для вывода графики, не равны по значению, то при "повороте прямоугольника" произойдёт его трансфомация до параллелограмма. Самое простое решение - это уровнять высоту и ширину окна.
Применяя эти функции вам не прийдётся задумываться над нахождением координат прямоугольника по известным величинам; хотя и эта задача вполне решаемая. Первый вариант: используем условие перпендикулярности 2-х прямых для получения углового коэффициента по уже известному одной из сторон прямоугольника, являющейся касательной к окружности; знание углового коэффициента и одной из точек прямой позволит нам найти уравнение стороны прямоугольника; ну а дальше узнать координаты прямоугольника не составит большого труда. Второй вариант - это использовать уравнение касательной к окружности, заданной уравннием:
Цитата:
(X-x0)^2+(Y-y0)^=R^2
X' = X*cos(A) - Y*sin(A)
Y' = X*sin(A) + Y*cos(A)
Чтобы заставить вращатся кирпичь:
A----D
B----C
A.X = H*cos(A) - W*sin(A)
A.Y = H*sin(A) + W*cos(A)
B.X = -H*cos(A) - W*sin(A)
B.Y = -H*sin(A) + W*cos(A)
C.X = -H*cos(A) + W*sin(A)
C.Y = -H*sin(A) - W*cos(A)
D.X = H*cos(A) + W*sin(A),
D.Y = H*sin(A) - W*cos(A),
где W - половина ширины; H - половина высоты.
Если необходимо так же двигать центр кирпича по кругу, то:
A.X = H*cos(A) - W*sin(A) + R*cos(A)
A.Y = H*sin(A) + W*cos(A) + R*sin(A)
B.X = -H*cos(A) - W*sin(A) + R*cos(A)
B.Y = -H*sin(A) + W*cos(A) + R*sin(A)
C.X = -H*cos(A) + W*sin(A) + R*cos(A)
C.Y = -H*sin(A) - W*cos(A) + R*sin(A)
D.X = H*cos(A) + W*sin(A) + R*cos(A)
D.Y = H*sin(A) - W*cos(A) + R*sin(A)
где R - радиус траектории (расстояние от центра вращения до центра кирпича).
Чтобы сместить центр вращения:
A.X = H*cos(A) - W*sin(A) + R*cos(A) + Xc
A.Y = H*sin(A) + W*cos(A) + R*sin(A) + Yc
B.X = -H*cos(A) - W*sin(A) + R*cos(A) + Xc
B.Y = -H*sin(A) + W*cos(A) + R*sin(A) + Yc
C.X = -H*cos(A) + W*sin(A) + R*cos(A) + Xc
C.Y = -H*sin(A) - W*cos(A) + R*sin(A) + Yc
D.X = H*cos(A) + W*sin(A) + R*cos(A) + Xc
D.Y = H*sin(A) - W*cos(A) + R*sin(A) + Yc
где Xc и Yc - координаты центра вращения.
Цитата: Nixus
Поворот точки вокруг центра координат на угол A:
X' = X*cos(A) - Y*sin(A)
Y' = X*sin(A) + Y*cos(A)
Чтобы заставить вращатся кирпичь:
A----D
B----C
A.X = H*cos(A) - W*sin(A)
A.Y = H*sin(A) + W*cos(A)
B.X = -H*cos(A) - W*sin(A)
B.Y = -H*sin(A) + W*cos(A)
C.X = -H*cos(A) + W*sin(A)
C.Y = -H*sin(A) - W*cos(A)
D.X = H*cos(A) + W*sin(A),
D.Y = H*sin(A) - W*cos(A),
где W - половина ширины; H - половина высоты.
Если необходимо так же двигать центр кирпича по кругу, то:
A.X = H*cos(A) - W*sin(A) + R*cos(A)
A.Y = H*sin(A) + W*cos(A) + R*sin(A)
B.X = -H*cos(A) - W*sin(A) + R*cos(A)
B.Y = -H*sin(A) + W*cos(A) + R*sin(A)
C.X = -H*cos(A) + W*sin(A) + R*cos(A)
C.Y = -H*sin(A) - W*cos(A) + R*sin(A)
D.X = H*cos(A) + W*sin(A) + R*cos(A)
D.Y = H*sin(A) - W*cos(A) + R*sin(A)
где R - радиус траектории (расстояние от центра вращения до центра кирпича).
Чтобы сместить центр вращения:
A.X = H*cos(A) - W*sin(A) + R*cos(A) + Xc
A.Y = H*sin(A) + W*cos(A) + R*sin(A) + Yc
B.X = -H*cos(A) - W*sin(A) + R*cos(A) + Xc
B.Y = -H*sin(A) + W*cos(A) + R*sin(A) + Yc
C.X = -H*cos(A) + W*sin(A) + R*cos(A) + Xc
C.Y = -H*sin(A) - W*cos(A) + R*sin(A) + Yc
D.X = H*cos(A) + W*sin(A) + R*cos(A) + Xc
D.Y = H*sin(A) - W*cos(A) + R*sin(A) + Yc
где Xc и Yc - координаты центра вращения.
X' = X*cos(A) - Y*sin(A)
Y' = X*sin(A) + Y*cos(A)
Чтобы заставить вращатся кирпичь:
A----D
B----C
A.X = H*cos(A) - W*sin(A)
A.Y = H*sin(A) + W*cos(A)
B.X = -H*cos(A) - W*sin(A)
B.Y = -H*sin(A) + W*cos(A)
C.X = -H*cos(A) + W*sin(A)
C.Y = -H*sin(A) - W*cos(A)
D.X = H*cos(A) + W*sin(A),
D.Y = H*sin(A) - W*cos(A),
где W - половина ширины; H - половина высоты.
Если необходимо так же двигать центр кирпича по кругу, то:
A.X = H*cos(A) - W*sin(A) + R*cos(A)
A.Y = H*sin(A) + W*cos(A) + R*sin(A)
B.X = -H*cos(A) - W*sin(A) + R*cos(A)
B.Y = -H*sin(A) + W*cos(A) + R*sin(A)
C.X = -H*cos(A) + W*sin(A) + R*cos(A)
C.Y = -H*sin(A) - W*cos(A) + R*sin(A)
D.X = H*cos(A) + W*sin(A) + R*cos(A)
D.Y = H*sin(A) - W*cos(A) + R*sin(A)
где R - радиус траектории (расстояние от центра вращения до центра кирпича).
Чтобы сместить центр вращения:
A.X = H*cos(A) - W*sin(A) + R*cos(A) + Xc
A.Y = H*sin(A) + W*cos(A) + R*sin(A) + Yc
B.X = -H*cos(A) - W*sin(A) + R*cos(A) + Xc
B.Y = -H*sin(A) + W*cos(A) + R*sin(A) + Yc
C.X = -H*cos(A) + W*sin(A) + R*cos(A) + Xc
C.Y = -H*sin(A) - W*cos(A) + R*sin(A) + Yc
D.X = H*cos(A) + W*sin(A) + R*cos(A) + Xc
D.Y = H*sin(A) - W*cos(A) + R*sin(A) + Yc
где Xc и Yc - координаты центра вращения.
Спс. Все работает. А как этот прямоугольник закрасить?:confused: :)
Создай кисть необходимого цвета и выбери ее
Привызове Polygon прямоугольник закрасится цветом текущей кисти
Примерчик:
Код: