5 Stimmen

Ähnlichkeitstransformation zwischen zwei Dreiecken

Ich habe zwei 2D-Dreiecke (d.h. beide liegen in der Ebene) und möchte die Ähnlichkeitstransformation (Rotation + Skalierung + Translation) finden, die eines der Dreiecke am besten auf das andere abbildet.

Die beiden Dreiecke sind NICHT wirklich ähnlich, also möchte ich nur, dass die Transformation sie so gut wie möglich ausrichtet.

Ich weiß, dass ich eine affine Transformation zwischen den beiden Dreiecken erstellen kann, die das eine exakt auf das andere abbildet, aber ich möchte nicht den Schereffekt haben, der bei affinen Transformationen auftritt. Ich möchte, dass meine Transformation nur aus Übersetzungen, Drehungen und Skalierungen besteht.

Haben Sie eine Idee, wie man das macht?

2voto

Shahbaz Punkte 44492

Die Definition von Ähnlichkeit ist keine leichte Aufgabe, aber hier sind ein paar Ideen, mit denen Sie spielen können. Angenommen, Sie wollen Dreieck A (fast) in Dreieck B transformieren

  • Maßstab: Skalierung des Dreiecks A durch Fläche(B)/Fläche(A)
  • Umwandlung: Transformiere das Dreieck A durch einen solchen Vektor, dass beide Dreiecke Zentroide zu entsprechen.
  • Rotation: Verwenden Sie eine Optimierungsmethode, um einen Wert im Bereich [0, 360) für die Rotation, die Ihren persönlichen Ähnlichkeitskriterien entspricht.

Die Rotation ist wahrscheinlich die schwierigste Aufgabe. Eine einfache, aber wirksame Idee wäre es, Folgendes anzuwenden Bergsteigen von drei Punkten auszugehen und den besten zu nehmen. Die drei Punkte sind der Betrag der Drehung, der erforderlich ist, um einen der Punkte von A auf jeden der Punkte von B zu legen.

Auch das Ähnlichkeitskriterium selbst ist nicht einfach. Eine Sache, die einem in den Sinn kommt, ist der Umfang der überlappenden Fläche nach der Transformation. Dies zu berechnen ist nicht einfach oder zumindest umständlich.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X