複雑な数学を活用する場合は、これを行うより洗練された方法があります。基本的に、複素数でコンパス上の点を表すことができます。
あなたが「平均」または2回のコンパス測定値を「スムーズ」にしたい場合は、複雑なドメインにして、角度ドメインに戻って変換することを行うことができます。これにより
、我々は数学JSライブラリを使用することができますし、あなたが持っていた同じ形式で基本的にあなたの機能を残して:あなたはここでそれをいじることができ
var smoothing = .9;
function lowPass(degree, oldVal) {
// var oldVal = $scope.compassBearing || 0;
var complexOldVal = math.complex({r:1, phi:oldVal * (math.pi/180)});
var complexNewVal = math.complex({r:1, phi:degree * (math.pi/180)});
var complexSmoothedValue = math.chain(complexNewVal)
.subtract(complexOldVal)
.multiply(smoothing)
.add(complexOldVal)
.done();
var smoothedValue = math.arg(complexSmoothedValue) * (180/math.pi);
if (smoothedValue < 0) { return 360 + smoothedValue; }
return smoothedValue;
}
document.write(lowPass(20, 30)+'<br>');
// 20.99634415156203
document.write(lowPass(10, 350)+'<br>');
// 8.029256754215519
を:http://jsbin.com/zelokaqoju/edit?html,output
問題は何ですか? 'smoothValue'は例えば361、-2など? – dannyjolie
スムージングは反対側に向かって読みをスムーズにしようとしているので、例えば356→358→0→2にスムージングするのではなく、2つの値を平均してコンパスを速くしようとします反対の方向に回り、新しい価値を満たす。 – opticon
ええ、私はそれを考え出した。ちょうどあなた自身のスクリプトを試して、本当の問題を見ました。例えばからの移行。 359から10までは0を経由するのではなく、「後方に」行く。それは疑問からは分かりませんでした。 – dannyjolie