Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.98/41: Рейтинг темы: голосов - 41, средняя оценка - 4.98
 Аватар для ijonhson
47 / 47 / 15
Регистрация: 09.03.2011
Сообщений: 584

Поворот изображения вокруг опорной точки

20.02.2013, 20:30. Показов 7975. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток остановился на моменте: необходимо развернуть изображение,в winapi есть setworldtransform,но мне она не подходит так как необходимо развернуть вокруг опорной точки,а setworldtransform разворачивает только вокруг левого верхнего угла если где-то есть такая функция подскажите очень не хочется вспоминать тригонометрию.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.02.2013, 20:30
Ответы с готовыми решениями:

Поворот фигуры вокруг точки в пространстве
Нужно крутить треугольник возле точки в пространстве, и всё бы хорошо да испольование формулы с википедии для поворота фигуры в 2д...

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

Поворот изображения вокруг точки
Мне нужно повернуть изображение вокруг точки с координатами (40, 60). Стандартные функции этого делать не позволяют и поворачивают...

8
 Аватар для Lelik-pahan
1703 / 899 / 207
Регистрация: 25.11.2009
Сообщений: 1,848
20.02.2013, 23:10
как вариант, поворачивать относительно угла, рассчитать смещение опорной точки и сдвинуть изображение так, чтобы опорная точка вернулась на изначальное место

Добавлено через 31 минуту
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<math.h>
//-----до поворота-----
int X, Y;  //координаты левого верхнего угла (точки, вокруг которой происходит вращение)
int Xop, Yop;  //координаты опорной точки (относительно левого верхнего угла)
int alfa; //угол, на который поворачиваем изображение
 
//координаты опорной точки (глобальные)
int gXop = X + Xop,
    gYop = Y + Yop;
 
 
//-----после поворота-----
//координаты опорной точки (глобальные), которые она получила после поворота
int ngXop = X + Xop * sin(alfa * M_PI / 180),   
    ngYop = Y + Yop * cos(alfa * M_PI / 180);
 
//координаты, которые нужно задать для верхнего левого угла изображения, чтобы выглядело, будто вращение вокруг опорной точки
int nX = X + ngXop - gXop,
    nY = Y + ngYop - gYop;
1
 Аватар для ijonhson
47 / 47 / 15
Регистрация: 09.03.2011
Сообщений: 584
21.02.2013, 21:32  [ТС]
тогда придётся писать долгую функцию с расчётом того что изображение при смещении вылезет за рамки битмапа и будет обрезано

Добавлено через 2 минуты
уже встал вопрос а что проще? написать свою rotate() или мандарнизировать то шо есть.

Добавлено через 4 часа 50 минут
и это справедливо только лдя угла<=45*

Добавлено через 17 часов 13 минут
пардон <90*

Добавлено через 1 минуту
Уважаемые граждане программисты памагыте, не могу допереть чего не разворачивает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 Graphics::TBitmap* vRotate(int viAngle,int X,int Y,AnsiString data)
{
 Graphics::TBitmap *bit1=new Graphics::TBitmap;
 bit1->LoadFromFile(data);
 float vfRradians=(2*M_PI*viAngle)/360;
 float vfCosinus=(float)cos(vfRradians);
 float vfSinus=(float)sin(vfRradians);
 int ngXop=X*vfSinus,ngYop=Y*vfCosinus;
 int nX=ngXop-X,nY=ngYop - Y;
 XFORM xform;
 xform.eM11=vfCosinus;
 xform.eM12=vfSinus;
 xform.eM21=-vfSinus;
 xform.eM22=vfCosinus;
 xform.eDx=nX;
 xform.eDy=nY;
 SetWorldTransform(bit1->Handle,&xform);
 return bit1;
 }
