2017-12-28 40 views
2

나는 다음과 같은 기능을 사용하여 선형 함수에 매핑을 진행하기위한 유틸리티를 만들었습니다 : 이것은 당신이 최소 0과 100의 최대이있는 경우, 선형 값의 집합을 반환값 사이의 진행을 S- 곡선에 매핑하는 방법은 무엇입니까?

public static func map<T: FloatingPoint>(progress: T, min: T, max: T) -> T { 
    assert(progress >= 0) 
    assert(progress <= 1) 
    return min + ((max - min) * progress) 
} 

을의 다음 값은 각각의 진행에 대해 반환됩니다

0.1 -> 10 
0.2 -> 20 
0.5 -> 50 
0.8 -> 80 
0.9 -> 90 

내가 가까이가 진행의 시작 지점과 끝 지점에있는 S 자 곡선에 반환 값을 매핑 유사한 기능을 만들고 싶습니다 결과는 결과의 영향을 덜받습니다. 이것은 예를 들어 CADisplayLink를 사용하여 애니메이션을 부드럽게 만드는 데 매우 유용합니다. 내가 지금 어떤 포인터는 크게 감상 할 수 이것에 대한 아주 기본적인 수학 공식이있을거야

0.1 -> 01 
0.2 -> 10 
0.5 -> 50 
0.8 -> 90 
0.9 -> 99 

: 위의 예제에 대한 예상 결과는 같을 것입니다!

답변

1

진도를 단일 매개 변수 수학 함수로 생각하십시오. 귀하의 현재 사건에서 선형 함수이며 y이 반환 값이고 n(max - min)이고 m이 1이고 진도 값이 x 인 경우 y = mx + n과 같이 보입니다.

원하는 것을 얻으려면 선형 대신에 sigmoid function의 대체 된 버전을 사용해야합니다. x = 0.5에서 중간 값이 필요하고 0과 1 사이의 값에만 관심이 있습니다. 위키 피 디아의 글에서 알 수 있듯이 x = -6 및 6 이전과 이후의 y 값은 각각 서로 매우 가깝습니다. x 값을 [0, 1] 범위에서 [-6, 6] 범위로만 조정하면됩니다. 의 I 전에 FloatingPoint을 사용한 적이 아이디어

public static func map<T: FloatingPoint>(progress: T, min: T, max: T) -> T { 
    assert(progress >= 0) 
    assert(progress <= 1) 
    return min + ((max - min) * sigmoid(progress)) 
} 

private static func sigmoid(_ input: FloatingPoint) -> FloatingPoint { 
    let x = (input - 0.5) * 12.0 // scale the input value to be between -6 and 6 
    let ex = pow(M_E, x) // M_E is the Euler number and is a Double constant 
    return ex/(ex + 1) // return the result of the sigmoid function 
} 

당신에게 제공해야 다음, 그래서이 작동하는지 잘 모르겠어요, 어떤 종류의 불일치가있을 수 있습니다. 그러나 나는 논리가 잘되어야한다고 생각한다.

+0

감사합니다. 나는 이것을 가지고 놀아보고 그 결과를 알려줄 것이다. FloatingPoint는 Float 및 Double 값의 제네릭입니다. –

+0

감사합니다. @halileohalilei, 답변을 수정하고 내가 찾고있는 것을 얻었습니다. –