То, что Вы ищете, является функцией различных распределенных систем управления версиями такой как darcs.
Я бы просто преобразовал каждую точку, применяя одну и ту же матрицу вращения к каждой из них. Если это двухмерное плоское вращение, оно будет выглядеть так:
x' = x*cos(t) - y*sin(t)
y' = x*sin(t) + y*cos(t)
где (x, y) - исходные точки, (x ', y') - координаты поворота, а t - угол, измеренный в радианах от x -ось. Вращение происходит против часовой стрелки, как написано.
Я бы рекомендовал сделать это на бумаге один раз. Нарисуйте прямоугольник, вычислите новые координаты и перерисуйте прямоугольник, чтобы убедиться, что он правильный, прежде чем писать код. Затем используйте этот пример в качестве модульного теста, чтобы убедиться, что вы правильно его написали.
Я думаю, вы были на правильном пути, используя atan ()
, чтобы вернуть угол. Однако вы хотите передать высоту
, разделенную на ширину
, а не наоборот. Это даст вам угол по умолчанию (без вращения) к верхней правой вершине прямоугольника. Остальное у вас должно получиться следующим образом:
// Get the original/default vertex angles
GLfloat vertex1_theta = RAD_TO_DEG( atan(
(m_height/2 * m_scaleY)
/ (m_width/2 * m_scaleX) ) );
GLfloat vertex2_theta = -vertex1_theta; // lower right vertex
GLfloat vertex3_theta = vertex1_theta - 180; // lower left vertex
GLfloat vertex4_theta = 180 - vertex1_theta; // upper left vertex
// Now get the rotated vertex angles
vertex1_theta += rotation_angle;
vertex2_theta += rotation_angle;
vertex3_theta += rotation_angle;
vertex4_theta += rotation_angle;
//Calculate the distance from the center (same for each vertex)
GLfloat r = sqrt(pow(m_width/2*m_scaleX, 2) + pow(m_height/2*m_scaleY, 2));
/* Calculate each vertex (I'm not familiar with OpenGL, DEG_TO_RAD
* might be a constant instead of a macro)
*/
vertexN_x = m_position.x + cos(DEG_TO_RAD(vertexN_theta)) * r;
vertexN_y = m_position.y + sin(DEG_TO_RAD(vertexN_theta)) * r;
// Now you would draw the rectangle, proceeding from vertex1 to vertex4.
Для ясности, очевидно, более долгим, чем необходимо. Конечно, решение duffymo с использованием матрицы преобразования, вероятно, более элегантно и эффективно :)
EDIT : Теперь мой код должен действительно работать. Я изменил (ширина / высота)
на (высота / ширина)
и использовал постоянный радиус от центра прямоугольника для вычисления вершин. Рабочий код Python (черепаха) на http://pastebin.com/f1c76308c