0 / 0 / 0
Регистрация: 05.03.2020
Сообщений: 17
1

Поворот изображения на заданный угол

29.03.2022, 15:03. Показов 1240. Ответов 1
Метки с++ (Все метки)

Author24 — интернет-сервис помощи студентам
Есть участок, кода который должен поворачивать изображение на заданный угол, однако поворот происходит не на тот угол, а при 180 происходит отражение

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
double teta = 180.0f * alpha / 3.141592f;
    double halfW = W / 2;
    double halfH = H / 2;
    double r = sqrt((halfW * halfW) + (halfH * halfH));
    double b = atan2(halfH, halfW);
    double cosTeta = cos(teta);
    double sinTeta = sin(teta);
    double cosB = cos(b);
    double sinB = sin(b);
 
    for (int i = 0 - halfH; i < H - halfH; i++) {
        for (int j = 0 - halfW; j < W - halfW; j++) {
            int _x = (int)(i * cosTeta - j * sinTeta + r * cosB);
            int _y = (int)(i * sinTeta + j * cosTeta + r * sinB);
            if (_x < W && _y < H && _x >= 0 && _y >= 0)
                new_arr[(int)(i + halfH)][(int)(j + halfW)] = arr[_y][_x];
        }
    }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.03.2022, 15:03
Ответы с готовыми решениями:

Поворот фигуры на заданный угол
Добрый день. Простая задача - поворот фигуры, задаётся некоторый угол &quot;фи&quot;. Поворот относительно...

Поворот на заданный угол в радианах
Вроде бы такое должно реализовываться просто, но ни в какую не могу догадаться. Допустим, имеем...

Поворот вектора на заданный угол в двумерном пространстве
Поворот заданного вектора на заданный угол в двумерном пространстве. Входными данными являются три...

Поворот выделенной пользователем области изображения на заданный угол
Помогите! Необходимо выполнить поворот выделенной области изображения на заданный пользователем...

Поворот изображения на определенный угол. (Canvas)
Ребята, помогите пожалуйста дописать функцию поворота изображения на определенный градус. По какой...

1
случайный прохожий
2920 / 1937 / 606
Регистрация: 20.07.2013
Сообщений: 5,133
29.03.2022, 15:43 2
Поворот (вращение) изображения формата bmp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
// основная функция поворота bmp-изображения
void RotateBmpImage(TImage *ImageSource, TImage *ImageDestination, int angle, bool clockwise, TColor ImageDestBackgroundColor)
{
  // если картинка формата bmp
  if (ImageSource->Picture->Graphic->ToString() == "TBitmap")
  {
  // очищаем ImageDestination
  ImageDestination->Canvas->FillRect(ImageDestination->Canvas->ClipRect);
 
  // a - угол в градусах, используется angle;
  // b - угол (его величина задана ниже) наклона отрезка (к оси оХ),
  // проходящего через точки, которые делят высоту и ширину исходной картинки пополам
  double a = angle / 180. * M_PI, b;
 
  // изменяем размеры ImageDestination под габариты повернутого изображения
  ImageDestination->Width = ImageSource->Width * fabs(cos(a)) + ImageSource->Height * fabs(cos(M_PI/2-a));
  ImageDestination->Height = ImageSource->Width * fabs(sin(a)) + ImageSource->Height * fabs(sin(M_PI/2-a));
 
  // значения полуширины и полувысоты изображений (исходного и итогового)
  // расшифровка имен
  // первая буква: h - half; вторая: w - width, h - height;
  // третья буква: d - dest (целевая картинка), s - source (исходная)
  int hwd = ImageDestination->Width/2, hhd = ImageDestination->Height/2,
      hws = ImageSource->Width/2, hhs = ImageSource->Height/2,
  // r - радиус окружности, описанной вокруг (около) прямоугольника, который
  // образует ImageSource
      r = sqrt(hws * hws + hhs * hhs);
 
  // про b написано выше
  // важный момент: использование арктангенса atan2 для расчета I, J
  b = atan2(1. * hhs, hws);
 
  // заливка ImageDestination
  ImageDestination->Canvas->Brush->Color = ImageDestBackgroundColor;
  ImageDestination->Canvas->FloodFill(1, 1, clBlack, fsBorder);
 
  // направление поворота (по или против часовой стрелке)
  int dir = clockwise ? -1 : 1;
  double cos_a = cos(a), sin_a = sin(a), cos_b = cos(b), sin_b = sin(b);
 
  // в цикле пробегаем по всем точкам ImageDest
  // смещения hwd и hhd нужны для того, чтобы "правильно"
  // рисовать исходную картинку в ImageDest -
  // полностью [целиком] (кроме частей за границами Image)
  // и сдвинутую левым верхним углом к центру ImageDest
  for (int i = 0-hwd; i < ImageDestination->Width-hwd; i++)
    for (int j = 0-hhd; j < ImageDestination->Height-hhd; j++)
    {
      // I и J - координаты точек исходной картинки
      // правая часть формул (до r) нужна для поворота
      // картинки вокруг начальной точки (левый верхний угол)
      // слагаемые r*... нужны для того, чтобы вращение происходило
      // вокруг центра изображения
      int I =       i * cos_a - dir * j * sin_a + r * cos_b;
      int J = dir * i * sin_a +       j * cos_a + r * sin_b;
 
      // проверяем, не выходят ли точки за границы исходной картинки
      if (I < 2*hws  && I >= 0 && J < 2*hhs && J >= 0)
        // рисуем итоговое изображение
        ImageDestination->Canvas->Pixels[i+hwd][j+hhd] = ImageSource->Canvas->Pixels[I][J];
    }
  }
  else
    MessageBox(Application->Handle, L"Изображение должно быть в формате bmp.", L"Ошибка", 0);
}
Поворот изображения на заданный угол
0
29.03.2022, 15:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.03.2022, 15:43
Помогаю со студенческими работами здесь

Поворот изображения на заданный угол
задача: повернуть растровую картинку (скан) на некий угол (пара градусов). изучив...

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

Поворот изображения на заданный угол
Есть участок кода, который поворачивает изображение, но не корректно, есть предположения, почему? ...

Поворот эллипса на заданный угол
Используя формулы поворота на заданный угол относительно заданной точки получить поворот эллипса на...

Поворот многоугольника на заданный угол
Доброго времени суток! Требуется повернуть заданный многоугольник на угол (вводит пользователь) ...

Поворот треугольника на заданный угол
Всем доброго времени суток! Есть задача описать класс, представляющий треугольник. Предусмотреть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru