-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmls.js
84 lines (77 loc) · 2.67 KB
/
mls.js
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
const mls2D = function(controlPoints,outputPoints)
{
let miu;
//与源控制点的距离求得的权重
let weights = new Map();
let weightsSum;
let outputGraph = new Object();
for(let i = 0; i < height; ++ i) {
for(let j = 0; j < width; ++ j) {
let pointIndex = width * i + j;
if(!controlPoints.has(pointIndex)) {
//不属于控制点
//求加权重心p*, q*,权重值保存起来后面还有用
let pCentroidX = 0;
let pCentroidY = 0;
let qCentroidX = 0;
let qCentroidY = 0;
weightsSum = 0;
for(let [controlPointIndex, controlPointDst] of controlPoints) {
let px = controlPointIndex % width;//横向第几个
let py = Math.floor(controlPointIndex / width);//竖向第几个
let qx = controlPointDst[0];//空间位置x
let qy = controlPointDst[1];//空间位置y
let weight = 1 / ((j - px) * (j - px) + (i - py) * (i - py));
weights.set(controlPointIndex, weight);//每个index的权重记录一下
weightsSum += weight;
pCentroidX += weight * px;//全都加权
pCentroidY += weight * py;
qCentroidX += weight * qx;
qCentroidY += weight * qy;
}
pCentroidX /= weightsSum; //总而言之在加权
pCentroidY /= weightsSum;
qCentroidX /= weightsSum;
qCentroidY /= weightsSum;
//计算M
let s1 = 0;
let s2 = 0;
let m00 = 0;
let m01 = 0;
let m10 = 0;
let m11 = 0;
for(let [controlPointIndex, controlPointDst] of controlPoints) {
let px = controlPointIndex % width;
let py = Math.floor(controlPointIndex / width);
let qx = controlPointDst[0];
let qy = controlPointDst[1];
let dQx = qx - qCentroidX;
let dQy = qy - qCentroidY;
let dPx = px - pCentroidY;
let dPy = py - pCentroidY;
let weight = weights.get(controlPointIndex);
s1 += (dQx * dPx + dQy * dPy) * weight;
s2 += (dQx * (-dPy) + dQy * dPx) * weight;
m00 += (dPx * dQx + dPy * dQy) * weight;
m01 += (dPx * dQy - dPy * dQx) * weight;
m10 += (dPy * dQx - dPx * dQy) * weight;
m11 += (dPy * dQy + dPx * dQx) * weight;
}
let miu = Math.sqrt(s1 * s1 + s2 * s2);
m00 /= miu;
m01 /= miu;
m10 /= miu;
m11 /= miu;
outputGraph[pointIndex] = {x:(j - pCentroidX) * m00 + (i - pCentroidY) * m10 + qCentroidX, y:(j - pCentroidX) * m01 + (i - pCentroidY) * m11 + qCentroidY }
}
else if(controlPoints.has(pointIndex)) {
outputGraph[pointIndex] = {x: controlPoints.get(pointIndex)[0], y: controlPoints.get(pointIndex)[1]}
}
}
}
for (let i = 0; i < Object.keys(outputPoints).length; i++){
let pt = outputPoints[i].i;
outputPoints[i].x = outputGraph[pt].x ;
outputPoints[i].y = outputGraph[pt].y ;
}
}