Наконец, я делюсь кодом с созданным мною решением.
Тестовое видео: https://1drv.ms/v/s!AqdWVn6k-HLbgqRw352kQ1HjuIJ5Hw
Решение проблемы перемещения повернутой фигуры с помощью мыши может быть решенобез векторов, создавая прозрачную маску, которая перекрывает исходное изображение.Есть некоторые ограничения, как видно из комментариев.
Процедуры перемещения мыши будут основаны на событиях в маске Timage, которая всегда остается без поворота на 0 градусов, в то время как повернутое изображение копирует расположение маскикогда это перемещено.Это на самом деле еще 2 строки кода и объявляют маску как новый пустой образ, повторяя исходный размер и положение.Я оставляю полный код, работающий правильно.
unit UMoveShape;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
FMX.Objects, FMX.StdCtrls, FMX.Controls.Presentation,
FireDAC.UI.Intf, FireDAC.FMXUI.Async, FireDAC.Stan.Intf,
FMX.DialogService.Async, System.UIConsts, System.Math.Vectors, FireDAC.Comp.UI, FMX.Edit,
FMX.ScrollBox, FMX.Memo;
type
TForm16 = class (TForm)
MyImage: TImage;
MyImageMask: TImage;
EditDegrees: TEdit;
ButtonRotate: TButton;
procedure FormCreate (Sender: TObject);
procedure MyImageMaskMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Single);
procedure MyImageMaskMouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X,
Y: Single);
procedure ButtonRotateClick (Sender: TObject);
private
{ Private declarations }
public
Xdiff, Ydiff: single;
MyRect1, MyRect2: TRectF;
Path: TPathData;
{ Public declarations }
end;
var
Form16 : TForm16;
implementation
{$R *.fmx}
procedure TForm16.ButtonRotateClick (Sender: TObject);
begin
MyImage.RotationAngle := EditDegrees.Text.ToSingle;
end;
procedure TForm16.FormCreate (Sender: TObject);
begin
// Original Image
MyImage.Width := 300;
MyImage.Height := 300;
MyImage.Bitmap.SetSize (Round (MyImage.Width), Round (MyImage.Height));
MyRect1 := TRectF.Create (98, 100, 200, 200);
MyRect2 := TRectF.Create (70, 90, 225, 210);
Path := TPathData.Create;
Path.AddEllipse (MyRect1);
Path.AddRectangle (MyRect2, 0, 0, AllCorners);
MyImage.Bitmap.Canvas.BeginScene;
MyImage.Bitmap.Canvas.DrawPath (path, 200);
MyImage.Bitmap.Canvas.EndScene;
MyImageMask.Width := MyImage.Width;
MyImageMask.Height := MyImage.Height;
MyImageMask.Position := MyImage.Position;
end;
procedure TForm16.MyImageMaskMouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState;
X,
Y: Single);
begin
if (ssleft in shift) then
begin
Xdiff := X;
Ydiff := y;
end;
end;
procedure TForm16.MyImageMaskMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Single);
begin
if (ssleft in shift) then
begin
MyImageMask.Position.X := MyImage.Position.X + X - Xdiff;
MyImageMask.Position.y := MyImage.Position.Y + Y - YDiff;
MyImage.Position.X := MyImageMask.Position.X;
MyImage.Position.y := MyImageMask.Position.Y;
Form16.Caption := 'X:' + MyImage.Position.X.ToString + ' Y: ' + MyImage.Position.y.ToString;
end;
end;
end.