Browse Source

Fixed 45 inc pos algorithm and line snap highlight

Krzysztof Krysiński 3 months ago
parent
commit
893188aa0e

+ 17 - 16
src/PixiEditor/Helpers/GeometryHelper.cs

@@ -6,31 +6,32 @@ public static class GeometryHelper
 {
 {
     public static VecD Get45IncrementedPosition(VecD startPos, VecD curPos)
     public static VecD Get45IncrementedPosition(VecD startPos, VecD curPos)
     {
     {
-        Span<VecD> positions =
+
+        VecD delta = curPos - startPos;
+        VecD signs = delta.Signs();
+        VecD offset = new VecD(0).Multiply(signs);
+
+        VecD[] positions =
         [
         [
-            (curPos.ProjectOntoLine(startPos, startPos + new VecD(1, 1)) -
-                   new VecD(0.25).Multiply((curPos - startPos).Signs())),
-            (curPos.ProjectOntoLine(startPos, startPos + new VecD(1, -1)) -
-                   new VecD(0.25).Multiply((curPos - startPos).Signs())),
-            (curPos.ProjectOntoLine(startPos, startPos + new VecD(1, 0)) -
-                   new VecD(0.25).Multiply((curPos - startPos).Signs())),
-            (curPos.ProjectOntoLine(startPos, startPos + new VecD(0, 1)) -
-                   new VecD(0.25).Multiply((curPos - startPos).Signs()))
+            curPos.ProjectOntoLine(startPos, startPos + new VecD(1, 1)),
+            curPos.ProjectOntoLine(startPos, startPos + new VecD(1, -1)),
+            curPos.ProjectOntoLine(startPos, startPos + new VecD(1, 0)),
+            curPos.ProjectOntoLine(startPos, startPos + new VecD(0, 1))
         ];
         ];
 
 
-        VecD max = positions[0];
-        double maxLength = double.MaxValue;
+        VecD closest = positions[0];
+        double minDistSq = double.MaxValue;
         foreach (var pos in positions)
         foreach (var pos in positions)
         {
         {
-            double length = (pos - curPos).LengthSquared;
-            if (length < maxLength)
+            double distSq = (pos - curPos).LengthSquared;
+            if (distSq < minDistSq)
             {
             {
-                maxLength = length;
-                max = pos;
+                minDistSq = distSq;
+                closest = pos;
             }
             }
         }
         }
 
 
-        return max;
+        return closest;
     }
     }
 
 
     public static VecI Get45IncrementedPositionAligned(VecD startPos, VecD curPos)
     public static VecI Get45IncrementedPositionAligned(VecD startPos, VecD curPos)

+ 1 - 1
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/LineExecutor.cs

@@ -155,7 +155,7 @@ internal abstract class LineExecutor<T> : SimpleShapeToolExecutor where T : ILin
             startDrawingPos = center + (center - snapped);
             startDrawingPos = center + (center - snapped);
         }
         }
 
 
-        HighlightSnapping(snapX, snapY);
+        HighlightSnapping(snapX, snapY, !string.IsNullOrEmpty(snapX) || !string.IsNullOrEmpty(snapY) ? snapped : null);
         document!.LineToolOverlayHandler.LineEnd = snapped;
         document!.LineToolOverlayHandler.LineEnd = snapped;
 
 
         curPos = snapped;
         curPos = snapped;

+ 7 - 7
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/SimpleShapeToolExecutor.cs

@@ -154,7 +154,7 @@ internal abstract class SimpleShapeToolExecutor : UpdateableChangeExecutor,
 
 
     public override void OnLeftMouseButtonUp(VecD argsPositionOnCanvas)
     public override void OnLeftMouseButtonUp(VecD argsPositionOnCanvas)
     {
     {
-        HighlightSnapping(null, null);
+        HighlightSnapping(null, null, null);
         ActiveMode = ShapeToolMode.Transform;
         ActiveMode = ShapeToolMode.Transform;
     }
     }
 
 
@@ -168,7 +168,7 @@ internal abstract class SimpleShapeToolExecutor : UpdateableChangeExecutor,
     {
     {
         ActiveMode = ShapeToolMode.Preview;
         ActiveMode = ShapeToolMode.Preview;
         AddMembersToSnapping();
         AddMembersToSnapping();
-        HighlightSnapping(null, null);
+        HighlightSnapping(null, null, null);
     }
     }
 
 
     public virtual void OnLineOverlayMoved(VecD start, VecD end)
     public virtual void OnLineOverlayMoved(VecD start, VecD end)
@@ -183,14 +183,14 @@ internal abstract class SimpleShapeToolExecutor : UpdateableChangeExecutor,
     {
     {
         StopMode(activeMode);
         StopMode(activeMode);
         AddMembersToSnapping();
         AddMembersToSnapping();
-        HighlightSnapping(null, null);
+        HighlightSnapping(null, null, null);
     }
     }
 
 
-    protected void HighlightSnapping(string? snapX, string? snapY)
+    protected void HighlightSnapping(string? snapX, string? snapY, VecD? snapPoint)
     {
     {
         document!.SnappingHandler.SnappingController.HighlightedXAxis = snapX;
         document!.SnappingHandler.SnappingController.HighlightedXAxis = snapX;
         document!.SnappingHandler.SnappingController.HighlightedYAxis = snapY;
         document!.SnappingHandler.SnappingController.HighlightedYAxis = snapY;
-        document.SnappingHandler.SnappingController.HighlightedPoint = null;
+        document.SnappingHandler.SnappingController.HighlightedPoint = snapPoint;
     }
     }
 
 
     protected void AddMembersToSnapping()
     protected void AddMembersToSnapping()
@@ -202,7 +202,7 @@ internal abstract class SimpleShapeToolExecutor : UpdateableChangeExecutor,
     {
     {
         VecD snapped =
         VecD snapped =
             document.SnappingHandler.SnappingController.GetSnapPoint(pos, out string snapX, out string snapY);
             document.SnappingHandler.SnappingController.GetSnapPoint(pos, out string snapX, out string snapY);
-        HighlightSnapping(snapX, snapY);
+        HighlightSnapping(snapX, snapY, snapped);
         return snapped;
         return snapped;
     }
     }
 
 
@@ -211,7 +211,7 @@ internal abstract class SimpleShapeToolExecutor : UpdateableChangeExecutor,
         VecD mouseSnap =
         VecD mouseSnap =
             document.SnappingHandler.SnappingController.GetSnapPoint(pos, out string snapXAxis,
             document.SnappingHandler.SnappingController.GetSnapPoint(pos, out string snapXAxis,
                 out string snapYAxis);
                 out string snapYAxis);
-        HighlightSnapping(snapXAxis, snapYAxis);
+        HighlightSnapping(snapXAxis, snapYAxis, null);
 
 
         if (!string.IsNullOrEmpty(snapXAxis) || !string.IsNullOrEmpty(snapYAxis))
         if (!string.IsNullOrEmpty(snapXAxis) || !string.IsNullOrEmpty(snapYAxis))
         {
         {