# Nonlinear Mapping

Similar to Arduino’s map function, this value remapping allows a simple adaption of nonlinear input or output devices.
If you have a device like a sensor with a behavior that follows the red line for example draw some joined lines through the red curve and make note of  the five node points which are occurring here.

{{    0,10  }  , {    10,50  }  , {    20,150  }  , {    40,200  }  ,{    50,200  }};

Put these values in the “nodepoints” array where the reMap() function calculates the linear equations (y=mx+b) and according to that the resulting output value.

If you need more nodes simply enlarge the “nodepoints” Array. The node values can be positive or negative .

// curve mapping with n interpolation points

// KHM 2010 Lab3

// nodes for linear equations / nodepoits are concatening  lines
float nodepoints[5][2]= {
{
0,10  }
, {
10,50  }
, {
20,150  }
, {
40,200  }
,{
50,200  }
};

void setup() {
Serial.begin(115200);
}
void loop() {

// test
// a given linear input leads to remapped output
for ( int ii = 0; ii <= 50; ii++) {
Serial.print(ii);
Serial.print("  ");
int result= reMap(nodepoints,ii);

Serial.print(result);
Serial.println("  ");
}
while(1);
}

//***************************************************************************
//
int reMap(float pts[10][2], int input) {
int rr;
float bb,mm;

for (int nn=0; nn < 4; nn++) {

if (input >= pts[nn][0] && input <= pts[nn+1][0]) {
mm= ( pts[nn][1] - pts[nn+1][1] ) / ( pts[nn][0] - pts[nn+1][0] );
mm= mm * (input-pts[nn][0]);
mm = mm +  pts[nn][1];
rr = mm;
}
}
return(rr);
}


Martin Nawrath / KHM 2010