2009-07-18 32 views
14

Dưới đây là một chức năng nội suy khối:Cubic/Đường cong Interpolation mượt mà trong 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)); 
} 

Chức năng này sẽ cubically suy giữa bắt đầu và kết thúc giá trị cho một số lượng giữa 0.0f - 1.0f. Nếu bạn đã vẽ đường cong này, bạn sẽ kết thúc với một cái gì đó như thế này:

hết hạn hình ảnh Imageshack loại bỏ

Các phương trình bậc ba ở đây là:

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

Làm thế nào để điều chỉnh điều này để tạo ra hai sản phẩm tangents trong và ngoài?

Để tạo ra đường cong như thế này: (Linear bắt đầu cuối khối)

Expired Imageshack hình ảnh loại bỏ

Là một trong những chức năng

và như thế này là khác: (bắt đầu Cubic để kết thúc tuyến tính)

Hình ảnh đã hết hạn bị xóa

Bất kỳ ai có ý tưởng nào? Cảm ơn trước.

+2

Đã bỏ phiếu để đóng câu hỏi này vì nó dựa vào hình ảnh để hiển thị câu hỏi/vấn đề là gì, d những hình ảnh đó rõ ràng đã biến mất.Các câu hỏi như nó đứng như vậy (theo ý kiến ​​của tôi) không có giá trị, cũng không có câu trả lời, bởi vì không ai biết câu hỏi những câu trả lời câu trả lời. –

Trả lời

12

Những gì bạn muốn là một Cubic Hermite Spline:

alt text

nơi p0 là điểm khởi đầu, p1 là điểm kết thúc, M0 là tang bắt đầu và m1 là phần cuối tang

+1

cảm ơn Robert, để làm cho nó trông WAY đẹp hơn :) –

+1

Có. Đây là cách để làm điều này. Một nội suy khối Hermite piecewise có thuộc tính tốt đẹp mà nó chỉ đơn giản là đảm bảo được cả hai liên tục và khác nhau trên các điểm break, bởi vì giá trị và phái sinh đầu tiên ở mỗi đầu của một khoảng thời gian được đưa ra. Đây là, IMHO, một cách rất đẹp để xây dựng một khối piecewise. –

3

bạn có thể có nội suy tuyến tính và nội suy khối và nội suy giữa hai hàm nội suy.

tức là.

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) 

trong đó t dao động từ 0 ... 1

+0

Tôi sẽ xem liệu tôi có thể giúp giải pháp của bạn hoạt động hay không. Tuy nhiên, lý tưởng tôi chỉ muốn điều chỉnh hàm khối trong phương thức: số tiền = (số tiền * số tiền) * (3f - (2f * số tiền)); Tôi giả định điều này có thể được thực hiện khá dễ dàng, tôi chỉ không chắc chắn như thế nào. – Rob

+1

Nếu bạn muốn có tangents, sử dụng các khối Hermite Spline tôi được đăng dưới đây –

0

Vâng, một cách đơn giản sẽ là:

-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 

Hoặc theo chương trình (điều chỉnh lập phương):

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

Đối với một trong những khác, chỉ đơn giản là bỏ qua "di chuyển":

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

Hoặc lập trình (lập phương điều chỉnh):

double amountdiv2 = amount/2; 
amount = -4 * amountdiv2 * amountdiv2 * amountdiv2 + 6 * amountdiv2 * amountdiv2; 
Các vấn đề liên quan