Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/14: Рейтинг темы: голосов - 14, средняя оценка - 4.50
ijonhson
47 / 47 / 15
Регистрация: 09.03.2011
Сообщений: 584
1

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

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

Доброго времени суток остановился на моменте: необходимо развернуть изображение,в winapi есть setworldtransform,но мне она не подходит так как необходимо развернуть вокруг опорной точки,а setworldtransform разворачивает только вокруг левого верхнего угла если где-то есть такая функция подскажите очень не хочется вспоминать тригонометрию.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.02.2013, 20:30
Ответы с готовыми решениями:

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

Поворот изображения в 3D.
Кто знает как повернуть изображение и Image по 3 координатам?

Поворот изображения
Доброго всем времени суток. Хотел бы узнать как можно реализовать поворот...

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

Поворот изображения в Image
Необходимо по нажатию на кнопку поворачивать изображение в Image на 180...

8
Lelik-pahan
1364 / 782 / 175
Регистрация: 25.11.2009
Сообщений: 1,596
Завершенные тесты: 1
20.02.2013, 23:10 2
как вариант, поворачивать относительно угла, рассчитать смещение опорной точки и сдвинуть изображение так, чтобы опорная точка вернулась на изначальное место

Добавлено через 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  [ТС] 3
тогда придётся писать долгую функцию с расчётом того что изображение при смещении вылезет за рамки битмапа и будет обрезано

Добавлено через 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
431 / 398 / 57
Регистрация: 06.02.2012
Сообщений: 1,373
22.02.2013, 00:36 4
как минимум
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  [ТС] 5
функция компилируется нормально,но возвращает нетрансформированный битмап
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
431 / 398 / 57
Регистрация: 06.02.2012
Сообщений: 1,373
22.02.2013, 03:56 6
Цитата Сообщение от ijonhson Посмотреть сообщение
функция компилируется нормально,но возвращает нетрансформированный битмап
сравните мой код и свой. Видите разницу? Где ваш ModifyWorldTransform?
0
ijonhson
47 / 47 / 15
Регистрация: 09.03.2011
Сообщений: 584
27.02.2013, 18:59  [ТС] 7
взгляните пож. ещё разок свежим взгядом вроде всё правильно а результат не совсем тот что хотелось
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  [ТС] 8
фух основная проблема решена остался один момент избежать обрезания изображения :
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)
пример в архиве ниже
0
Вложения
Тип файла: rar Project1.rar (10.5 Кб, 46 просмотров)
kpoxaa
74 / 35 / 1
Регистрация: 03.08.2012
Сообщений: 447
14.03.2014, 17:40 9
Цитата Сообщение от ijonhson Посмотреть сообщение
тогда придётся писать долгую функцию с расчётом того что изображение при смещении вылезет за рамки битмапа и будет обрезано
у меня вот такая проблема... подскажите как исправить?
Поворот изображения относительно любой ночки

Добавлено через 2 минуты
ijonhson, у вас получилось исправить проблему с обрезанием изображения?
0
14.03.2014, 17:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.03.2014, 17:40

Поворот изображения на 90 градусов!
Как повернуть изображения Image на 90 градусов? Подскажите кому не трудно! За...

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

Поворот (вращение) изображения формата bmp
Решил реализовать данную задачу, используя лишь математику (теорию взял из...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru