Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
Stef4n
0 / 0 / 0
Регистрация: 29.10.2011
Сообщений: 6
1

Такая проблема: осуществляю поворот относительно заданной точки на заданный(Button 5)

24.11.2011, 21:59. Просмотров 1171. Ответов 4
Метки нет (Все метки)

Фигура деформируется и вращается вокруг исходной фигуры,а должна вращаться относительно заданной точки.
Подскажите пожалуйста формулу для вычисления новых координат,после поворота



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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
#include "math.h"
#include <complex.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int Ax[200], By[200];
int n=0, i=0,k;
int x0,y0;
float rad=M_PI/180;
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
  if(n==0)
  {
    x0=X;
    y0=Y;
    Form1->Canvas->MoveTo(X,Y);
    Form1->Canvas->Pen->Color=RGB(255,0,0);
    n++;
    Ax[i]=X; By[i]=Y;
    i++;
  }
  else
  {
  Form1->Canvas->Pen->Color=RGB(255,0,0);
  Form1->Canvas->Pen->Width=1;
  if(Shift.Contains(ssCtrl)){Form1->Canvas->Brush->Color=RGB(40,255,40);}
  else{Form1->Canvas->Brush->Color=RGB(40,255,255);}
  Form1->Canvas->LineTo(X,Y);
  Ax[i]=X; By[i]=Y;
  i++;
  n++;
  if(Button==mbRight)
  {k=n;
  i=0;
    n=0;
    Form1->Canvas->LineTo(x0,y0);
 
  }
 
  }
}
//---------------------------------------------------------------------------
 
 
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Repaint();
Form1->Canvas->MoveTo(Ax[i]+100,By[i]);
for(i=1;i<k;i++){
Form1->Canvas->LineTo(Ax[i]+100,By[i]);}
Form1->Canvas->LineTo(Ax[0]+100,By[0]);
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Repaint();
Form1->Canvas->MoveTo(Ax[i],By[i]-100);
for(i=1;i<k;i++){
Form1->Canvas->LineTo(Ax[i],By[i]-100);}
Form1->Canvas->LineTo(Ax[0],By[0]-100);
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button3Click(TObject *Sender)
{ int p=Ax[1];
for(i=0;i<k;i++){
if(Ax[i]>Ax[i+1])p=Ax[i+1];
Repaint();
Form1->Canvas->MoveTo(Ax[i],By[i]);
for(i=1;i<k;i++){
Form1->Canvas->LineTo(Ax[i]*2,By[i]);}
Form1->Canvas->LineTo(Ax[0],By[0]);
}}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button4Click(TObject *Sender)
{
 int p=By[1];
for(i=0;i<k;i++){
if(By[i]>By[i+1])p=By[i+1];
 
 Repaint();
Form1->Canvas->MoveTo(Ax[i],By[i]);
for(i=1;i<k;i++){
Form1->Canvas->LineTo(Ax[i],By[i]*2);}
Form1->Canvas->LineTo(Ax[0],By[0]);
} }
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button5Click(TObject *Sender)
{
 float xx,yy;
 float r0[20];
 float zz[20];
 float tt[20];
int z,i;
int x[20];
int y[20];
z=StrToFloat(Edit1->Text);    //заданный угол в градусах
xx=StrToFloat(Edit2->Text);       // кординаты заданной
yy=StrToFloat(Edit3->Text);       // точки
 
   i=0;
   for(i=0;i<k;i++){
r0[i]=sqrt((xx-Ax[i])*(xx-Ax[i])+(yy-By[i])*(yy-By[i])); //рассотяние между текущей и заданной точками
zz[i]=acos((Ax[i]-xx)/r0[i]);  //угол расположения фигуры от заданной точки
tt[i]=asin((By[i]-yy)/r0[i]);
x[i]=Ax[i]+r0[i]*cos(z*rad+zz[i]*rad);       //новое положение
y[i]=By[i]-r0[i]*sin(z*rad+tt[i]*rad);       //фигуры
 
}
  i=0;
 
Form1->Canvas->MoveTo(x[i],y[i]);
for(i=1;i<k;i++){
Form1->Canvas->LineTo(x[i],y[i]);}
Form1->Canvas->LineTo(x[0],y[0]);
 
 
}
//---------------------------------------------------------------------------
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.11.2011, 21:59
Ответы с готовыми решениями:

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

