Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

перемещение

18K
23 ноября 2007 года
af1x
31 / / 19.11.2007
Ситуация такая: нужно чтобы небольшой закрашенный прямоугольник двигался по кромки вооброжаемого круга (координаты центра и радиуса круга имеются ). Перемещение должно происходить в обоих направлениях, при нажатии клавиш "влево", "вправо". Вообщем как такое сделать?:)
2.9K
23 ноября 2007 года
Ation
96 / / 27.07.2004
что конкренто? прорисовка? алгоритм? или тебе все сразу рассказать?
Хотя нет, начнем не так, а что ты уже сделал, и что тебе не понятно?
18K
23 ноября 2007 года
af1x
31 / / 19.11.2007
Цитата: Ation
что конкренто? прорисовка? алгоритм? или тебе все сразу рассказать?
Хотя нет, начнем не так, а что ты уже сделал, и что тебе не понятно?



Собственно нарисовал прямоугольник. Пишу через win32api на visual studio 2005. Алгоритм пожалуйста;). т.е. как новые координаты прямоугольника высчитывать зная координаты центра и радиус воображаемой окружности, по кромке которой он должен двигаться

261
23 ноября 2007 года
ahilles
1.5K / / 03.11.2005
общая формула такая (X-x0)^2+(Y-y0)^2=R^2
Y=(+/-)sqrt(R^2-X^2);
при выводе прибавляй к X и Y координаты цетра.
вот только проблема в том "как узнать с плюсом брать значение Y или с минусом?".
можно двигать не по одной одну окружности, а по двум дугам: у одной дуги Y всегда брать со знаком -, а у второй всегда со знаком +, т.е. сначала идти от начала к концу, Y брать за знаком +, потом от конца к началу, Y брать за знаком -
397
23 ноября 2007 года
SergPas
527 / / 03.02.2007
Вообщем, весь алгоритм показан на рисунке.
В качестве инструмента для рисования можно выбрать функции GDI, OpenGL, DirectX и т.д. и т.п.
В цикле пробегаемся от 0 до 2*Pi; значение cos будет соответствовать координате x, значение sin - координате y в декартовой системе координат XOY. Воспользуйтесь выражениями R*cos и R*sin для того, чтобы задать неединичный радиус окружности. Меняя значение угла для синуса и косинуса при обработке сообщения WM_KEYDOWN, ваша фигура (точка, квадрат, треугольник и т.п.) будет перемещаться по окружности радиуса R.
Вот в принципе и всё!
18K
24 ноября 2007 года
af1x
31 / / 19.11.2007
всем спасибо! А то сам уже и не надеялся сделать:)
18K
04 декабря 2007 года
af1x
31 / / 19.11.2007
Как найти точки на рисунки отмеченные красным цветом, зная координаты центра круга, угла альфа, радиус,и координаты точки точки Pа??? Вобщем надо сделать так, чтобы этот прямоугольник перемещался по кругу так как показано на рисунке. Может если работать с изображением (картинкой) прямоугольника это проще будет сделать?
397
04 декабря 2007 года
SergPas
527 / / 03.02.2007
Какие средства вы используете для вывода графических примитивов?
Дело в том, что можно решить поставленную задачу, не задумываясь над математикой, если выводить графику, используя функции OpenGL или GDI+: glRotatef или Rotate соответственно. В этом случае вы рисуете программно прямоугольник посредством явного задания его вершин и при обработке сообщения WM_KEYDOWN вызываете функцию glRotate или Rotate, которая осуществляет поворот всей системы координат; в конце обработчика обязательно явно посылайте сообщение WM_PAINT.
И ещё один важный момент: внимательно следите за масштабированием окна! Так, к примеру, если ширина и высота окна, которое служит холстом для вывода графики, не равны по значению, то при "повороте прямоугольника" произойдёт его трансфомация до параллелограмма. Самое простое решение - это уровнять высоту и ширину окна.
Применяя эти функции вам не прийдётся задумываться над нахождением координат прямоугольника по известным величинам; хотя и эта задача вполне решаемая. Первый вариант: используем условие перпендикулярности 2-х прямых для получения углового коэффициента по уже известному одной из сторон прямоугольника, являющейся касательной к окружности; знание углового коэффициента и одной из точек прямой позволит нам найти уравнение стороны прямоугольника; ну а дальше узнать координаты прямоугольника не составит большого труда. Второй вариант - это использовать уравнение касательной к окружности, заданной уравннием:
Цитата:
(X-x0)^2+(Y-y0)^=R^2

353
04 декабря 2007 года
Nixus
840 / / 04.01.2007
Поворот точки вокруг центра координат на угол 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 - координаты центра вращения.
18K
06 декабря 2007 года
af1x
31 / / 19.11.2007
Цитата: 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 - координаты центра вращения.



Спс. Все работает. А как этот прямоугольник закрасить?:confused: :)

1.9K
06 декабря 2007 года
max_dark
256 / / 11.11.2005
Используй вместо A B C D массив точек и функцию Polygon
Создай кисть необходимого цвета и выбери ее
Привызове Polygon прямоугольник закрасится цветом текущей кисти
Примерчик:
Код:
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;
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог