삽질하는플머

책장 넘기는 효과 구현하기 - 1.

여가생활/산수공부

산수공부는 원래 네이버 블로그에 포스팅하는데... 가기 귀찮아서 여기에 남김. 나중에 긁어붙이지 머...

아이패드를 출퇴근시간에 밀린 만화책 보는 용도로 잘 써먹고 있다.
요새 이북 어플들에서는 책장 넘기는 효과가 기본처럼 들어가기 시작하는 듯.
이 효과는 어떻게 만드는건지 갑자기 궁금해져서 삽질을 시작해 봄.

일단 A4용지 하나를 이리저리 접어보며 감을 잡아보자.


왼쪽 페이지를 기준으로 좌상단점을 끌어다 페이지 임의의 점에 올려놓은 형상.
이 이동하는 좌상단점의 벡터를 MvTL 이라고 부르자.
페이지 상단의 접힌점과 페이지의 우상단점, 그리고 MvTL 벡터 사이의 관계에 대해 대해 잠시 고민.




만약 MvTL 의 위치에 따른 적절한 접힌점을 계산할 수 있다면 나머지 좌표들도 계산할 수 있을 것이다.

접힌점은 다음과 같은 방법으로 얻을 수 있다. 먼저 페이지 폭만큼의 실을 준비한 다음


실의 한쪽은 우상단점에, 다른 한쪽은 MvTL 에 올리고


페이지 상단 변을 기준으로 실이 팽팽해지도록 당겨지는 점이 된다.



만약 이 상태에서 페이지의 상단이 아닌 팽팽하게 당겨지는 전체 점의 자취를 구한다면??
뭐 볼것도 없이 타원이 되지.

즉 다시말해 MvTL 점과 우상단점으로부터 거리의 합이 페이지 폭이 되는 타원의 방정식과,
우상단점을 지나고 각도가 Th 인 직선의 방정식을 만족하는 점을 계산하면 그 점이 바로 접힌점이 된다.



C 는 페이지의 우상단점, 그리고 -C는 모서리 이동점 MvTL 이다. 각도 Th 는 우상단점->MvTL 벡터의 ArcTan 로 계산할 수 있다.
타원이 이동하고 회전하면 생각하기 귀찮으니까 원점을 기준으로 고민하자. 어차피 C와 R2 사이의 거리만 구하면 되니까.
이 경우 우상단점에서 MvTL 간의 거리를 구해 원점을 기준으로 나누어 원점 기준의 -C 와 C 값을 결정할 수 있다.

원점을 기준으로 한 타원의 방정식은 다음과 같다.




거리의 합을 pw 라고 할 때 타원 장축의 길이는 다음과 같이 구할 수 있다. (여기서 pw는 페이지의 폭이다.)




타원의 성질에 따라 단축의 길이 b 는 다음과 같다.




촛점 C를 지나며 각도가 th인 직선의 방정식은 다음과 같다.




필요한 값들은 대충 갖춰졌으니 두 식을 연립해 풀어보자. 먼저 y 를 갈아치워 x 에 대해 풀어보면




x 에 대한 2차식이 되었으므로 각 항을 근의 공식에 넣어서 풀어주면 된다.
(어차피 컴퓨터가 계산할 꺼니까 식 정리는 대충대충. 저걸 풀어봤자 나중에 입력하기만 힘들어짐.)

x 를 갈아치워 y 에 대해 풀어본 반대의 경우도 구해둔다.




th 의 범위, 즉 1사분면인지 4사분면인지에 따라 적절한 값을 접힌점으로 선택하고 나머지 좌표들을 계산하면 완료.
테스트 해 본 결과 잘 동작하기는 하는데... 계산이 귀찮고 코드가 지저분하다. 그래도 고민한 과정이 아까워 남겨둠.

접힌 종이가 이루는  삼각형의 비례식을 이용한 좀 더 간단한 해법은... 2편에 계속.


------

덤으로 이건... 공식 테스트 하는 화면. 
 



이건 소스와 실행파일.

test.7z