2009-07-18 23 views
14

continuación se muestra una función de interpolación cúbica:cúbico/curva suave interpolación en C#

public float Smooth(float start, float end, float amount) 
{ 
    // Clamp to 0-1; 
    amount = (amount > 1f) ? 1f : amount; 
    amount = (amount < 0f) ? 0f : amount; 

    // Cubicly adjust the amount value. 
    amount = (amount * amount) * (3f - (2f * amount)); 

    return (start + ((end - start) * amount)); 
} 

Esta función cúbica interpolar entre el valor inicial y el final dada una cantidad entre 0.0f - 1.0f. Si se va a trazar esta curva, que terminarías con algo como esto:

imagen Imageshack caducado eliminado

La función cúbica aquí es:

amount = (amount * amount) * (3f - (2f * amount)); 

¿Cómo puedo ajustar esto para producir dos tangentes de producción dentro y fuera?

Para producir curvas como esta: (Linear principio a fin cúbico)

Expirado imagen Imageshack eliminó

Como una función

y como este como otro: (inicio cúbico a extremo lineal)

Imagen expirada de Imageshack eliminada

¿Alguien tiene alguna idea? Gracias por adelantado.

+2

Ha votado para cerrar esta pregunta ya que depende de las imágenes para mostrar cuál es la pregunta/problema, una d esas imágenes aparentemente desaparecieron hace mucho tiempo.La pregunta en su forma actual (en mi opinión) no tiene ningún valor, ni tiene la respuesta, porque nadie sabe qué pregunta responderán esas respuestas. –

Respuesta

12

Lo que queremos es un Cubic Hermite Spline:

alt text

donde P0 es el punto de inicio, P1 es el punto final, M0 es la tangente de inicio, y m1 es la tangente final

+1

gracias Robert, por hacer que se vea MUCHO más bonito :) –

+1

Sí. Esta es la manera de hacer esto. Un interpolador Hermite cúbico por partes tiene la agradable propiedad de que se garantiza que es continuo y diferenciable a través de los puntos de ruptura, ya que se da el valor y la primera derivada en cada extremo de un intervalo. Esto es, en mi humilde opinión, una forma muy bonita de construir un cubo cúbico por partes. –

3

puede tener una interpolación lineal y una interpolación cúbica e interpolar entre las dos funciones de interpolación.

es decir.

cubic(t) = cubic interpolation 
linear(t) = linear interpolation 
cubic_to_linear(t) = linear(t)*t + cubic(t)*(1-t) 
linear_to_cubic(t) = cubic(t)*t + linear(t)*(1-t) 

donde t varía de 0 ... 1

+0

Veré si puedo hacer que tu solución funcione. Sin embargo, idealmente prefiero ajustar la función cúbica en el método: cantidad = (cantidad * cantidad) * (3f - (2f * cantidad)); Supongo que se puede hacer con bastante facilidad, pero no estoy seguro de cómo. – Rob

+1

Si quiere tener tangentes, use la cúbica Hermite Spline que publiqué debajo –

0

Bueno, una manera simple sería esta:

-Expand your function by 2 x and y 
-Move 1 to the left and 1 down 
Example: f(x) = -2x³+3x² 
g(x) = 2 * [-2((x-1)/2)³+3((x-1)/2)²] - 1 

o mediante programación (ajuste cúbico):

double amountsub1div2 = (amount + 1)/2; 
amount = -4 * amountsub1div2 * amountsub1div2 * amountsub1div2 + 6 * amountsub1div2 * amountsub1div2 - 1; 

Por el otro, simplemente dejar de lado el "movimiento":

g(x) = 2 * [-2(x/2)³+3(x/2)²] 

o mediante programación (ajuste cúbico):

double amountdiv2 = amount/2; 
amount = -4 * amountdiv2 * amountdiv2 * amountdiv2 + 6 * amountdiv2 * amountdiv2;