БлогNot. Как повернуть многоугольник на заданный угол в C++ и Mathcad

Как повернуть многоугольник на заданный угол в 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
график примера в Mathcad

 Скачать этот пример в архиве .zip с документом .xmcd Mathcad 14/15 (16 Кб)

Замечания по документу Mathcad:

  • В отличие от кода C++, вращающего массив координат вершин "на месте", функция Mathcad возвращает новый массив координат вершин pr.
  • Предполагается, что системное значение ORIGIN (начало нумерации элементов массивов) не менялось и равно нулю.
  • Массив pointsC нужен, чтобы "замкнуть" многоугольник, добавив в конец списка вершин дополнительную вершину, совпадающую с первой.

Про отображение многоугольника на графике Mathcad было также в этой заметке, как "подключить" число пи в Visual Studio было здесь.


теги: c++ mathcad графика учебное

29.07.2020, 15:52; рейтинг: 40