Форум по 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,003
Версия 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,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

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

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

Примерно так:
Код:
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, время: 18:40.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter