Directional swipe cards (Tinder, Bumble-style stacks) generalize the single-axis list-row swipe into a true 2D vector gesture: the card can be dragged anywhere on the plane, and the same distance-OR-velocity dismiss test now runs on vector magnitudes instead of a single scalar:
r = (x, y) position vector from center
v = (vx, vy) release velocity vector (last ~100ms of samples)
dismiss = (|r| > θ·R) OR (|v| > v_fling)
θ = drag distance fraction, R = arena half-diagonal reference radius
The direction of r (or v, if the drag itself is tiny but fast) decides which action fires — this is the part a 1D horizontal swipe cannot express at all: a mostly-rightward vector reads as "Like", mostly-leftward as "Nope", and mostly-upward as "Super Like", exactly the three-way branch real swipe-card UIs implement with an angle test on the release vector.
If dismissed, the card exits under constant vector deceleration — a drag force that always opposes the velocity direction, at fixed magnitude a. Because deceleration is always anti-parallel to velocity, the path stays a straight ray and the closed-form stopping distance from 1D kinematics still holds along that ray:
d = |v|² / (2a) stopping distance along the fling direction
t = |v| / a time to stop
r(t) = r0 + v̂·(|v|t − ½at²) for t ≤ |v|/a
If not dismissed, the card returns to center as a 2D critically-damped spring (ζ = 1). Because the restoring force is linear and radially symmetric, the vector equation decouples into two independent critically-damped 1D oscillators, one per axis — verified numerically against the closed form below:
ẍ = −ω²x − 2ω ẋ , ÿ = −ω²y − 2ω ẏ (decoupled, same ω both axes)
x(t) = (x0 + (vx0 + ωx0)·t) e^(−ωt) (closed form, general v0 — not just x0(1+ωt)e^-ωt)
y(t) = (y0 + (vy0 + ωy0)·t) e^(−ωt)
- Distance slider — θ, the fraction of the arena's reference radius that counts as a committed drag.
- Fling velocity slider — v_fling in px/s, tested against the full 2D speed |v|, not just a horizontal component.
- Deceleration slider — how hard the fling is "braked"; the direction of deceleration always exactly opposes the current velocity vector, so a diagonal fling still travels in a straight line to its stop.
Drag the card anywhere on the plane with your pointer, release it, and the readouts show the vector magnitudes that actually fired the OR test plus the resolved direction. The 3D counterpart renders the same OR-decision constrained to one horizontal axis on a 3D card stack.