2
0
Эх сурвалжийг харах

locking rotation angle 90 degrees unless Shift is pressed

Johann 6 жил өмнө
parent
commit
2387226549

+ 20 - 3
lazpaintcontrols/lcvectorrectshapes.pas

@@ -333,15 +333,32 @@ var
   ratio, d: single;
   m: TAffineMatrix;
   newSize, prevCornerVect, newCornerVect: TPointF;
+  angle,deltaAngle, zoom: single;
 begin
   BeginUpdate;
   if (ssAlt in AShift) and (VectDet(FXUnitBackup,FYUnitBackup)<>0) and (FXSizeBackup<>0) and (FYSizeBackup<>0) then
   begin
     prevCornerVect := AFactorX*(FXAxisBackup - FOriginBackup) + AFactorY*(FYAxisBackup - FOriginBackup);
     newCornerVect := (ANewCoord - FOriginBackup)*(1/GetCornerPositition);
-    m := AffineMatrixTranslation(FOriginBackup.x,FOriginBackup.y)*
-         AffineMatrixScaledRotation(prevCornerVect, newCornerVect)*
-         AffineMatrixTranslation(-FOriginBackup.x,-FOriginBackup.y);
+    m := AffineMatrixScaledRotation(prevCornerVect, newCornerVect);
+    if not (ssShift in AShift) then
+    begin
+      angle := arctan2(-m[2,1],m[1,1])*2/Pi;
+      deltaAngle := 0;
+      if abs(frac(angle)) < 0.1 then deltaAngle := -frac(angle)
+      else if frac(angle) > 0.9 then deltaAngle := +1-frac(angle)
+      else if frac(angle) < -0.9 then deltaAngle := -1-frac(angle)
+      else if abs(frac(angle)-0.5) < 0.1 then deltaAngle := 0.5-frac(angle)
+      else if abs(frac(angle)+0.5) < 0.1 then deltaAngle := -0.5-frac(angle);
+      if deltaAngle <> 0 then
+      begin
+        angle := (angle+deltaAngle)*Pi/2;
+        zoom := VectLen(m[1,1],m[2,1]);
+        m := AffineMatrixRotationRad(angle)*AffineMatrixScale(zoom,zoom);
+      end;
+    end;
+    m := AffineMatrixTranslation(FOriginBackup.x,FOriginBackup.y)*m
+        *AffineMatrixTranslation(-FOriginBackup.x,-FOriginBackup.y);
     FOrigin := FOriginBackup;
     FXAxis := m * FXAxisBackup;
     FYAxis := m * FYAxisBackup;