я использую эта библиотека 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;
}
Ваша проблема в вашей функции sin и cos, используемой для создания матрицы вращения. Функции sin и cos принимают в качестве аргумента угол в радианах …
РЕДАКТИРОВАТЬ:
Вы должны также дважды проверить свою матрицу вращения. В [0,1] должен быть -sin (тэта) и в [1,0] sin (тэта). Это стандартно, но это зависит от того, какое вращение вы хотите по часовой стрелке или против часовой стрелки