0
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
22.02.2013, 00:36
как минимум
C++
1
float vfRradians=(2.*M_PI*viAngle)/360.;
Добавлено через 14 минут
такой пример у меня работает
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
    Graphics::TBitmap*b;
    b=new Graphics::TBitmap;
    Graphics::TBitmap*b2;
    b2=new Graphics::TBitmap;
    b2->LoadFromFile("C:\\2.bmp");
    TXForm xf;
 
    xf.eM11=0.7;
    xf.eM12=-0.7;
    xf.eM21=0.7;
    xf.eM22=0.7;
    xf.eDx=-50;
    xf.eDy=100;
    b->Width=200;
    b->Height=200;
 
    SetGraphicsMode(b->Canvas->Handle, GM_ADVANCED);
    SetWorldTransform(b->Canvas->Handle, &xf);
    //  b->Canvas->Ellipse(30, 60, 170, 140);
    b->Canvas->Draw(50, 50, b2);
 
    ModifyWorldTransform(b->Canvas->Handle, &xf, MWT_IDENTITY);
    Canvas->Draw(0, 0, b);
    delete b;
   delete b2;
1
 Аватар для ijonhson
47 / 47 / 15
Регистрация: 09.03.2011
Сообщений: 584
22.02.2013, 00:54  [ТС]
функция компилируется нормально,но возвращает нетрансформированный битмап
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Graphics::TBitmap* vRotate(int viAngle,int X,int Y,AnsiString data)
{
 Graphics::TBitmap *bit1=new Graphics::TBitmap;
 bit1->LoadFromFile(data);
 float vfRradians=(2.*M_PI*(double)viAngle)/360.;
 float vfCosinus=(float)cos(vfRradians);
 float vfSinus=(float)sin(vfRradians);
 SetGraphicsMode(bit1->Canvas->Handle,GM_ADVANCED);
 int ngXop=X*vfSinus,ngYop=Y*vfCosinus;
 int nX=ngXop-X,nY=ngYop - Y;
 XFORM xform;
 xform.eM11=vfCosinus;
 xform.eM12=vfSinus;
 xform.eM21=-vfSinus;
 xform.eM22=vfCosinus;
 xform.eDx=nX;
 xform.eDy=nY;
 SetWorldTransform(bit1->Canvas->Handle,&xform);
 return bit1;
 }
Добавлено через 6 минут
C++
1
2
3
4
5
6
void __fastcall TForm1::Button1Click(TObject *Sender)
{ Graphics::TBitmap* bitt= new Graphics::TBitmap;
bitt=vRotate(180,100,150,"D:\\проги\\будильник\\14.bmp");// отрисовка
Canvas->Draw(0,0,bitt);
 
}
0
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
22.02.2013, 03:56
Цитата Сообщение от ijonhson Посмотреть сообщение
функция компилируется нормально,но возвращает нетрансформированный битмап
сравните мой код и свой. Видите разницу? Где ваш ModifyWorldTransform?
0
 Аватар для ijonhson
47 / 47 / 15
Регистрация: 09.03.2011
Сообщений: 584
27.02.2013, 18:59  [ТС]
взгляните пож. ещё разок свежим взгядом вроде всё правильно а результат не совсем тот что хотелось
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
#define min(a, b) (((a) < (b)) ? (a) : (b))
#define max(a, b) (((a) > (b)) ? (a) : (b))
#pragma hdrstop
#include "Unit2.h"
  //-----------------------------------------
Graphics::TBitmap* vRotate(int viAngle,int Xop,int Yop,Graphics::TBitmap *pFromBitmap=new Graphics::TBitmap)
{
 Graphics::TBitmap *pToBitmap=new Graphics::TBitmap;
 int ngXop = (int)(Xop * sin((float)viAngle * M_PI / 180)),
    ngYop = (int)(Yop * cos((float)viAngle * M_PI / 180));
int nX =  ngXop - Xop,
    nY =  ngYop - Yop;
 pFromBitmap;
 float vfRradians=(2*3.1416*viAngle)/360;
 float vfCosinus=(float)cos(vfRradians);
 float vfSinus=(float)sin(vfRradians);
 pToBitmap->Height=pFromBitmap->Height;
 pToBitmap->Width=pFromBitmap->Width;
 for(int y = 0;y < pToBitmap->Height; y++)
 {
  for(int x=0;x<pToBitmap->Width;x++)
  {
   int pFromBitmapx=(int)((x)*vfCosinus+(y)*vfSinus);
   int pFromBitmapy=(int)((y)*vfCosinus-(x)*vfSinus);
   pFromBitmapx=pFromBitmapx-nX;
   pFromBitmapy=pFromBitmapy-nY;
   if(pFromBitmapx>=0&&pFromBitmapx<pFromBitmap->Width&&pFromBitmapy>=0&&
      pFromBitmapy<pFromBitmap->Height)
   {
    pToBitmap->Canvas->Pixels[x][y]=
    pFromBitmap->Canvas->Pixels[pFromBitmapx][pFromBitmapy];
   }
  }
 }
  return pToBitmap;
}
#pragma package(smart_init)
где-то что-то не учёл

