Interpolation eines Dreiecks
Ich habe eine Einheit rechtwinkliges Dreieck und einen Wert an jeder der 3 Ecken.
Ich muss interpolieren, um den Wert an einem Punkt im inneren des Dreiecks.
Stunden Suche haben sich bis nichts, das sagt mir sogar, wie Sie dies tun.
Hier ist mein bester Versuch, das ist eigentlich ziemlich nah dran aber nicht ganz richtig -
result =
v1 * (1 - x) * (1 - y) +
v2 * x * (1 - y) +
v3 * x * y;
v1, v2 und v3 sind die Werte der 3 Ecken des Dreiecks.
(x, y) ist der Punkt in dem Dreieck, das Sie versuchen zu finden, den Wert von.
Jeder Art von Methode würde mir hier helfen. Es muss nicht unbedingt eine Einheit/rechtwinkliges Dreieck.
Aktualisierte info:
Ich habe ein raster mit gleichmäßig verteilten Punkte und einen Wert an jedem Punkt.
Ich mache ein Dreieck aus, die nächsten 3 Punkte auf dem raster.
Hier ist ein Bild, um es zu illustrieren -
So habe ich zum interpolieren zwischen 5, 3 und 7, um den Wert von x an.
Der Punkt könnte auch sein, innerhalb des anderen Dreiecks, das heißt, Sie würden interpolieren zwischen 5, 7, und der Wert der linken unteren Ecke des Quadrats.
In der code, den ich zeigte, v1 = 5, v2 = 3, v3 = 7.
x ist der Bruchteil der Entfernung (Reichweite [0-1]) in der "x" - Richtung und y die gebrochene Strecke in der "y" - Richtung.
Im Bild das Beispiel x wäre wahrscheinlich etwa 0,75 und y wäre etwa 0,2
Hier sind meine nächsten versuche -
Erstellt mit -
if (x > y) //if x > y then the point is in the upper right triangle
return
v1 * (1 - x) * (1 - y) +
v2 * x * (1 - y) +
v3 * x * y;
else //bottom left triangle
return
v1 * (1 - x) * (1 - y) +
v4 * (1 - x) * y +
v3 * x * y;
Und ein weiterer Versuch -
Erstellt mit -
if (x > y)
return
(1 - x) * v1 + (x - y) * v2 + y * v3;
else
return
(1 - y) * v1 + (y - x) * v4 + x * v3;
Sind Sie sowohl in der Nähe, was ich brauche, aber offensichtlich nicht ganz richtig.
- So, die vertex ist die? Zeigen Sie mir, wie Sie Ihr Koordinaten-system funktioniert, welchen Weg x und y gehen und wo v1, v2 und v3 sind.
- Ok, ich aktualisiert einige info zu erzählen, was ich Tue ein bisschen mehr in die Tiefe.
- Haben Sie eine bestimmte Auslegung-Methode im Sinn? Linear/bilinear/Nächster Nachbar?
- Ich werde für linear/bilinear. Nächster Nachbar wird nicht funktionieren.
- Tut Dreieck eigentlich Sache hier? Würde eine 4-Punkt-interpolation zu tun?
- 4-Punkt ist die Bilineare interpolation, wie ich normalerweise tun, aber es sieht wie kann ich stark meine Geschwindigkeit zu verbessern durch die Verwendung von Dreiecken, anstatt. Ich in der Regel interpolieren zwischen v1 und v2, dann v3 und v4, dann interpolieren wieder zwischen diesen 2 neuen Werte für den endgültigen Wert. Ich möchte etwas ähnliches machen, aber mit einem Dreieck.
- Das würde zeigen, Artefakte - ist das für Sie akzeptabel?
- Artefakte sind in der Regel ok mit diesem, es sei denn, Sie sind zu groß
- Als splitting jedes Quadrat in vier Dreiecke, die durch die Verwendung einer einzigen 4-Punkt-interpolation zu erhalten, der Wert in der Mitte, dann 4 Dreiecke (oben/Links/rechts/unten)?
- Ich habe versucht, dass und mehrere andere Methoden. Ich habe versucht die Interpolation der Dreieck die Weise würde man ein simplex-Netz, und auch versucht, mit einer radialen Art der interpolation. Aber jede Methode hat eine Art Artefakt, das ist ein wenig zu stark.
- Die bikubische interpolation ist dein Freund: docs.scipy.org/doc/scipy-0.14.0/reference/generated/...
- Übrigens, es gibt keine "perfekte" oder "Artefakt-freie" Weg, um zu interpolieren. es ist sehr subjektiv, und variiert je nach Datensatz Sie sind Probenahme und der Lärm (wenn überhaupt) in den Messungen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie verwenden barycentric coordinates. Es ist eine sehr Gründliche write-up, dass hier auch diskutiert alternative Lösungen und warum barycentric coordinates sind die besten: CodePlea - Interpolation in einem Dreieck
Grundsätzlich die GEWICHTE am Ende Aussehen wie diese:
Eigentlich die einfachste und robusteste Lösung basiert auf barycentric coordinates -
http://answers.unity3d.com/questions/383804/calculate-uv-coordinates-of-3d-point-on-plane-of-m.html
Ich habe diese vor 3 Jahren und haben immer noch einen Weg, dies zu tun. Ich glaube, es ist unmöglich, es sei denn mit einem gleichseitigen Dreieck.
Hier ist eine anständige Art und Weise, es zu tun mit barycentric coordinates und dann hinzufügen eine Technik, entledigt sich die meisten der Artefakte.
v1, v2, v3 sind die Werte, an die drei Punkte des Dreiecks. x, y ist der Punkt, den Sie möchten, um einen Wert zu suchen, für.
Ok, also wir werden eine lineare interpolation unter der Annahme, dass der gradient konstant ist in Bezug auf x und auf y.
d/dx = v2 - v1
undd/dy = v3 - v2
, undf(0,0) = v1
. Wir haben eine einfache zwei-dimensionale Differentialgleichung.oder in Bezug auf v1, v2 und v3
Wenn Sie wollen, um es in ein Quadrat für die vier vertices, wie oben mit v4 in der linken unteren bei x=0 y=1, hier sind die Bedingungen:
d/dx = (v2 - v1) (1 - y) + (v3 - v4) y
,d/dy = (v3 - v2) x + (v4 - v1) (1 - x)
,f(0,0) = v1
if (x > y) //if the point is in the upper right triangle return (1 - x) * v1 + (x - y) * v2 + y * v3; else //if the point is in the lower left triangle return (1 - x) * v1 + (x - y) * v4 + y * v3;
Aber es funktioniert nichtd/dx = (v2 - v1) (1 - y) + (v3 - v4) y
undd/dy = (v3 - v2) x + (v4 - v1) (1 - x)
. Es ist immer noch möglich.Hier einige pseudocode für die nächste-Nachbar:
Ich denke, das erzeugt auch ein voronoi-Diagramm