From 0206186575c0b8ec48d154586648dceb556be7ad Mon Sep 17 00:00:00 2001 From: Arno Keesman <34793978+arnokeesman@users.noreply.github.com> Date: Mon, 30 Oct 2023 20:21:01 +0100 Subject: [PATCH] improve snapInDirection logic (#179) Co-authored-by: Xander --- .../controlify/virtualmouse/VirtualMouseHandler.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/dev/isxander/controlify/virtualmouse/VirtualMouseHandler.java b/src/main/java/dev/isxander/controlify/virtualmouse/VirtualMouseHandler.java index 5f03f00..29aa1c1 100644 --- a/src/main/java/dev/isxander/controlify/virtualmouse/VirtualMouseHandler.java +++ b/src/main/java/dev/isxander/controlify/virtualmouse/VirtualMouseHandler.java @@ -214,16 +214,21 @@ public class VirtualMouseHandler { SnapPoint snapPoint = pair.getFirst(); Vector2d dist = pair.getSecond(); + // distance in the correct orthogonal direction double distance = Math.abs(direction.getAxis() == ScreenAxis.HORIZONTAL ? dist.x : dist.y); + // distance in the incorrect orthogonal direction double deviation = Math.abs(direction.getAxis() == ScreenAxis.HORIZONTAL ? dist.y : dist.x); - pair.getSecond().set(distance, deviation); + // punish deviation significantly + pair.getSecond().set(distance, deviation * 4); - return distance >= snapPoint.range(); + // reject if the deviation is double the correct direction away + return distance >= snapPoint.range() && (deviation < distance * 2); }) // pick the closest point .min(Comparator.comparingDouble(pair -> { Vector2d distDev = pair.getSecond(); + // x = dist, y = deviation return distDev.x + distDev.y; })) .map(Pair::getFirst);