Dragging Cards

English version here

Für das Lebenswege-Projekt wollten wir eine Ansammlung von kleinen Karten auf einem Tisch simulieren, die mit der Maus oder dem Finger bewegt werden können. Das alleine ist keine besonders ausgefallene Idee und wurde sicher schon vielfach umgesetzt, aber trotzdem stellt sich die Frage, wie modelliert man die Bewegung von Karten, wenn man sie an verschiedenen Stellen anfassen und in verschiedene Richtungen ziehen können soll? In unserer Umsetzung kann man die Karten nicht direkt anfassen, sondern streicht nur sanft darüber, aber das ist dann bloß eine Skalierung des Kraftvektors, die zugrunde liegende Frage bleibt bestehen.

Von der groben Intuition her, fasst man eine Karte in der Mitte an, soll sie sich einfach verschieben lassen, egal in welche Richtung, ohne Drehung. Fasst man sie hingegen an der Ecke an und bewegt den Finger im Kreis um den Kartenmittelpunkt, sollte die Bewegung der Karte eher einer Rotation folgen.

Übersetzt man diese Annahmen in Vektoren, ist es sinnvoll, den Koordinatenursprung auf den Kartenmittelpunkt zu legen. Sei cc der Berührungspunkt in diesem Koordinatensystem und uu der angewendete Kraftvektor. Wir wollen also eine Drehung nur dann zulassen wenn cc und uu nicht parallel liegen, also eine Bewegung hin zum oder weg vom Mittelpunkt soll keine Drehung auslösen. In dem anderen Fall soll der Drehimpuls mit der Länge von cc, also dem Abstand vom Berührungspunkt zum Mittelpunkt, und dem Anteil der radial angewendeten Kraft anwachsen.

Diese Abhängigkeiten werden unter anderem vom sogenannten Kreuzprodukt

c×u:=cxuycyuxc\times u:=c_xu_y-c_yu_x

abgebildet, was den signierten Flächeninhalt des von den beiden Vektoren aufgespannten Parallelograms beschreibt und sehr einfach zu berechnen ist. In vielen Anwendungsfällen, wie auch hier, tritt das Parallelogram nicht direkt in Erscheinung, der Flächeninhalt erfüllt nur genau die richtigen Anforderungen an Abhängigkeit zu Vektorlängen und Winkel.

Wenn wir aus einer Berührung an der Ecke und Bewegung um den Mittelpunkt genau eine Kartenrotation um den Mittelpunkt haben wollen, müssen wir noch passend normieren. Die obere Rechte Ecke entspricht c=(w/2,h/2)c=(w/2,\,h/2) und deren quadrierter Abstand zum Mittelpunkt ist c2=(w2+h2)/4\lVert c\rVert^2=(w^2+h^2)/4, das gilt auch für die anderen drei Ecken. Das Quadrat ist hier hilfreich, weil es das System dimensionslos belässt, es ist nur das Verhältnis von cc und uu zur Dimension der Karte relevant, nicht die absoluten Längen.

Daraus ergibt sich folgende Formel für den Drehimpuls:

ω=c×u(w2+h2)/4\omega=\frac{c\times u}{(w^2+h^2)/4}

Die restliche Bewegung der Karte ergibt sich automatisch, weil sich der Berührungspunkt selbst immer entlang von uu bewegen muss.

Fasse die Karte an einer beliebigen Stelle an.

Für die meisten Anwendungen könnte die Geschichte hier enden. Die Heuristik ist einfach, effizient zu berechnen und fühlt sich gut an. Aus Neugierde können wir aber noch fragen, wie sich die Bewegung aus den Regeln der Physik ableiten lässt, und wie gut wir mit unsere Approximation gelandet sind.

Zwei Modelle für den geringsten Widerstand

Wenn wir die Karte in eine Bewegung zwingen, folgt sie immer dem Prinzip des geringsten Widerstands. Das heißt, die einzelnen Punkte auf der Karte wollen so wenig Strecke wie möglich zurücklegen, unter der Bedingung, dass cc immer noch der Richtung von uu folgt.

