La faille ici dans la classe VelocityTracker
d'Android que si votre vitesse dans la direction X dépasse la vitesse maxVelocity, elle est égale à maxVelocity et la même chose pour le Y. Mais, cela signifie que si nous allons à un angle de 20 ° et à une vitesse de 200, et notre maxVelocity est de 20. Notre vitesse est modifiée pour être de 20 * sqrt (2) à un angle de 45 °. La bonne réponse consiste à mettre à l'échelle le mXVelocity et le mYVeloicity par le rapport de la vitesse réelle et de la maxVelocity.ci-dessus maxVelocity change de direction en diagonale, contournement
Ma question est de savoir si je dois recourir à deux racines carrées pour corriger cette erreur?
La vitesse est la direction et la vitesse d'un objet. Changer la direction en raison de la vitesse maximale a été atteint doit être considéré comme un défaut. Cela entraîne également une lacune en ce sens qu'une vitesse diagonale est plus rapide que la vitesse orthogonale.
Le bit problématique d'un code semblable à:
mXVelocity = accumX < 0.0f ? Math.max(accumX, -maxVelocity) : Math.min(accumX, maxVelocity);
mYVelocity = accumY < 0.0f ? Math.max(accumY, -maxVelocity) : Math.min(accumY, maxVelocity);
Pour contourner ce que j'utilise:
tracker.computeCurrentVelocity(units); //maxVelocity
double velocityX = tracker.getXVelocity();
double velocityY = tracker.getYVelocity();
double actualVelocitySq = velocityX * velocityX + velocityY * velocityY;
double maxVelocitySq = maxVelocity * maxVelocity;
if (actualVelocitySq > maxVelocitySq) {
//double excessFactor = Math.sqrt(maxVelocitySq)/Math.sqrt(actualVelocitySq);
double excessFactor = Math.sqrt(maxVelocitySq/actualVelocitySq); //leewz's optimization
velocityX *= excessFactor;
velocityY *= excessFactor;
}
Est-il possible de ne pas éviter la double racine carrée? Ou une autre chose qui résout autrement ce bug visqueux?
Update:
La réponse semble être échelle deux composants selon l'une composante qui dépasse la vitesse maximale par le plus. Ce n'est pas strictement l'échelle en fonction de la vitesse réelle, mais il résout la majeure partie du problème avec des mathématiques faciles.
double scale;
double vectorX = Math.abs(velocityX);
double vectorY = Math.abs(velocityY);
if (vectorX > maxVelocity) {
scale = maxVelocity/vectorX;
if (vectorY > maxVelocity) {
scale = Math.min(scale, maxVelocity/vectorY);
}
velocityX *= scale;
velocityY *= scale;
} else {
if (vectorY > maxVelocity) {
scale = maxVelocity/vectorY;
velocityX *= scale;
velocityY *= scale;
}
}
Note aux lecteurs: Le code de la faille dans la question est 'VelocityTracker.computeCurrentVelocity (unités, MaxVelocity) d'Android', pas le code de la asker. – leewz