Pergunta

Eu estou escrevendo código de iPhone que vagamente reconhece se uma linha swiped é straight-ish. Recebo a influência dos dois pontos finais e compará-lo com 0, 90, 180 e 270 graus com uma tolerância de 10 graus mais ou menos. Agora eu fazê-lo com um monte de se blocos, que parece super-pesado.

Como escrever uma função que, dado o rolamento 0..360, o tolerância percentagem (digamos, 20% = (-10 ° a + 10 °)) e uma reta ângulo como 90 graus, retorna se o rolamento está dentro da tolerância?

Update: eu sou, talvez, ser muito específico eu acho uma boa, função geral que determina se um número é dentro de um percentual de outro número tem utilidade em. muitas áreas.

Por exemplo: É o número swipeLength dentro de 10% de maxSwipe ? Isso seria útil.

 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

Você vê o que eu estou chegando?

Foi útil?

Solução

20% como um decimal é igual a 0,2. Basta dividir por 100,0 para obter o decimal. Dividir por 2.0 para obter metade da faixa aceitável. (Combinados em 200,0 divisor)

A partir daí, somar e subtrair de 1,0 para obter o 90% e 110% os valores. Se o primeiro número está entre os intervalos, então, você tem isso.

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;
 }

Nota: não há nenhuma verificação de erros aqui para NaN ou valores negativos. Você vai querer acrescentar que para o código de produção.

Update:. A make por cento, para incluir tanto +/- gama

Outras dicas

int AngularDistance (int angle, int targetAngle) 
{

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

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

    return diff;
}

Isso deve funcionar para quaisquer dois ângulos.

Resposta à sua refinada nova pergunta /:

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);
}

Para explicar, você tirar a diferença absoluta entre o teste eo valor-alvo, e dividi-lo pelo valor-alvo (as duas 'chamadas abs'olute certificar-se isso funciona com números de destino e de teste negativos também, mas não com percentuais negativos / tolerâncias). Isto dá a percentagem da diferença expressa como fracção decimal, multiplica-o com 100 para dar a expressão 'comum' de percentagem (10% = 0,10),

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top