Форум программистов, компьютерный форум, киберфорум
Наши страницы

Вращение треугольника относительно центра - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Перевести JS на C++ http://www.cyberforum.ru/cpp-beginners/thread666568.html
Есть js. Он выполняет некие манипуляции и на выходе должен давать строку. Этот js парситься со страницы, входные параметры в нём каждый раз новые. Мне нужно перевести этот js на с++. У самого у меня...
C++ Составить программу вычисления значения функции Y=x^5+8x^4+10, для х, изменяющегося от а до b с шагом b Составить программу вычисления значения функции Y=x^5+8x^4+10, для х, изменяющегося от а до b с шагом b.С помощу циклов http://www.cyberforum.ru/cpp-beginners/thread666551.html
C++ Быстрое преобразование Хартли
Need Help! Need to correct this super Program for Fast Hartley Transform! Нужна помощь! Необходимо подправить эту супер программу для выполнения быстрого преобразования Хартли! ...
Разработайте функцию вычисления n-го члена рада Фибоначчи C++
Программа, которая позволяет найти предел отношения двух последовательных чисел ряда Фибоначчи с заданной точностью. Ряд Фибоначчи: 1 1 2 3 5 8 13 21 и т.д. При разработке данной программы и во...
C++ Учимся вместе http://www.cyberforum.ru/cpp-beginners/thread666540.html
Ребят, всем привет! Недавно понял что жизнь моя скучна и уныла, и что пора ее чем нибудь разнообразить, и выбор пал на с++. Объяснить почему именно си - не могу, просто где то слышал, где то читал, и...
C++ Условные операторы Написать программу, которая вычисляет дату следующего дня. Ниже представлен рекомендуемый вид экрана во время работы программы. Введите цифрами сегодняшнюю дату (число, месяц, год) -> 31 декабря... подробнее

Показать сообщение отдельно
BuPy7
Нет ТЗ - давай досвидания
740 / 368 / 36
Регистрация: 01.12.2011
Сообщений: 2,241

Вращение треугольника относительно центра - C++

08.10.2012, 21:51. Просмотров 1177. Ответов 0
Метки (Все метки)

Смотрел похожие темы. Исходники. Но так и не догнал, почему у меня фигура вращается не просто по кругу, а ещё и переворачивается! 0_о
Что не так? Где косяк сделал? Прошу помощи знающих.

main.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
//Main.cpp
//главный код программы
#include <windows.h>
#include <math.h>
#include "KWnd.h"
 
//объявляем оконную процедуру
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    MSG msg;    //структура сообщений
    KWnd MainWnd("Main Form", hInstance, nCmdShow, WndProc);    //объявляем класс главного окна
 
    //обработка сообщений
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);     //преобразование в код сообщения
        DispatchMessage(&msg);      //отправка на обработку оконной процедуре
    }
 
    return msg.wParam;
}
 
//начальные координаты треугольника
const POINT oldtr[4] = {{250, 150},{400, 150},{250, 400},{250, 150}};
//координаты треугольника поддающиеся изменению
POINT tr[4] = {{250, 150},{400, 150},{250, 400},{250, 150}};
//координаты центра треугольника
POINT Center;
//угол альфа
double alp = 0.0;
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    HDC hDC;    //дескриптор контекст-устройства
 
    //кейс сообщений
    switch(uMsg)
    {
    //в случае закрытия формы
    case WM_CLOSE:
        DestroyWindow(hWnd);    //передаём дескриптор окна функции разрушения формы
        break;
    
    //в случае работы с колёсиком мыши
    case WM_MOUSEWHEEL:
        //обнуляем значения центра треугольника
        Center.x = 0;
        Center.y = 0;
        //возвращаем начальное положение координат треугольника
        for (int i = 0; i != 4; i++)
        {
            tr[i] = oldtr[i];
            //высчитываем центр треугольника
            if (i < 3)
            {
                Center.x += oldtr[i].x;
                Center.y += oldtr[i].y;
            }
        }
        //высчитываем центр треугольника
        Center.x = Center.x / 3;
        Center.y = Center.y / 3;
 
        //увеличиваем угол альфа
        alp += 0.1515;
 
        //вращаем треугольник
        for (int i = 0; i != 4; i++)
        {
            tr[i].x = (tr[i].x - Center.x) * cos(alp) - (tr[i].y - Center.y) * sin(alp) + Center.x;
            tr[i].y = (tr[i].x - Center.x) * sin(alp) + (tr[i].y - Center.y) * cos(alp) + Center.y;
        }
        break;
 
    //в случае перерисовки окна
    case WM_PAINT:
        //полуаем контекст устройства
        hDC = GetDC(hWnd);
        //прорисовываем треугольник
        Polyline(hDC, tr, 4);
        //освобождаем память
        ReleaseDC(hWnd, hDC);
        break;
 
    //в случае разрушения формы
    case WM_DESTROY:
        PostQuitMessage(0);     //отправляем сообщение WM_QUIT
        break;
    
    //в остальных случаях
    default:
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
 
    return 0;
}
KWnd.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
//KWnd.cpp
//Описание класса главного окна
#include "KWnd.h"
 
