nad_intr.js 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. var nadInterBreakout = require("./nadInterBreakout");
  2. module.exports = function(pin, ct) {
  3. // force computation by decreasing by 1e-7 to be as closed as possible
  4. // from computation under C:C++ by leveraging rounding problems ...
  5. var t = {
  6. x: (pin.x - 1e-7) / ct.del[0],
  7. y: (pin.y - 1e-7) / ct.del[1]
  8. };
  9. var indx = {
  10. x: Math.floor(t.x),
  11. y: Math.floor(t.y)
  12. };
  13. var frct = {
  14. x: t.x - 1 * indx.x,
  15. y: t.y - 1 * indx.y
  16. };
  17. var val = {
  18. x: Number.NaN,
  19. y: Number.NaN
  20. };
  21. var temp = nadInterBreakout(indx, frct, 'x', 0, ct);
  22. if (temp) {
  23. indx = temp[0];
  24. frct = temp[1];
  25. }
  26. else {
  27. return val;
  28. }
  29. temp = nadInterBreakout(indx, frct, 'y', 1, ct);
  30. if (temp) {
  31. indx = temp[0];
  32. frct = temp[1];
  33. }
  34. else {
  35. return val;
  36. }
  37. var inx = (indx.y * ct.lim[0]) + indx.x;
  38. var f00 = {
  39. x: ct.cvs[inx][0],
  40. y: ct.cvs[inx][1]
  41. };
  42. inx++;
  43. var f10 = {
  44. x: ct.cvs[inx][0],
  45. y: ct.cvs[inx][1]
  46. };
  47. inx += ct.lim[0];
  48. var f11 = {
  49. x: ct.cvs[inx][0],
  50. y: ct.cvs[inx][1]
  51. };
  52. inx--;
  53. var f01 = {
  54. x: ct.cvs[inx][0],
  55. y: ct.cvs[inx][1]
  56. };
  57. var m11 = frct.x * frct.y,
  58. m10 = frct.x * (1 - frct.y),
  59. m00 = (1 - frct.x) * (1 - frct.y),
  60. m01 = (1 - frct.x) * frct.y;
  61. val.x = (m00 * f00.x + m10 * f10.x + m01 * f01.x + m11 * f11.x);
  62. val.y = (m00 * f00.y + m10 * f10.y + m01 * f01.y + m11 * f11.y);
  63. return val;
  64. };