Как повернуть многоугольник на заданный угол в C++ и Mathcad
Решая задачи, мы привыкли задавать прямоугольники или квадраты на плоскости со сторонами, параллельными осям координат, между тем, часто в расчётах требуется и "повёрнутое" расположение объекта.
В этой заметке показан код для "поворота" произвольного многоугольника, заданного матрицей координат вершин (первый столбец - x-координаты, второй столбец - y-координаты) относительно точки x_pivot
, y_pivot
на заданный в градусах угол angle
.
На C++ речь идёт только о вычислении новых координат вершин, в документе Mathcad построен также график. Тестовый объект - квадрат, показанный на картинке красным цветом. Чтобы проверить функцию, дважды выполняется поворот квадрата на угол в 45 градусов.
Листинг программы на C++, проверенной в консоли Visual Studio 2019:
#include <iostream> #define _USE_MATH_DEFINES #include <math.h> using namespace std; void rotate (double a[][2], int n, double x_pivot, double y_pivot, double angle) { //вращение многоугольника a, заданного координатами n вершин //относительно точки x_pivot, y_pivot на заданный в градусах угол angle const double g2r = M_PI/180.; angle *= g2r; for (int i = 0; i<n; i++) { double x_shifted = a[i][0] - x_pivot; double y_shifted = a[i][1] - y_pivot; a[i][0] = x_pivot + (x_shifted * cos(angle) - y_shifted * sin(angle)); a[i][1] = y_pivot + (x_shifted * sin(angle) + y_shifted * cos(angle)); } } void print(double a[][2], int n) { cout.precision(3); for (int i = 0; i < n; i++) { cout << "(" << a[i][0] << "," << a[i][1] << ")"; if (i < n-1) cout << ", "; } cout << endl; } int main() { double points[][2] = { {-1,-1},{-1,1},{1,1},{1,-1} }; //вращаем квадрат на 45 градусов: rotate(points,4,0,0,45); print(points, 4); //вторым вращением вернём стороны на место: rotate(points, 4, 0, 0, 45); print(points, 4); cin.get(); return 0; }
Вывод этой программы:
(0,-1.41), (-1.41,0), (0,1.41), (1.41,0) (1,-1), (-1,-1), (-1,1), (1,1)
график примера в Mathcad
Скачать этот пример в архиве .zip с документом .xmcd Mathcad 14/15 (16 Кб)
Замечания по документу Mathcad:
- В отличие от кода C++, вращающего массив координат вершин "на месте", функция Mathcad возвращает новый массив координат вершин
pr
. - Предполагается, что системное значение
ORIGIN
(начало нумерации элементов массивов) не менялось и равно нулю. - Массив
pointsC
нужен, чтобы "замкнуть" многоугольник, добавив в конец списка вершин дополнительную вершину, совпадающую с первой.
Про отображение многоугольника на графике Mathcad было также в этой заметке, как "подключить" число пи в Visual Studio было здесь.
29.07.2020, 15:52 [3278 просмотров]