Вычисление вершин повернутого прямоугольника

То, что Вы ищете, является функцией различных распределенных систем управления версиями такой как darcs.

6
задан Martin DeMello 24 September 2009 в 00:41
поделиться

2 ответа

Я бы просто преобразовал каждую точку, применяя одну и ту же матрицу вращения к каждой из них. Если это двухмерное плоское вращение, оно будет выглядеть так:

x' = x*cos(t) - y*sin(t)
y' = x*sin(t) + y*cos(t)

где (x, y) - исходные точки, (x ', y') - координаты поворота, а t - угол, измеренный в радианах от x -ось. Вращение происходит против часовой стрелки, как написано.

Я бы рекомендовал сделать это на бумаге один раз. Нарисуйте прямоугольник, вычислите новые координаты и перерисуйте прямоугольник, чтобы убедиться, что он правильный, прежде чем писать код. Затем используйте этот пример в качестве модульного теста, чтобы убедиться, что вы правильно его написали.

17
ответ дан 8 December 2019 в 12:21
поделиться

Я думаю, вы были на правильном пути, используя 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

2
ответ дан 8 December 2019 в 12:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: