문제

스 와이프 라인이 직선인지 모호하게 인식하는 iPhone 코드를 작성하고 있습니다. 나는 두 개의 엔드 포인트의 베어링을 얻고 10도 플러스 또는 마이너스의 공차로 0, 90, 180 및 270도와 비교합니다. 지금 나는 if 블록의 무리로 그것을한다.

주어진 함수를 작성하는 방법 베어링 0..360, 용인 백분율 (20% = (-10 ° ~ +10 °)) 및 직선 각도 90도처럼 베어링이 공차 내에 있는지 여부를 반환합니까?

업데이트: 나는 아마도 너무 구체적 일 것입니다. 나는 숫자가 다른 숫자의 백분율 내에 있는지 여부를 결정하는 멋진 일반적인 기능은 많은 영역에서 유용성을 가지고 있다고 생각합니다.

예를 들어 : 숫자입니다 Swipelength 이내에 10%Maxswipe? 그것은 유용 할 것입니다.

 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

내가 무엇을 받고 있는지 보십니까?

도움이 되었습니까?

해결책

10 진수로 20%는 0.2입니다. 100.0으로 나뉘려면 소수점을 얻으십시오. 허용 가능한 범위의 절반을 얻으려면 2.0으로 나뉩니다. (200.0 Divisor로 결합)

거기에서 1.0에서 추가 및 빼기 위해 90%, 110% 값을 얻습니다. 첫 번째 숫자가 범위 사이에 있으면 거기에 있습니다.

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

참고 : NAN 또는 음수 값에 대해서는 여기에 오류가 없습니다. 생산 코드에 추가하고 싶을 것입니다.

업데이트 : +/- 범위를 모두 포함하는 백분율을 만듭니다.

다른 팁

int AngularDistance (int angle, int targetAngle) 
{

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

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

    return diff;
}

이것은 두 각도에 대해 작동해야합니다.

세련된/새로운 질문에 대한 답변 :

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

설명하려면 테스트와 목표 값 사이의 절대적인 차이를 취하고 목표 값으로 나눕니다 (두 개의 'ABS'Olute 호출은 부정적인 목표 및 테스트 번호와 함께 작동하지만 음수 비율/공차로 작동하지 않도록합니다). . 이것은 소수 분수로 표현 된 차이의 백분율을 제공하며, 100을 곱하여 '일반적인'비율 (10% = 0.10)의 '공통'표현을 제공합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top