[英]Calculating accuracy of rotation
所以我有一個包含旋轉度數的變量,我有一個理想的旋轉度,我想要的是兩個方向上 20 度以內的精度百分比。
var actualRotation = 215
var idealRotation = 225
var accuracy = magicFunction(actualRotation, idealRotation)
在這種情況下, actualRotation
是關閉的,從10度idealRotation
,所以在任一方向的20度的閾值,這是一個50%的准確性。 所以accuracy
的值為0.5
。
var accuracy = magicFunction(225, 225) // 1.0
var accuracy = magicFunction(225, 210) // 0.25
var accuracy = magicFunction(245, 225) // 0.0
var accuracy = magicFunction(90, 225) // 0.0
我怎樣才能做到這一點?
試試這個(只需運行代碼片段):
function magicFunction(actualRotation , idealRotation ) { var diff = Math.abs(actualRotation - idealRotation); var accurrancy = 1 - (diff / 20); accurrancy = accurrancy < 0 ? 0 : accurrancy; return accurrancy; } console.log("225, 225: ", magicFunction(225, 225)); console.log("225, 210: ", magicFunction(225, 210)); console.log("245, 225: ", magicFunction(245, 225)); console.log("90, 225: ", magicFunction(90, 225));
var actualRotation = 215
var idealRotation = 225
var diff = abs(actualRotation - idealRotation);
if (diff > 20)
console.log(0);
else{
accuracy = 1 - (diff/ 20);
console.log(accuracy);
}
以前的答案很好,但他們沒有處理差異跨越零奇異性的情況。
例如,當角度為5和355 時,您預計相差 10,但簡單的減法得到 350。要糾正此問題,如果角度大於 180,則從 360 中減去該角度。
要使上述工作正常進行,您還需要角度在[0, 360)范圍內。 然而,這是一個簡單的模計算,如下所示。
代碼:
function normalize(angle) { if (angle < 0) return angle - Math.round((angle - 360) / 360) * 360; else if (angle >= 360) return angle - Math.round(angle / 360) * 360; else return angle; } function difference(angle1, angle2) { var diff = Math.abs(normalize(angle1) - normalize(angle2)); return diff > 180 ? 360 - diff : diff; } function magicFunction(actualRotation, idealRotation, limit) { var diff = difference(actualRotation, idealRotation); return diff < limit ? 1.0 - (diff / limit) : 0.0; } // tests console.log(difference(10, 255)); // 115 (instead of the incorrect answer 245) console.log(magicFunction(5, 355, 20)); // 0.5 (instead of 0 as would be returned originally)
編輯:為什么以前的方法不足的圖形說明:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.