L'Interpolation d'un triangle
J'ai une unité de triangle droit et une valeur à chacun des 3 sommets.
J'ai besoin d'interpoler pour trouver la valeur en un point à l'intérieur du triangle.
Heures de recherche ont n'ont rien révélé qui effectivement me dit comment faire.
Voici mes plus proches tentative, qui est en fait assez proche mais pas tout à fait à droite -
result =
v1 * (1 - x) * (1 - y) +
v2 * x * (1 - y) +
v3 * x * y;
v1, v2 et v3 sont les valeurs à 3 sommets du triangle.
(x, y) est le point dans le triangle que vous essayez de trouver la valeur de.
Tout type de méthode pourrait m'aider ici. Il n'a pas nécessairement besoin d'être une unité/d'un triangle rectangle.
Mise à jour de l'info:
J'ai une grille de points régulièrement espacés et une valeur à chaque point.
Je fais un triangle de la plus proche à 3 points sur la grille.
Voici une photo pour l'illustrer -
J'ai donc interpoler entre 5, 3, et 7 pour trouver la valeur de x.
Le point pourrait également être à l'intérieur de l'autre triangle, ce qui signifie que vous serait d'interpolation entre les 5, 7, et la valeur de l'angle inférieur gauche de la place.
Dans le code que j'ai montré, v1 = 5, v2 = 3, v3 = 7.
x est la fraction de la distance (range [0-1]) dans le "x" de la direction, et y est la fraction de la distance dans le "y" de la direction.
Dans l'image de l'exemple, x sera probablement environ 0,75 et y serait d'environ 0,2
Ici sont mes plus proches de tentatives -
Créé à l'aide d' -
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;
Et une autre tentative -
Créé à l'aide d' -
if (x > y)
return
(1 - x) * v1 + (x - y) * v2 + y * v3;
else
return
(1 - y) * v1 + (y - x) * v4 + x * v3;
Ils sont à la fois proche de ce dont j'ai besoin, mais évidemment pas tout à fait droit.
Ok j'ai mis à jour quelques informations pour savoir ce que je suis en train de faire un peu plus en profondeur.
Avez-vous une interprétation spécifique de la méthode à l'esprit? Linéaire/linéaire/du voisin le plus proche?
N'triangle fait de l'importance ici? Serait un 4 points d'interpolation?
4 point de la méthode d'interpolation bilinéaire est la façon dont j'ai l'habitude de le faire, mais il est à la recherche comme je l'ai peut grandement améliorer ma vitesse en utilisant les triangles à la place. J'ai l'habitude d'interpoler entre la v1 et la v2 puis v3 et v4, puis d'interpoler entre ces 2 nouvelles valeurs pour la valeur finale. Je voudrais faire quelque chose de similaire, mais avec un triangle.
OriginalL'auteur Frobot | 2012-01-02
Vous devez vous connecter pour publier un commentaire.
Vous devez utiliser des coordonnées barycentriques. Il y a un très approfondie de l'écriture jusqu'ici, qui traite également des solutions de rechange et pourquoi coordonnées barycentriques sont les meilleurs: CodePlea Interpolant dans un Triangle
Fondamentalement, le poids va finir par ressembler à cela:
OriginalL'auteur reneekk
En fait le plus simple et le plus robuste solution est basée sur les coordonnées barycentriques -
http://answers.unity3d.com/questions/383804/calculate-uv-coordinates-of-3d-point-on-plane-of-m.html
OriginalL'auteur titanae
J'ai demandé il y a 3 ans et ont toujours été de travailler sur une façon de le faire. Je crois qu'il est impossible, à moins de à l'aide d'un triangle équilatéral.
Ici est un bon moyen de le faire à l'aide de coordonnées barycentriques et à l'ajout d'une technique qui se débarrasse de la plupart des artefacts.
v1, v2, v3 sont les valeurs à trois points du triangle. x, y) est le point où vous souhaitez trouver une valeur pour.
OriginalL'auteur Frobot
Ok, donc nous allons faire une interpolation linéaire, en supposant que le gradient est constant par rapport à x et à y.
d/dx = v2 - v1
etd/dy = v3 - v2
, etf(0,0) = v1
. Nous avons un simple de deux dimensions de l'équation différentielle.ou en termes de v1, v2 et v3
Si vous voulez le faire dans un carré de quatre sommets, comme ci-dessus avec la v4 en bas à gauche en x=0 y=1, voici les conditions:
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;
Mais cela ne fonctionne pasQuel type de dégradé /est/ ce que vous essayez de générer? Si vous voulez le faire sur la base d'un carré, alors c'est un peu plus compliqué parce que
d/dx = (v2 - v1) (1 - y) + (v3 - v4) y
etd/dy = (v3 - v2) x + (v4 - v1) (1 - x)
. C'est encore possible.Pas tout à fait sûr de ce que vous demandez, mais c'est lissé, la fonction de bruit, je suis en train de faire. - Je avoir de travail à l'aide du carré plein et de faire la méthode d'interpolation bilinéaire, semblable au bruit de perlin, mais je vais essayer de le faire fonctionner à l'aide de triangles au lieu de carrés.
Je l'ai trouvé très proche de la méthode, mais les objets sont assez mauvais. image
OriginalL'auteur Dan
Voici quelques pseudo-code le plus proche voisin:
Je pense que cela génère également un diagramme de voronoi
Pas de places. Il ne serait que de générer des carrés lors de l'utilisation de points d'échantillonnage au carré lieux, et que vous avez spécifié triangles.
Désolé, je veux dire qu'il fera de grandes solide de couleur triangles*
Non, il ne le serait pas. Il aura un gros massif de zones colorées, mais pas les triangles - ce serait de générer des 4 côtés formes. Pour un point, il serait faire des deux côtés de la moitié du bord extérieur du triangle, et deux médiatrices de lignes pour les autres points.
Ah ok. Je n'ai pas testé, mais le point est de ne pas s'adapter à la tâche.
OriginalL'auteur rsaxvc