Можете ли вы сказать, почему это вращение 2D-прямоугольника не работает?

я использую эта библиотека BGI из Университета Колорадо, чтобы изучить основы компьютерной графики.

Я взял теорию из Вот.

Вы можете скачать весь проект VC ++ 2008 Express с Вот.

Перевод и масштабирование работают. Но проблема в том, что операция вращения не работает.

Вывод следующий:
введите описание изображения здесь

Для меня правильное вращение должно быть следующим:

введите описание изображения здесь

Код поворота здесь:

#include "graphics.h"#include "Vector2d.h"#include "Coordinates2d.h"#include <math.h>

#define PI      3.14
#define THETA   15.0*PI/180

int main()
{
Matrix rotMat(3, 3);
/*
cos   -sin   0
sin    cos   0
0      0    1
*/
rotMat.SetItem(0, 0, cos(THETA));   rotMat.SetItem(0, 1, -sin(THETA));  rotMat.SetItem(0, 2, 0);
rotMat.SetItem(1, 0, sin(THETA));   rotMat.SetItem(1, 1, cos(THETA));   rotMat.SetItem(1, 2, 0);
rotMat.SetItem(2, 0, 0);    rotMat.SetItem(2, 1, 0);    rotMat.SetItem(2, 2, 1);
rotMat.Show();
//rotMat.Transpose();
rotMat.Show();

//This is a wrapper to display a 2D rectangle.
Coordinates2d::ShowWindow("Test window");

Rectangle2d rect(Point2d(0,0), Point2d(150,150));

Coordinates2d::Draw(rect);

Matrix a = rect.Get3x3MatrixStart(); a.Show();
Matrix b = rect.Get3x3MatrixEnd();b.Show();

a = a.Multiply(rotMat);a.Show();
b = b.Multiply(rotMat);b.Show();

rect.SetStart(a);
rect.SetEnd(b);

Coordinates2d::Draw(rect);

/////////////////////

while (!kbhit())
{
delay(200);
}
return 0;
}

1

Решение

Ваша проблема в вашей функции sin и cos, используемой для создания матрицы вращения. Функции sin и cos принимают в качестве аргумента угол в радианах …

РЕДАКТИРОВАТЬ:

Вы должны также дважды проверить свою матрицу вращения. В [0,1] должен быть -sin (тэта) и в [1,0] sin (тэта). Это стандартно, но это зависит от того, какое вращение вы хотите по часовой стрелке или против часовой стрелки

1

Другие решения


По вопросам рекламы [email protected]