Добавлено через 8 минут
Остановился на попиксельной трансформации так-как такую функцию легко переделать под вращение любого массива точек соответственно и под массив POINT для регионов и т.д.
0
 Аватар для ijonhson
47 / 47 / 15
Регистрация: 09.03.2011
Сообщений: 584
28.02.2013, 00:09  [ТС]
фух основная проблема решена остался один момент избежать обрезания изображения :
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
#define min(a, b) (((a) < (b)) ? (a) : (b))
#define max(a, b) (((a) > (b)) ? (a) : (b))
#pragma hdrstop
#include "Unit2.h"
  //-----------------------------------------
Graphics::TBitmap* vRotate(int viAngle,int Xop,int Yop,Graphics::TBitmap *pFromBitmap=new Graphics::TBitmap)
{
 Graphics::TBitmap *pToBitmap=new Graphics::TBitmap;
 pFromBitmap;
 float vfRradians=(2*3.1416*viAngle)/360;
 float vfCosinus=(float)cos(vfRradians);
 float vfSinus=(float)sin(vfRradians);
  int nX =  Xop-(int)((Xop)*vfCosinus+(Yop)*vfSinus),
    nY = Xop-(int)((Yop)*vfCosinus-(Xop)*vfSinus);
 pToBitmap->Height=pFromBitmap->Height;
 pToBitmap->Width=pFromBitmap->Width;
 for(int y = 0;y < pToBitmap->Height; y++)
 {
  for(int x=0;x<pToBitmap->Width;x++)
  {
   int pFromBitmapx=(int)((x)*vfCosinus+(y)*vfSinus);
   int pFromBitmapy=(int)((y)*vfCosinus-(x)*vfSinus);
   pFromBitmapx=pFromBitmapx;
   pFromBitmapy=pFromBitmapy;
   if(pFromBitmapx>=0&&pFromBitmapx<pFromBitmap->Width&&pFromBitmapy>=0&&
      pFromBitmapy<pFromBitmap->Height)
   {
    pToBitmap->Canvas->Pixels[x][y]=
    pFromBitmap->Canvas->Pixels[pFromBitmapx+nX][pFromBitmapy+nY];
   }
  }
 }
  return pToBitmap;
}
#pragma package(smart_init)
пример в архиве ниже
Вложения
Тип файла: rar Project1.rar (10.5 Кб, 63 просмотров)
0
75 / 36 / 1
Регистрация: 03.08.2012
Сообщений: 447
14.03.2014, 17:40
Цитата Сообщение от ijonhson Посмотреть сообщение
тогда придётся писать долгую функцию с расчётом того что изображение при смещении вылезет за рамки битмапа и будет обрезано
у меня вот такая проблема... подскажите как исправить?
Поворот изображения относительно любой ночки

Добавлено через 2 минуты
ijonhson, у вас получилось исправить проблему с обрезанием изображения?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.03.2014, 17:40
Помогаю со студенческими работами здесь

Поворот точки вокруг другой точки в трехмерном пространстве
Есть точка A с координатами . Есть точка B -центр поворота . Я поворачиваю A на 90 градусов по часовой стрелке вокруг B по оси (Z)....

Поворот точки вокруг другой точки
Собственно задачу я перед собой поставил вращать вокруг центра основания треуольник... нашел формулу вот тут (**********), и впихнул ее в...

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

Поворот линии вокруг точки
Здравствуйте, как в PictureBoxX нарисовав вертикально лини, менять ее угол наклона от 90* до 0 спомощью трекбара ? (выглядит как дворники...

Поворот изображения вокруг своей оси
Пытаюсь вращать изображение (круговое). Но оно вместо того что бы крутится в центре, крутится от своих координат 0, 0. Подскажите, как...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru