2010-03-22 2 views
4

Je me suis creusé la tête pour trouver une solution à ce problème.Interpolation de la hauteur d'un point à l'intérieur d'une grille en fonction d'une fonction de hauteur discrète

Point P inside a grid square. http://i41.tinypic.com/8yz1g6.png

I ont une table de consultation qui renvoie des valeurs de hauteur de différents points (x, z) sur la grille. Par exemple, je peux calculer la hauteur en A, B, C et D sur la figure 1. Cependant, je cherche un moyen d'interpoler la hauteur en P (qui a un connu (x, z)). La table de correspondance n'a que des valeurs aux intervalles de grille, et P se situe entre ces intervalles. Je suis en train de calculer les valeurs de et de t tel que:

A '(s) = A + de (CA) B' (t) = B + t (PB)

J'utiliserais alors ces deux équations pour trouver le point d'intersection de B '(t) avec A' (s) pour trouver un point X sur la ligne AC. Avec cela, je peux calculer la hauteur à ce point X et avec cela la hauteur au point P.

Mon problème réside dans le calcul des valeurs pour s et t.

Toute aide serait grandement appréciée.

+0

Est-ce un test de coordonnées barycentrique? – tzenes

+0

Voulez-vous obtenir la valeur de hauteur au point P si ABC et ADC sont des triangles séparés ou voulez-vous que la hauteur réelle interpole le quad ABCD? Les deux opérations ne donnent pas le même résultat. – Coincoin

+0

Ce que j'essaie de faire, c'est d'abord déterminer le triangle P, puis interpoler la hauteur par rapport aux points ABC ou ADC. – fastrack20

Répondre

1

Selon que vous voulez interpoler ABC ou ABCD, l'algorithme change. Pour interpoler entre ABC (que je suppose être ce que vous voulez faire depuis que vous dessinez la diagonale) vous devrez trouver les coordonnées barycentriques de P par rapport aux positions ABC x et y puis appliquer la coordonnée barycentrique à la hauteur (z est supposé ici) composant de ces triangles.

1

Qu'en est-aller de cette façon: trouver u et v afin que

P = B + u(A-B) + v(C-B) 

Si vous écrivez ceci, vous verrez que c'est un système linéaire 2x2 avec des inconnus u et v, donc je suppose que vous savoir comment continuer à partir de là. Oh, et une fois que vous avez u et v vous utilisez la même formule exacte que ci-dessus pour la hauteur, seulement cette fois A,B,C,P seront les hauteurs à ces points.

0

Voici un exemple explicite basé sur les fonctions de forme.

Considérons les fonctions:

u1 (x, z) = (x-X_B)/(x_c-X_B)

On a u1 (X_B, z_b) = u1 (x_a, Z_A) = 0 (parce que x_a = X_B) et u1 (x_c, z_c) = u1 (x_d, z_d) = 1

u2 (x, z) = 1 - u1 (x, z)

maintenant, nous avons u2 (x_b, z_b) = u2 (x_a, z_a) = 1 et u2 (x_c, z_c) = u2 (x_d, z_d) = 0

v1 (x, z) = (z-z_b)/(z_a- z_b)

Cette fonction répond v1 (x_a, Z_A) = v1 (x_d, z_d) = 1 et v1 (X_B, z_b) = v1 (x_c, z_c) = 0

v2 (x, z) = 1 - v1 (x, z)

Nous avons v2 (x_a, Z_A) = v2 (x_d, z_d) = 0 et v2 (X_B, z_b) = v2 (x_c, z_c) = 1

maintenant nous allons construire de nouvelles fonctions comme suit:

S_D (x, z) = u1 (x, z) * v1 (x, z)

Nous obtenons S_D (x_ d, z_d) = 1 et S_D (x_a, z_a) = S_D (x_b, z_b) = 0

S_C (x, z) = u1 (x, z) * v2 (x , z)

Nous obtenons S_C (x_c, z_c) = 1 et S_C (x_a, Z_A) = S_C (X_B, z_b) = S_C (x_d, z_d) = 0

S_A (x, z) = u2 (x, z) * v1 (x, z)

Nous obtenons S_A (x_a, z_a) = 1 et S_A (x_b, z_b) = S_A (x_c, z_c) = S_A (x_d, z_d) = 0

S_B (x, z) = u2 (x, z) * v2 (x, z)

Nous obtenons S_B (X_B, z_b) = 1 et S_B (x_a, Z_A) = S_B (x_c, z_c) = S_B (x_d, z_d) = 0

définissent maintenant votre fonction interpoler comme

H (x, z) = h_a * S_A (x, z) + h_b * S_B (x, z) + h_c * S_C (x, z) + h_d * S_D (x, z),

où h_a est le haut au point A, h_b est la hauteur au point B, et ainsi de suite.

Vous pouvez facilement vérifier que H est en effet une fonction interpoler:

H (x_a, Z_A) = h_a, H (X_B, z_b) = h_b, H (x_c, z_c) = h_c et H (x_d , z_d) = h_d.

Maintenant, pour se rapprocher de la hauteur au P, tout ce que vous devez faire est d'évaluer H à ce stade:

h_p = H (x_p, z_p)

Les fonctions S sont normalement visés comme "fonctions de forme". Il y a une telle fonction pour chaque nœud dont vous voulez que votre valeur interpolée dépende, et dans ce cas ils satisfont tous la propriété delta de Kronecker (ils prennent la valeur un à un nœud et zéro à tous les autres nœuds).

Il existe plusieurs façons de créer des fonctions de forme pour un ensemble de nœuds donné. Si je me souviens bien, la construction de fonctions de formes 2D par multiplication de fonctions de forme 1D (comme nous l'avons fait dans ce cas) est appelée "produit tensoriel de fonctions" (facile dans ce cas car la grille est rectangulaire). Nous nous sommes retrouvés avec quatre fonctions (une par nœud), toutes des combinaisons linéaires de {1, x, z, xz}. Si vous ne voulez utiliser que trois points pour votre interpolation, vous devriez pouvoir créer facilement trois fonctions de forme comme des combinaisons linéaires de {1, x, z} seulement, mais vous perdrez 25% de la hauteur Les informations fournies par la grille et votre interpolant ne seront pas lisses dans le rectangle lorsque h_b! = h_d.