Question

Je l'écriture de code iPhone qui reconnaît si une ligne flou est glissée-ish droite. Je me roulement des deux points d'extrémité et la comparer à 0, 90, 180 et 270 degrés avec une tolérance de 10 degrés plus ou moins. En ce moment, je le fais avec un tas de blocs si, ce qui semble super maladroits.

pour l'écriture d'une fonction qui, compte tenu de la palier 0..360, le tolérance pourcentage (disons 20% = (-10 ° à + 10 °)) et un angle droit comme 90 degrés, retourne si le palier est dans la tolérance?

Mise à jour: Je suis peut-être trop spécifique Je pense une belle fonction générale qui détermine si un nombre est dans un pourcentage d'un autre numéro est utile dans. de nombreux domaines.

Par exemple: Est-ce le nombre swipeLength dans les 10% maxSwipe ? Ce serait utile.

 BOOL isNumberWithinPercentOfNumber(float firstN, float percent, float secondN) {
      // dunno how to calculate
 }

 BOOL result;

 float swipeLength1 = 303; 
 float swipeLength2 = 310; 

 float tolerance = 10.0; // from -5% to 5%
 float maxSwipe = 320.0;

 result = isNumberWithinPercentOfNumber(swipeLength1, tolerance, maxSwipe); 
 // result = NO

 result = isNumberWithinPercentOfNumber(swipeLength2, tolerance, maxSwipe);
 // result = YES

Est-ce que vous voyez ce que je veux en venir?

Était-ce utile?

La solution

20% sous forme décimale est égale à 0,2. Il suffit de diviser par 100,0 pour obtenir la décimale. Diviser par 2,0 pour obtenir la moitié de la plage acceptable. (Combiné dans 200,0 diviseur)

A partir de là, d'ajouter et de soustraire de 1,0 pour obtenir le 90% et 110% des valeurs. Si le premier nombre se situe entre les plages, alors là vous l'avez.

BOOL isNumberWithinPercentOfNumber(float firstN, float percent, float secondN) {
      float decimalPercent = percent / 200.0;
      float highRange = secondN * (1.0 + decimalPercent);
      float lowRange = secondN * (1.0 - decimalPercent);
      return lowRange <= firstN && firstN <= highRange;
 }

Note: il n'y a pas de contrôle d'erreur ici pour NaN ou des valeurs négatives. Vous voulez ajouter que pour le code de production.

Mise à jour:. À faire pour cent à inclure à la fois +/- plage

Autres conseils

int AngularDistance (int angle, int targetAngle) 
{

    int diff = 0;
    diff = abs(targetAngle - angle)

    if (diff > 180) diff = 360 - diff;

    return diff;
}

Cela devrait fonctionner pour deux angles.

Réponse à votre raffiné / nouvelle question:

bool isNumberWithinPercentOfNumber (float n1, float percentage, float n2)
{

if (n2 == 0.0) //check for div by zero, may not be necessary for float
   return false; //default for a target value of zero is false
else
   return (percentage > abs(abs(n2 - n1)/n2)*100.0);
}

Pour expliquer, vous prenez la différence absolue entre votre test et la valeur cible, et le diviser par la valeur cible (les deux « abs'olute appels assurez-vous que cela fonctionne avec des chiffres cibles négatifs et de test aussi, mais pas avec des pourcentages négatifs / tolérances). Cela vous donne le pourcentage de la différence exprimée en fraction décimale, il multiplie avec 100 pour donner l'expression « commune » du pourcentage (10% = 0,10),

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top