Перейти к содержанию
Fire Monkey от А до Я
  • 0

Как повернуть контрол на 90 градусов?


Dimonka

Вопрос

Задача - повернуть контрол на 90 градусов и при этом сохранить его положение в новых координатах. Как например лист страницы поворачиваем на 90 градусов. Поворот родительского контрола не подходит.

Следующий псевдокод правильно поворачивает контрол, если у него RotationAngle = 0

      Control.RotationAngle := Control.RotationAngle + 90;
      X := Control.Position.X;
      Y := Control.Position.Y + Control.Height;
      Control.Position.Point := PointF(ParentControl.Height - Y, X);

Что не хватает, чтобы учитывался изначальный угол поворота контрола?

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Так и в Вашем абстрактном примере компонент после поворота смещается черт знает куда... Если бы вы еще описали как после поворота компонент должен позиционироваться... А то остается только гадать, а я, увы, не телепат...

procedure TForm1.Button2Click(Sender: TObject);
var
  X, Y: Single;
begin
   X := Button1.Position.X;
   Y := Button1.Position.Y + Button1.Height;
   Button1.RotationCenter.X := 0;
   Button1.RotationCenter.Y := 0;
   Button1.RotationAngle := Button1.RotationAngle + ( 90 - Button1.RotationAngle );
   Button1.Position.X := X + Button1.Height;
   Button1.Position.Y := Y - Button1.Width;
end;
Ссылка на комментарий
  • 0

 

Так и в Вашем абстрактном примере компонент после поворота смещается черт знает куда... Если бы вы еще описали как после поворота компонент должен позиционироваться... А то остается только гадать, а я, увы, не телепат...

У меня тестовый контрол был симметричным.. Твой код хорош, только мне нужно сохранить центр вращения.

Ссылка на комментарий
  • 0

У меня тестовый контрол был симметричным.. Твой код хорош, только мне нужно сохранить центр вращения.

procedure TForm1.Button2Click(Sender: TObject);
var
  Center: TPointF;
begin
   Center.X := Button1.Position.X + ( Button1.Width / 2 );
   Center.Y := Button1.Position.Y + ( Button1.Height / 2 );
   Button1.RotationAngle := Button1.RotationAngle + ( 90 - Button1.RotationAngle );
   Button1.Position.X := Center.X - ( Button1.Width / 2 );
   Button1.Position.Y := Center.Y - ( Button1.Height / 2 );
end;
Ссылка на комментарий
  • 0

Не совсем то, что я хотел, но ответ меня натолкнул на правильное решение.

 

Выглядит это так. Форма (кусок):

  object RectPaper: TRectangle
    Height = 217.000000000000000000
    Position.X = 32.000000000000000000
    Position.Y = 24.000000000000000000
    Width = 369.000000000000000000
    object RectElement: TRectangle
      Fill.Color = xFFF3B4B4
      Height = 57.000000000000000000
      Position.X = 16.000000000000000000
      Position.Y = 32.000000000000000000
      RotationAngle = -20.000000000000000000
      Width = 137.000000000000000000
    end
  end

Вращение:

procedure TFormTest.Button1Click(Sender: TObject);
var
  H, W: single;
  R: TRectF;
  Center: TPointF;
  X, Y: Single;
begin
  // поворачиваем холст
  W := RectPaper.Width;
  H := RectPaper.Height;
  RectPaper.Width := H;
  RectPaper.Height := W;
  // поворачиваем обьект на холсте
  RectElement.RotationAngle := RectElement.RotationAngle + 90;
  R := RectElement.BoundsRect;
  Center := R.CenterPoint + RectElement.Position.Point;
  X := Center.X - RectElement.Height * 0.5;
  Y := Center.Y + RectElement.Width * 0.5;
  RectElement.Position.Point := PointF(H - Y, X);
  RectPaper.Repaint;
end;

В общем спасибо! Вопрос решён.

Ссылка на комментарий
Гость
Эта тема закрыта для публикации ответов.
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...