, wenn Sie genau wissen, dass alle Punkte auf einer einzigen Ebene liegen, die eine Vereinfachung dieses Verfahrens wäre, werde ich annehmen, dass Sie Ihren Platz in zwei Dreiecke geteilt haben. Außerdem nehme ich an, dass es 4 Eckpunkte, v_00
, v_10
, v_01
und v_11
gibt, die jeden Eckpunkt Ihres Quadrats darstellen. Ich nehme auch an, dass Ihre Dreiecke als (v_00, v_10, v_11)
und (v_00, v_11, v_01)
definiert sind.
vec4 v00 = vec4(...);
vec4 v01 = vec4(...);
vec4 v10 = vec4(...);
vec4 v11 = vec4(---);
vec4[2][3] triangles = {{v00, v10, v11}, {v00, v11, v01}};
Schließlich werde ich nehme an, Sie kennen die X- und Y-Koordinaten in Bezug auf den unteren Scheitel links (nur die x subtrahiert und y des fünften Punktes von der x- und y-Koordinaten von v_00
Koordinate). Ich werde diesen Punkt P nennen. Wir würden gerne wissen, dass er zkoordiniert ist.
vec4 fifthPoint = vec4(...);
vec4 P = fifthPoint - v00;
Das bedeutet, die „gemeinsame Grenze“ der beiden Dreiecke liegt entlang der diagonal verlauf zwischen der Unterseite der Platz links und rechts oben.
Da beide Dreiecke völlig verschieden sein können, beginnt die Bestimmung der Koordinaten Ihres beliebigen fünften Punktes damit, welches der beiden Dreiecke es ist.
Da wir wissen, dass die Form ein Quadrat ist, können wir die Koordinaten unseres Punktes P relativ zu v_00
nehmen (wie ich vorher angenommen habe) und sehen, welche größer als die andere ist. Wenn die x-Koordinate von P größer als die y-Koordinate ist, wissen wir, dass P im rechten unteren Dreieck ist. Ansonsten ist es oben links.
bool whichTriangle = P.x > P.y;
int triangleIndex = whichTriangle ? 0 : 1;
Jetzt, da wir wissen, welches Dreieck uns auf, können wir ihre Koordinaten interpolieren auf der Oberfläche des Dreiecks, jeden Punkt zu erhalten.
Für Dreieck 0:
vec4 vectorX = triangles[0][1] - triangles[0][0];
vec4 vectorY = triangles[0][2] - triangles[0][1];
Für Dreieck 1:
vec4 vectorX = triangles[1][1] - triangles[1][2];
vec4 vectorY = triangles[1][2] - triangles[1][0];
Hinweis, dass jeder hier Vektor entlang der X- und Y-Achse geht. Das ist wichtig, damit wir die X- und Y-Koordinaten von P direkt verwenden können, um interpolierte Werte zu berechnen.
Als nächstes normalisieren wir die zwei Vektoren, die wir gerade erstellt haben.
vectorX = vectorX.normalize();
vectorY = vectorY.normalize();
Jetzt brauchen wir nur diese beiden Werte mit der X- und Y-Koordinaten von P zu multiplizieren jeden Punkt auf dem Dreieck zu bekommen, und es zu einem Basispunkt hinzufügen.
Für Dreieck 0:
P = triangles[0][0] + vectorX * P.x + vectorY * P.y;
Für Dreieck 1:
P = triangles[1][1] - vectorX * (1.0 - P.x) - vectorY * (1.0 - P.y);
Und dort haben Sie es. Eine viel zu komplizierte Erklärung für etwas, das gar nicht so schwer ist. P.z enthält nun die Z-Koordinate Ihres beliebigen Punktes.
interpolieren Wenn Sie nicht sicher wissen, dass alle Punkte auf einer einzigen Ebene liegen, müssen Sie das Quadrat in zwei Dreiecke aufteilen. Ist das der Fall für dich? – Bartvbl
[Altimetry] (http://www.dictionary.com/browse/altimetry) bedeutet nicht, was Sie denken, dass es bedeutet. Das gesuchte Wort ist "Höhe" oder "Höhe". –