00001
00002
00003
00004
00005
00006 namespace NewGamePhysics.Mathematics
00007 {
00008 using System;
00009
00015 public class Bicubic
00016 {
00020 private double[,] M = {
00021 {-0.5, 1.5, -1.5, 0.5},
00022 { 1 , -2.5, 2 ,-0.5},
00023 {-0.5, 0 , 0.5, 0 },
00024 { 0 , 1 , 0 , 0 }};
00025
00029 private double[,] C = new double[4, 4];
00030
00035 public Bicubic(double[,] G)
00036 {
00037 if ((G == null) && (G.Length != 16))
00038 {
00039 throw new ArgumentOutOfRangeException("G");
00040 }
00041
00042 double[,] T = new double[4, 4];
00043
00044
00045 for (int i = 0; i < 4; i++)
00046 {
00047 for (int j = 0; j < 4; j++)
00048 {
00049 for (int k = 0; k < 4; k++)
00050 {
00051 T[i, j] += G[i, k] * M[j, k];
00052 }
00053 }
00054 }
00055
00056
00057 for (int i = 0; i < 4; i++)
00058 {
00059 for (int j = 0; j < 4; j++)
00060 {
00061 for (int k = 0; k < 4; k++)
00062 {
00063 C[i, j] += M[i, k] * T[k, j];
00064 }
00065 }
00066 }
00067 }
00068
00075 public double Calc(double x, double y)
00076 {
00077 if ((x < 0.0) || (x > 1.0))
00078 {
00079 throw new ArgumentOutOfRangeException("x");
00080 }
00081
00082 if ((y < 0.0) || (y > 1.0))
00083 {
00084 throw new ArgumentOutOfRangeException("y");
00085 }
00086
00087 return x * (x * (x * (y * (y * (y * C[0, 0] + C[0, 1]) + C[0, 2]) + C[0, 3])
00088 + (y * (y * (y * C[1, 0] + C[1, 1]) + C[1, 2]) + C[1, 3]))
00089 + (y * (y * (y * C[2, 0] + C[2, 1]) + C[2, 2]) + C[2, 3]))
00090 + (y * (y * (y * C[3, 0] + C[3, 1]) + C[3, 2]) + C[3, 3]);
00091 }
00092 }
00093 }