new 3D interpolation codes
2 codes are there for future use, on my bench both are faster than used now, about 146% faster on float and 160% on a clean code
This commit is contained in:
parent
011d625bd4
commit
af7bb6b261
84
table.ino
84
table.ino
|
@ -375,3 +375,87 @@ int get3DTableValue(struct table3D *fromTable, int Y, int X)
|
|||
int r = (p * q) >> 8;
|
||||
return ( (A * m) + (B * n) + (C * o) + (D * r) ) >> 8;
|
||||
}
|
||||
/* Executed a benchmark on all options and this is the results
|
||||
* Stadard version:141164 20 float version:57456 20.51 simple version:54196 20, Number of loops:2500
|
||||
*
|
||||
//This function pulls a value from a 3D table given a target for X and Y coordinates.
|
||||
//It performs a 2D linear interpolation as descibred in: http://www.megamanual.com/v22manual/ve_tuner.pdf
|
||||
float get3DTableValue2(struct table3D *fromTable, int Y, int X)
|
||||
{
|
||||
float m, n, o ,p, q, r;
|
||||
long tempVar1, tempVar2;
|
||||
byte xMin, xMax;
|
||||
byte yMin, yMax;
|
||||
|
||||
for (xMin = fromTable->xSize-1; xMin>=0; xMin--)
|
||||
{
|
||||
if(X>fromTable->axisX[xMin]) {break};
|
||||
}
|
||||
for (yMin = fromTable->ySize-1; yMin>=0; yMin--)
|
||||
{
|
||||
if(Y>fromTable->axisY[yMin]) {break};
|
||||
}
|
||||
if (xMin>fromTable->xSize-1) (xMin = fromTable->xSize-1}; //Overflow protection
|
||||
if (yMin>fromTable->ySize-1) (yMin = fromTable->ySize-1}; //Overflow protection
|
||||
|
||||
xMax = xMin + 1;
|
||||
yMax = yMin + 1;
|
||||
if (xMax>fromTable->xSize-1) {xMax = fromTable->xSize-1}; //Overflow protection
|
||||
if (yMax>fromTable->ySize-1) {yMax = fromTable->ySize-1}; //Overflow protection
|
||||
|
||||
p = float(X-fromTable->axisX[xMin]) / float(fromTable->axisX[xMax] - fromTable->axisX[xMin]);
|
||||
q = float(Y-fromTable->axisY[yMin]) / float(fromTable->axisY[yMax] - fromTable->axisY[yMin]);
|
||||
|
||||
int A = fromTable->values[yMin][xMin];
|
||||
int B = fromTable->values[yMin][xMax];
|
||||
int C = fromTable->values[yMax][xMin];
|
||||
int D = fromTable->values[yMax][xMax];
|
||||
|
||||
m = (1.0-p) * (1.0-q);
|
||||
n = p * (1-q);
|
||||
o = (1-p) * q;
|
||||
r = p * q;
|
||||
|
||||
return ( (A * m) + (B * n) + (C * o) + (D * r) );
|
||||
|
||||
}
|
||||
|
||||
//This function pulls a value from a 3D table given a target for X and Y coordinates.
|
||||
//It performs a 2D linear interpolation as descibred in: http://www.megamanual.com/v22manual/ve_tuner.pdf
|
||||
int get3DTableValue3(struct table3D *fromTable, int Y, int X)
|
||||
{
|
||||
byte xMin, xMax;
|
||||
byte yMin, yMax;
|
||||
|
||||
for (xMin = fromTable->xSize-1; xMin>=0; xMin--)
|
||||
{
|
||||
if(X>fromTable->axisX[xMin]) {break};
|
||||
}
|
||||
for (yMin = fromTable->ySize-1; yMin>=0; yMin--)
|
||||
{
|
||||
if(Y>fromTable->axisY[yMin]) {break};
|
||||
}
|
||||
if (xMin>fromTable->xSize-1) (xMin = fromTable->xSize-1}; //Overflow protection
|
||||
if (yMin>fromTable->ySize-1) (yMin = fromTable->ySize-1}; //Overflow protection
|
||||
|
||||
xMax = xMin + 1;
|
||||
yMax = yMin + 1;
|
||||
if (xMax>fromTable->xSize-1) {xMax = fromTable->xSize-1}; //Overflow protection
|
||||
if (yMax>fromTable->ySize-1) {yMax = fromTable->ySize-1}; //Overflow protection
|
||||
|
||||
long p, q;
|
||||
p = ((long)(X-fromTable->axisX[xMin]) <<8) / (fromTable->axisX[xMax] - fromTable->axisX[xMin]);
|
||||
q = 256 - (((long)(Y-fromTable->axisY[yMin])<<8) / (fromTable->axisY[yMax] - fromTable->axisY[yMin]));
|
||||
|
||||
int A = fromTable->values[yMin][xMin];
|
||||
int B = fromTable->values[yMin][xMax];
|
||||
int C = fromTable->values[yMax][xMin];
|
||||
int D = fromTable->values[yMax][xMax];
|
||||
|
||||
int m = ((256-p) * (256-q)) >> 8;
|
||||
int n = (p * (256-q)) >> 8;
|
||||
int o = ((256-p) * q) >> 8;
|
||||
int r = (p * q) >> 8;
|
||||
return ( (A * m) + (B * n) + (C * o) + (D * r) ) >> 8;
|
||||
}
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue