diff --git a/src/interpolation.js b/src/interpolation.js index 7989eb6..28356a0 100644 --- a/src/interpolation.js +++ b/src/interpolation.js @@ -1,5 +1,4 @@ export default function(sampleSet, remainderSet, sampleSubset, distanceFn) { - var distance = distanceFunction; // var distance = calculateEuclideanDistance; // console.log("Brute-force"); for (let node of remainderSet) { @@ -25,12 +24,12 @@ export default function(sampleSet, remainderSet, sampleSubset, distanceFn) { } -function placeNearToNearestNeighbour(node, minNode, radius, samples, realDistances) { +function placeNearToNearestNeighbour(node, minNode, radius, sampleSubset, realDistances) { let - dist0 = sumDistError(pointOnCircle(minNode.x, minNode.y, 0, radius), samples, realDistances), - dist90 = sumDistError(pointOnCircle(minNode.x, minNode.y, 90, radius), samples, realDistances), - dist180 = sumDistError(pointOnCircle(minNode.x, minNode.y, 180, radius), samples, realDistances), - dist270 = sumDistError(pointOnCircle(minNode.x, minNode.y, 270, radius), samples, realDistances), + dist0 = sumDistError(pointOnCircle(minNode.x, minNode.y, 0, radius), sampleSubset, realDistances), + dist90 = sumDistError(pointOnCircle(minNode.x, minNode.y, 90, radius), sampleSubset, realDistances), + dist180 = sumDistError(pointOnCircle(minNode.x, minNode.y, 180, radius), sampleSubset, realDistances), + dist270 = sumDistError(pointOnCircle(minNode.x, minNode.y, 270, radius), sampleSubset, realDistances), lowBound = 0.0, highBound = 0.0; @@ -73,12 +72,12 @@ function placeNearToNearestNeighbour(node, minNode, radius, samples, realDistanc node.x = newPoint.x; node.y = newPoint.y; - // for (var i = 0; i < 20; i++) { - // var forces = sumForcesToSample(node, sample, sampleCache); - // // console.log(forces); - // node.x += forces.x; - // node.y += forces.y; - // } + for (let i = 0; i < 20; i++) { + let forces = sumForcesToSample(node, sampleSubset, realDistances); + // console.log(forces); + node.x += forces.x*0.5; + node.y += forces.y*0.5; + } } @@ -109,44 +108,24 @@ function sumDistError(currentPos, samples, realDistances) { } -function sumForcesToSample(node, sample, sampleCache) { - var x = 0, - y = 0, - // len = 0, - dist = 0, - force, - SPRING_FORCE = 0.7; +function sumForcesToSample(node, samples, sampleCache) { + let nodeVx = 0, + nodeVy = 0; - for (var i = 0, unitX, unitY; i < sample.length; i++) { - var s = sample[i]; - if (s !== node) { - unitX = s.x - node.x; - unitY = s.y - node.y; + for (let i = 0; i < samples.length; i++) { + var sample = samples[i]; + if(sample === node) continue; - // Normalize coordinates - len = Math.sqrt(unitX * unitX + unitY * unitY); - unitX /= len; - unitY /= len; + let x = node.x - sample.x, + y = node.y - sample.y, + l = Math.sqrt(x * x + y * y); - console.log(unitX, unitY); - - var realDist = Math.sqrt(unitX * unitX + unitY * unitY); - var desDist = sampleCache[i]; - dist += realDist - desDist; - force = (SPRING_FORCE * dist); - - x += unitX * force; - y += unitY * force; - } - - x *= (1.0 / sample.length); - y *= (1.0 / sample.length); - - return { - x: x, - y: y - }; + l = (l - sampleCache[i]) / l; + x *= l, y *= l; + nodeVx -= x; + nodeVy -= y; } + return {x: nodeVx, y: nodeVy}; } function binarySearchMin(lb, hb, fn) {