Karmaşık matematikten yararlanırsanız bunu yapmanın daha zarif bir yolu vardır. Temel olarak, karmaşık bir sayı ile pusula üzerinde bir nokta temsil edebilir.
sen "ortalama" veya iki pusula okumalarını "pürüzsüz" istiyorsanız, karmaşık etki alanındaki ve sonra açı etki alanına geri dönüştürmek yapabilir. Bununla
, size sahip olduğunu math js kitaplığı kullanan ve aynı formda temelde işlev bırakabilirsiniz:
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
Burada onunla oynama işini: http://jsbin.com/zelokaqoju/edit?html,output
sorun nedir? "smoothValue", ör. 361, -2, vb? – dannyjolie
Yumuşatma, okumayı diğer tarafa 'pürüzsüz' yapmaya çalışır - yani, 356 -> 358 -> 0 -> 2'den geçişi yumuşatmak yerine, iki değeri ortalama olarak pusulaya getirmeye çalışır. Yeni değerlerle buluşmak için ters yönde dönüyor. – opticon
Evet, bunu düşündüm. Sadece senaryonuzu kendim denedim ve gerçek sorununu gördün. Örn. 359'dan 10'a, 0'dan değil, “geriye” gider. Sorudan belli değildi. – dannyjolie