4 votos

Cómo no interpolar linealmente entre los 4 valores

Estoy buscando un no-lineal de la forma de interpolar entre los 4 valores dentro de un motor de juegos.

Tengo una unidad de square abcd. Tiene un valor diferente para cada arista ABCD. Dentro de esa plaza hay algún punto x. También tengo posición exacta de x dentro de ese cuadrado en 0..1 intervalo de X y el eje y.

0 --> X
|
V    aAAAAAAAb
Y    D       B
     D   x   B
     D       B
     dCCCCCCCc

Ahora es necesario interpolar entre los valores de ABCD bordes de una manera, que cerca de la orilla el valor de x coincide con los bordes de valor, pero más lejos de la orilla que se mezcla con otras aristas de forma proporcional a las distancias.

Por ejemplo:

// Trivial case - mix proportionally
X = 0.1
Y = 0.1
x = A * 0.45 + B * 0.05 + C * 0.05 + D * 0.45; // Sum = 1

// Near edge case - B and D get penalized
X = 0.1
Y = 0.05
x = A * 0.9 + B * 0.025 + C * 0.05 + D * 0.45; // Sum should be = 1, how?

// Edge case
X = 0.1
Y = 0
x = A * 1.0 + B * 0 + C * 0 + D * 0; // Sum = 1

// Degenerate case
X = 0
Y = 0
x = A * 0.5 + B * 0 + C * 0 + D * 0.5; // Sum = 1

¿Qué tipo de interpolación fórmula que podría utilizar para obtener el continuo resultado deseado? Preferiblemente rápido en el cálculo (para ser utilizado en juegos de procesamiento de bucle).

P. S. Este es mi primer post en Matemáticas, así que por favor comentar si hay algún problema con ella.

1voto

Théophile Puntos 7913

En lugar de ir a la teoría detrás de la ecuación del calor (se los dejo a los expertos), permítanme sugerir el siguiente enfoque: crear una cuadrícula de valores, y el valor de cada celda sea igual a la media de sus vecinos. Así, $$v_{ij} = {1\over4}(v_{i+1,\ j}+v_{i-1,\ j}+v_{i,\ j+1}+v_{i,\ j-1})$$

This effectively gives a discrete approximation of the heat model, and creates a system of linear equations that you can solve using your favourite method, or you can also solve it iteratively by simply repeating the above calculation for all cells simultaneously, then updating. Some spreadsheet software, e.g., Microsoft Excel, allows you to create and solve circular references this way.

As an example, I chose the values $(a,B,C,D) = (10,1,3,0)$ and solved in Excel in a $10 \veces el 10$ grid. In each cell in the middle I have a calculation corresponding to the equation above, so for instance in cell $\mathtt{B2}$, I have "$\mathtt{=PROMEDIO(B1,A2,B3,C2)}$". Yo también necesario activar la opción "Habilitar cálculo iterativo". Aquí está el resultado:

       10.00   10.00   10.00   10.00   10.00   10.00   10.00   10.00   10.00   10.00    
0.00    4.95    6.86    7.72    8.13    8.31    8.34    8.21    7.87    7.13    5.43    1.00
0.00    2.92    4.78    5.88    6.49    6.78    6.83    6.64    6.14    5.21    3.58    1.00
0.00    1.96    3.47    4.52    5.17    5.50    5.56    5.36    4.85    3.99    2.69    1.00
0.00    1.43    2.64    3.55    4.16    4.49    4.56    4.37    3.93    3.20    2.20    1.00
0.00    1.12    2.11    2.88    3.43    3.73    3.81    3.66    3.28    2.68    1.90    1.00
0.00    0.94    1.78    2.45    2.93    3.21    3.28    3.16    2.85    2.36    1.72    1.00
0.00    0.86    1.62    2.22    2.64    2.88    2.95    2.85    2.59    2.18    1.63    1.00
0.00    0.88    1.61    2.15    2.52    2.73    2.79    2.71    2.49    2.13    1.62    1.00
0.00    1.06    1.79    2.27    2.56    2.72    2.77    2.71    2.53    2.22    1.72    1.00
0.00    1.57    2.23    2.56    2.74    2.83    2.85    2.82    2.71    2.50    2.06    1.00
        3.00    3.00    3.00    3.00    3.00    3.00    3.00    3.00    3.00    3.00    

Y aquí está un gráfico 3d:

a nice chart

Como se puede ver, mientras que el local de la relación entre las células son lineales, el global de los resultados de la solución en las parábolas que el arco de un lado a otro. Las células cerca de un borde, se tomará en valores cercanos al valor de la orilla; las células cerca de una esquina será de aproximadamente el promedio de los valores de los dos bordes; las células cerca del centro estará cerca de la media de los cuatro bordes.

¿Es esto lo que tenía en mente?

1voto

John M Puntos 6468

He venido para arriba con una simplificación de la ecuación a la hora de formular mi pregunta.

La Idea es interpolar entre X y el eje y de forma proporcional a la distancia a ellos.

Déjame que te guía a través de un ejemplo:

// Input
X = 0.5; Y = 0.1

// This is base interpolation that prefers closer edge
x = A * (1-Y) + B * X + C * Y + D * (1-X); // Sum = 2

// Now calculate proportion between distances to edges
distX = 0.5 - Abs(X-0.5); // Distance to edge 0..0.5 range
distY = 0.5 - Abs(Y-0.5); // Distance to edge 0..0.5 range
if distX + distY > 0.001 then //0.001 is to deal with FP precision loss
begin
  distSum = distX + distY;
  coefX := distX / distSum; // 0..1 range
  coefY := distY / distSum; // 0..1 range
end
else
begin
  coefX := 0.5;
  coefY := 0.5;
end;

// Our example values
coefX = 0.5 / 0.6 = 0.83
coefY = 0.1 / 0.6 = 0.17

// Add X/Y weights into equation, to get Sum = 1
x = A * (1-Y) * coefX + B * X * coefY + C * Y * coefX + D * (1-X) * coefY;

// Our example values
x = A * 0.747 + B * 0.085 + C * 0.083 + D * 0.085; // Sum = 1

Lo siento, no estoy familiarizado con las fórmulas de Excel, lo suficientemente cerca como para construir un diagrama, pero se ve muy parecido a este:

enter image description here

Los beneficios son: no hay necesidad de iteraciones, sabiendo ABCD valores y X Y posición x es suficiente.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X