Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 16.04.2017, 17:39
Lishen Lishen вне форума
Прохожий
 
Регистрация: 16.04.2017
Сообщения: 3
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию вращение сектора

Всем привет! Пытаюсь написать программу, тема ООП, нужно нарисовать сектор и дугу окружности, чтобы при нажатии клавиш эти фигуры вращались вокруг оси на некоторый угол. Не могу понять, как это осуществить, нашла формулы для поворота сектора и с помощью команды rotate пробую описать поворот, но при нажатии клавиш ничего не происходит, помогите, исправьте,пожалуйста, что не так
Вложения
Тип файла: txt сектор.txt (1.6 Кбайт, 8 просмотров)
Ответить с цитированием
  #2  
Старый 17.04.2017, 06:41
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,105
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

А вокруг какой оси вращаться то должно все это?
Вокруг центра базовой окружности? Или вокруг произвольной точки?
Ответить с цитированием
  #3  
Старый 17.04.2017, 07:09
Lishen Lishen вне форума
Прохожий
 
Регистрация: 16.04.2017
Сообщения: 3
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
А вокруг какой оси вращаться то должно все это?
Вокруг центра базовой окружности
Ответить с цитированием
  #4  
Старый 17.04.2017, 07:58
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

SetWorldTransform. Примеров по вращению навалом в интернете.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #5  
Старый 17.04.2017, 21:58
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,105
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от NumLock
SetWorldTransform. Примеров по вращению навалом в интернете.

Походу, нафих не нужно. Если вращение идет вокруг базовой окружности, то достаточно просто посчитать угол и ПЕРЕРИСОВАТЬ картинку.

Примерно так:
Код:
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
unit Unit1;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;
 
type
  TShapeType = (stArc, stSector);
 
  TCircleShape = class
  private
    fShapeType : TShapeType; // Type of the shape - arc or sector
    fX0, fY0 : Integer; // Center of the circle
    fR : Integer; // Radius of the circle
    fAA : Integer; // Angle of sector/arc
    fAR : Integer; // Angle of rotation, by default = 0
  public
    constructor Create(X0,Y0,R : Integer; ArcAngle : Integer; ShapeType : TShapeType = stArc);
 
    function ToRadian(Angle : Integer) : Double;
 
    procedure PaintTo(ACanvas : TCanvas); // draw on provided canvas
    procedure Rotate(Angle : Integer); // Rotate to the angle
 
    property ShapeType : TShapeType read fShapeType write fShapeType;
  end;
 
  TForm1 = class(TForm)
    PaintBox1: TPaintBox;
    Button1: TButton;
    Button2: TButton;
    RadioButton1: TRadioButton;
    RadioButton2: TRadioButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure PaintBox1Paint(Sender: TObject);
    procedure RadioButton1Click(Sender: TObject);
  private
    { Private declarations }
    FShape : TCircleShape;
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
{TCircleShape}
 
constructor TCircleShape.Create(X0,Y0,R : Integer; ArcAngle : Integer; ShapeType : TShapeType = stArc);
begin
  fX0 := X0;
  fY0 := Y0;
  fR := R;
  fAA := ArcAngle;
  fShapeType := ShapeType;
 
  fAR := 0;
end;
 
function TCircleShape.ToRadian(Angle : Integer) : Double;
begin
  Result := (Angle * 2 * PI) / 360;
end;
 
procedure TCircleShape.PaintTo(ACanvas : TCanvas); // draw on provided canvas
var
  X1, Y1 : Integer;
  X2, Y2 : Integer;
begin
  X1 := fX0 + Round(fR*Cos(fAR*2*PI/340));
  Y1 := fY0 - Round(fR*Sin(fAR*2*PI/340));
  X2 := fX0 + Round(fR*Cos((fAR-fAA)*2*PI/340));
  Y2 := fY0 - Round(fR*Sin((fAR-fAA)*2*PI/340));
 
  ACanvas.Arc(fX0-fR,fY0-fR,fX0+fR,fY0+fR,X2,Y2,X1,Y1);
 
  If fShapeType = stSector Then
    Begin
      ACanvas.MoveTo(fX0,fY0);
      ACanvas.LineTo(X1,Y1);
      ACanvas.MoveTo(fX0,fY0);
      ACanvas.LineTo(X2,Y2);
    End;
end;
 
procedure TCircleShape.Rotate(Angle : Integer); // Rotate to the angle
begin
  fAR := fAR + Angle;
end;
 
{TForm1}
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  FShape.Rotate(5);
  PaintBox1.Repaint;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  FShape.Rotate(-5);
  PaintBox1.Repaint;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  FShape := TCircleShape.Create(100,100,50,20);
  PaintBox1.Repaint;
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
  FreeAndNil(FShape);
end;
 
procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
  PaintBox1.Canvas.FillRect(Rect(0,0,PaintBox1.Width,PaintBox1.Height));
  FShape.PaintTo(PaintBox1.Canvas);
end;
 
procedure TForm1.RadioButton1Click(Sender: TObject);
begin
  If RadioButton1.Checked
    Then FShape.ShapeType := stArc
    Else FShape.ShapeType := stSector;
  PaintBox1.Repaint;
end;
 
end.

Проект в аттаче.
В принципе, класс можно переместить в отдельный модуль. Он никак не связан с формой, только тогда в форме указать uses этого модуля.
Вложения
Тип файла: zip example.ZIP (51.4 Кбайт, 10 просмотров)

Последний раз редактировалось lmikle, 18.04.2017 в 01:39.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
Lishen (18.04.2017)
  #6  
Старый 19.04.2017, 07:10
Lishen Lishen вне форума
Прохожий
 
Регистрация: 16.04.2017
Сообщения: 3
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Спасибо большое за помощь
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:01.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025