//описание конструктора класса
KWnd::KWnd(LPCTSTR windowName, HINSTANCE hInst, int cmdShow, LRESULT(WINAPI *pWndProc)(HWND, UINT, WPARAM, LPARAM),
        LPCTSTR menuName, int x, int y, int width, int height, UINT classStyle, DWORD windowStyle, HWND hParent)
{
    char szClassName[]="Main Class";    //массив с названием класса главного окна
    
    //заполняем стрктуру класса окна
    wc.cbSize        = sizeof(wc);  //размер класса
    wc.style         = classStyle;  //стиль класса окна
    wc.lpfnWndProc   = pWndProc;    //указатель на оконную процедуру
    wc.cbClsExtra    = 0;   //число дополнительный байтов в конце структуры класса
    wc.cbWndExtra    = 0;   //число дополнительных байтов в начале структуры класса
    wc.hInstance     = hInst;   //дескриптор экземпляра приложения
    wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);     //дескриптор иконки окна
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW); //дескриптор курсора
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //дескриптор кисти используемый для закраски фона окна
    wc.lpszMenuName  = menuName;    //указатель на строку содержащую имя меню
    wc.lpszClassName = szClassName; //указатель на строку содержащую имя окна
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION); //дескриптор малой иконки
 
    //регистрируем класс окна
    if (!RegisterClassEx(&wc))
    {
        char msg[100]="Ошибка при регистрации класса "; //массив с текстом ошибки
        
        strcat(msg, szClassName);   //склеиваем текст ошибки с названием окна
        MessageBox(hWnd, msg, "Error", MB_OK);  //показываем сообщение
        return;
    }
 
    //создаём окно
    hWnd = CreateWindow(szClassName, windowName, windowStyle,
                        x, y, width, height, hParent, HMENU(NULL), hInst, NULL);
 
    //проверка на ошибку при создании окна
    if (!hWnd)
    {
        char msg[100]="Произошла ошибка при создании окна ";    //массив с сообщением ошибки
        
        strcat(msg, windowName);    //склеиваем сообщение об ошибки с названием окна    
        MessageBox(hWnd, msg, "Error", MB_OK);  //показываем сообщение  
        return;
    }
    
    //отображаем окно
    ShowWindow(hWnd, cmdShow);
}
KWnd.h:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//KWnd.h 
//обяъвление класса главного окна
#include <windows.h>
 
class KWnd
{
public:
    //конструктор класса
    KWnd(LPCTSTR windowName, //название главного окна
         HINSTANCE hInst, //дестрикптор экземпляра приложения
         int cmdShow, //индентифицирует стиль окна
         LRESULT(WINAPI *pWndProc)(HWND,UINT,WPARAM,LPARAM),    //указатель на оконную процедуру
         LPCTSTR menuName = NULL, //название меню
         int x = CW_USEDEFAULT, //положения окна по оси Х
         int y = 0,
         int width = CW_USEDEFAULT, //ширина окна
         int height = 0,
         UINT classStyle = CS_HREDRAW | CS_VREDRAW, //опции стиля класса
         DWORD windowStyle = WS_OVERLAPPEDWINDOW, //опции стиля окна
         HWND hParent = NULL); //дескриптор окна
 
    //процедура запрашивающая дескриптор окна
    HWND GetHWnd()
    {
        return hWnd; 
    }
 
protected:
    HWND hWnd; //дескриптор окна
    WNDCLASSEX wc; //структура главного окна
};
Добавлено через 16 минут
Всем спасибо! Разобрался сам
Просто вместо начальный координат для вычисления радиуса
C++
1
2
oldtr[i].x - Center.x 
oldtr[i].y - Center.y
использовал преобразованные
C++
1
2
tr[i].x - Center.x 
tr[i].y - Center.y
Это всё последствия плохого питания и сна...Учёба...мать иё...Невнимательным только стал...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.