Поворот треугольника относительно центра масс
Добрый вечер, уважаемые форумчане! Прошу вашей помощи!!! Задача: повернуть...

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

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

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

4
QVO
644 / 455 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4
Завершенные тесты: 3
25.11.2011, 02:02 2
cpp
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
//---------------------------------------------------------------------------
 
#include <vcl.h>
#include <math.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "WinXP"
#pragma resource "*.dfm"
TForm1 *Form1;
// Угол вращения
int i;
// Координата Х
int x,
// Координата Y
    y,
// Диаметр
    dx,
    dy,
// Толщина линий
    line_w,
// Скорость вращения фигур
    speed;
// Цвет линий
String line_c;
//
boolean iCad, iFigyre, iStart;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
  x = 100;      y = 100;
  dx = 100;     dy = 100;
  Timer1->Interval = 100;
  iCad = True;
  iFigyre = True;
  iStart = False;
  line_w = 1;
  line_c = Panel3->Color;
}
//---------------------------------------------------------------------------
 
 
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
 
Form1->Repaint();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormPaint(TObject *Sender)
{
  if(iCad){    i++;}
  if(!iCad){    i--;}
  Canvas->Pen->Width = line_w;
  Canvas->Pen->Color = StringToColor(line_c);
  Canvas->Brush->Color = clRed;
  if(iFigyre){    DrawAngleRectangle(x, y, dx, dy, i, Canvas->Handle);}
  if(!iFigyre){    DrawAngleEllipse(x, y, dx, dy, i, Canvas->Handle);}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Panel2MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
ReleaseCapture();
SendMessage(Panel1->Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::LabeledEdit1Change(TObject *Sender)
{
        x = StrToInt(LabeledEdit1->Text);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::LabeledEdit2Change(TObject *Sender)
{
        y = StrToInt(LabeledEdit2->Text);        
}
//---------------------------------------------------------------------------
void __fastcall TForm1::LabeledEdit3Change(TObject *Sender)
{
        dx = StrToInt(LabeledEdit3->Text);        
}
//---------------------------------------------------------------------------
void __fastcall TForm1::LabeledEdit4Change(TObject *Sender)
{
        dy = StrToInt(LabeledEdit4->Text);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::LabeledEdit5Change(TObject *Sender)
{
        Timer1->Interval = StrToInt(LabeledEdit5->Text);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
{
        iCad = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SpeedButton2Click(TObject *Sender)
{
        iCad = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SpeedButton3Click(TObject *Sender)
{
        iFigyre = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SpeedButton4Click(TObject *Sender)
{
        iFigyre = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::LabeledEdit6Change(TObject *Sender)
{
        line_w = StrToInt(LabeledEdit6->Text);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Panel3Click(TObject *Sender)
{
        if(ColorDialog1->Execute())
        {
        Panel3->Color = ColorDialog1->Color;
        line_c = Panel3->Color;
        }
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::SpeedButton5Click(TObject *Sender)
{
        if(iStart==true){
                                Timer1->Enabled = false;
                                SpeedButton5->Caption = "Старт";
                                iStart = false;
                        }
        else{
                    Timer1->Enabled = true;
                    SpeedButton5->Caption = "Стоп";
                    iStart = true;
            }
}
//---------------------------------------------------------------------------
h

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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
//---------------------------------------------------------------------------
 
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include <Buttons.hpp>
#include "WinXP.hpp"
#include <Dialogs.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TTimer *Timer1;
        TLabeledEdit *LabeledEdit1;
        TLabeledEdit *LabeledEdit2;
        TLabeledEdit *LabeledEdit3;
        TLabeledEdit *LabeledEdit4;
        TGroupBox *GroupBox1;
        TGroupBox *GroupBox2;
        TLabeledEdit *LabeledEdit5;
        TSpeedButton *SpeedButton1;
        TSpeedButton *SpeedButton2;
        TPanel *Panel1;
        TPanel *Panel2;
        TWinXP *WinXP1;
        TGroupBox *GroupBox3;
        TSpeedButton *SpeedButton3;
        TSpeedButton *SpeedButton4;
        TColorDialog *ColorDialog1;
        TSpeedButton *SpeedButton5;
        TPanel *Panel3;
        TLabel *Label1;
        TLabeledEdit *LabeledEdit6;
        void __fastcall Timer1Timer(TObject *Sender);
        void __fastcall FormPaint(TObject *Sender);
        void __fastcall Panel2MouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y);
        void __fastcall LabeledEdit1Change(TObject *Sender);
        void __fastcall LabeledEdit2Change(TObject *Sender);
        void __fastcall LabeledEdit3Change(TObject *Sender);
        void __fastcall LabeledEdit4Change(TObject *Sender);
        void __fastcall LabeledEdit6Change(TObject *Sender);
        void __fastcall LabeledEdit5Change(TObject *Sender);
        void __fastcall SpeedButton1Click(TObject *Sender);
        void __fastcall SpeedButton2Click(TObject *Sender);
        void __fastcall SpeedButton3Click(TObject *Sender);
        void __fastcall SpeedButton4Click(TObject *Sender);
        void __fastcall Panel3Click(TObject *Sender);
        void __fastcall SpeedButton5Click(TObject *Sender);
private:    // User declarations
public:     // User declarations
        __fastcall TForm1(TComponent* Owner);
//----------------------------------------------------------------------------
void RotateDC(HANDLE dc,float angle)
{
XFORM xform;
angle = angle * 3.1416 / 180.0;
xform.eDx = 0.0f;
xform.eDy = 0.0f;
xform.eM11 = cos(angle);
xform.eM12 = sin(angle);
xform.eM21 = -sin(angle);
xform.eM22 = cos(angle);
SetGraphicsMode(dc, GM_ADVANCED);
SetWorldTransform(dc, &xform);
}
//----------------------------------------------------------------------------
void DrawAngleEllipse(int x,int y, int wx,int wy,float angle,HDC dc)
{
RotateDC(dc,angle);
SetViewportOrgEx(dc,x,y,NULL);
Ellipse(dc,0-wx/2,0-wy/2,0+wx/2,0+wy/2);
SetViewportOrgEx(dc,0,0,NULL);
}
//----------------------------------------------------------------------------
void DrawAngleRectangle(int x,int y, int wx,int wy,float angle,HDC dc)
{
RotateDC(dc,angle);
SetViewportOrgEx(dc,x,y,NULL);
Rectangle(dc,0-wx/2,0-wy/2,0+wx/2,0+wy/2);
SetViewportOrgEx(dc,0,0,NULL);
}
//----------------------------------------------------------------------------
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
1
Stef4n
0 / 0 / 0
Регистрация: 29.10.2011
Сообщений: 6
25.11.2011, 09:43  [ТС] 3
что это?

Добавлено через 2 минуты
что это?мне то нужно просто узнать новые координаты фигуры после поворота
0
AntonChik
1085 / 583 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
25.11.2011, 10:17 4
C++
1
2
x[i]=MY_X+Ax[i]+r0[i]*cos(z*rad+zz[i]*rad);       //новое положение
y[i]=MY_Y+By[i]-r0[i]*sin(z*rad+tt[i]*rad);       //фигуры
так не пробовал?
1
Stef4n
0 / 0 / 0
Регистрация: 29.10.2011
Сообщений: 6
25.11.2011, 12:44  [ТС] 5
MY_X и MY_Y _что ты имеешь в виду под этими координатами???координаты точки относительно которой поворачиваем????или?
0
25.11.2011, 12:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2011, 12:44

Напишите программу, которая осуществляет поворот объекта относительно заданной точки на заданный угол
напишите программу,которая осуществляет поворот объекта относительно заданной...

Поворот объекта относительно заданной точки OpenGL ES 2.0
Здравствуйте! У меня есть прямоугольник 100 на 50, который я хочу повернуть...

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


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

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

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