Was das genau bedeutet, hängt vom physikalischen Modell ab. Bei einer schweren Karte mit wenig Reibung überwiegen die Kräfte der Trägheit, das heißt, die kinetische Energie, welche quadratisch mit der Geschwindigkeit ansteigt, soll minimiert werden. Das entspricht dann aber weniger einer leichten Karte auf dem Tisch als einer schweren Stahlplatte auf gut gelagerten Rädern.

Für die leichte Karte auf dem Tisch überwiegen die trockenen Reibungskräfte, welche nur linear mit der Geschwindigkeit ansteigen.

Beide Modelle lassen sich gemeinsam beschreiben. Sei SS die von der Karte eingenommene Fläche und J(x,y)=(y,x)J(x,y)=(-y,x) eine Drehung um 9090^\circ. Jede mit der Bewegung des Fingers vereinbare infinitesimale Bewegung hat die Form

vω(x)=u+ωJ(xc)v_\omega(x)=u+\omega J(x-c)

wobei ω\omega den Drehwinkel bezeichnet und J(xc)J(x-c) die Rotation um cc. Für x=cx=c gilt damit vω(c)=uv_\omega(c)=u: Der gehaltene Punkt folgt dem Finger unabhängig von der Winkelgeschwindigkeit ω\omega. Somit lassen sich die beiden Optimierungsprobleme als Minimierung des folgenden Integrals darstellen, was für p=1p=1 den Reibungsfall und für p=2p=2 den kinetischen Fall beschreibt:

Ep(ω)=xSvω(x)p,p{1,2}.E_p(\omega)=\int_{x\in S} \lVert v_\omega(x)\rVert^p, \qquad p\in\{1,2\}.

Im kinetischen Fall p=2p=2 lässt sich der Integrand ausmultiplizieren:

u+ωJ(xc)2=u2+2ωuJ(xc)+ω2xc2\left\lVert u+\omega J(x-c)\right\rVert^2 =\lVert u\rVert^2 +2\omega\,u\cdot J(x-c) +\omega^2\lVert x-c\rVert^2

Die Integrale über diese drei Summanden lassen sich geschlossen berechnen. Damit reduziert sich das Problem auf die Minimierung eines quadratischen Polynoms in ω\omega, dessen Minimum ebenfalls in geschlossener Form vorliegt. Für ein Rechteck der Breite ww und Höhe hh ist das Ergebnis:

ω2=c×u(w2+h2)/12+c2\omega_2 =\frac{c\times u}{(w^2+h^2)/12+\lVert c\rVert^2}

Im Reibungsmodell mit p=1p=1 gibt es für das Minimum keine geschlossene Formel mehr, es lässt sich nur numerisch annähern.

In der folgenden Demo kann der Berührungspunkt cc auf der Karte verschoben und mit der Pfeilspitze die Bewegung uu eingestellt werden. Die Diagramme zeigen die beiden Integrale für verschiedene Werte von ω\omega. Der schwarz umrandete Punkt markiert jeweils das berechnete Minimum, der grüne Kreis den Wert unserer einfachen Approximation.

Karte
L1
ω0
L2
ω0

Wie sich diese unterschiedlichen Werte von ω\omega tatsächlich auf die Bewegung auswirken, kann man hier ausprobieren. Alle drei Karten teilen sich denselben festen Berührungspunkt. Zieht man daran, lassen sich die von den drei Modellen erstellten Bewegungsprofile vergleichen.

L1
L2
Approximation

Ziehe den schwarzen Punkt. Er markiert auf allen drei Karten denselben festen Berührungspunkt.

Interessant ist dabei, dass die Approximation gefühlt weiter von dem Reibungsmodell abweicht, als das kinetische Modell, obwohl das kinetische Modell eine ganz andere Physik beschreibt. Insbesondere nahe dem Mittelpunkt reagiert das kinetische Modell stärker auf seitliche Bewegungen als unsere Approximation. Mit wachsendem Abstand dämpft der zusätzliche Term c2\lVert c\rVert^2 diese Drehung zunehmend. Ein ähnliches Verhalten lässt sich auch im Reibungsmodell beobachten.

Da das kinetische Modell eine schöne, geschlossene Formel ergibt, die sich fast genau so effizient berechnen lässt wie unsere ursprüngliche Approximation, würde sich dieses Modell für die Praxis am besten anbieten.