Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++ Builder

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.60
ijonhson
47 / 47 / 1
Регистрация: 09.03.2011
Сообщений: 584
#1

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

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

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

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

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

Поворот изображения - C++ Builder
Доброго всем времени суток. Хотел бы узнать как можно реализовать поворот изображения как в браузере Safari. Заранее благодарен.

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

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

Поворот изображения в Image - C++ Builder
Необходимо по нажатию на кнопку поворачивать изображение в Image на 180 градусов. Подскажите как это осуществить в C++ Builder. Вот нашел...

8
Lelik-pahan
1360 / 779 / 94
Регистрация: 25.11.2009
Сообщений: 1,590
Завершенные тесты: 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 / 1
Регистрация: 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 / 35
Регистрация: 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 / 1
Регистрация: 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 / 35
Регистрация: 06.02.2012
Сообщений: 1,373
22.02.2013, 03:56 #6
Цитата Сообщение от ijonhson Посмотреть сообщение
функция компилируется нормально,но возвращает нетрансформированный битмап
сравните мой код и свой. Видите разницу? Где ваш ModifyWorldTransform?
0
ijonhson
47 / 47 / 1
Регистрация: 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 / 1
Регистрация: 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 Кб, 45 просмотров)
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
Привет! Вот еще темы с ответами:

Поворот (вращение) изображения формата bmp - C++ Builder
Решил реализовать данную задачу, используя лишь математику (теорию взял из Википедии - &quot;поворот Гивенса&quot;, &quot;поворот&quot;, &quot;матрица поворота&quot;,...

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

Поворот изображения относительно любой ночки - C++ Builder
Есть код, который поворачивает изображение на заданный угол. Поворот происходит относительно центра, помогите пожалуйста переписать так,...

Вращение отрезка вокруг точки - C++ Builder
Здравствуйте, помогите с заданием, никогда не работала с графикой и свойствами подобных объектов на языке си... Данную задачу могу...


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

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

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