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