티스토리 뷰

아주 옛날부터 이런 고민은 많은 사람들이 해왔고 많은 해결책이 있는 걸로 안다...

근데 단말 환경... 정확히 지금까지의 단말 환경에서는 math api의 제약이라던가 부동소수점 연산의 제약이라던가...

머 이런 저런 이유 때문에 많은 개발자들이 선을 그리지 않고 이미지로 대체한다. 사실 이미지로 하는게 훨씬 이쁘다.

공통적으로 발견되는 문제점은

1. 각도 계산에 대한 어려움 (왜냐... 그냥 플랫폼이 지원하는 math함수가 내가 원하는 각에 대한 값을 정확하게 올려줄지 확신할 수 없음, 그 다음으로 속도가 잘 나올 것인가에 대한 불신)이 있다.

위의 문제를 해결한 후 고민해야 보아야 할 사항은 시간을 가리키는 시침, 분침, 초침을 뾰족하게 그릴 것인가, 아니면 그냥 직사각형의 형태로 그릴것 인가가 문제인데

일단 직사각형으로 그릴 경우의 문제점을 이야기해 보면,

2-1. 대부분(? 확실하지 않다. 단 현재 내가 작업하는 플랫폼은 그렇다.)의 모바일 플랫폼은 두께를 가지는 선을 그리는 api를 제공하지 않는다.

2-2. 두께를 여러개의 라인을 그려서 나타내려 하면 빈 공백이 생긴다.
    예를 들어 원래 0,0 에서 5,10 으로 선을 그리는데, 1,0에서 6,10 그리고 0,1에서 5,11로 선을 그리면 중간 중간 공백이 생긴다.

위의 문제들을 해결하기 위해서 내가 사용한 방법은,

2-1. 선을 그리는 알고리즘을 따로 구현한다.
2-2. 선의 점을 찍을 경우 각도에 따라 그리고자 하는 두께 만큼 세로선 or 가로선을 그리면서 목표점까지 그려나간다.
    45도 이상 135도 미만은 가로, 135이상 225미만은 세로... 이런식으로 360도를 지나 원래 45까지만 와서 그리면 두께를 표현하는 선을 그릴 수 있다.

두번째로 뾰족하게 침을 그리고 싶은 경우 생기는 문제에 대해 이야기 하면

3-1, 여러 점에서 목표점 하나를 향해서 선을 그리면 꼭 공백이 생긴다.

이를 해결하는 방법은 2-2의 응용으로 해결할 수 있다.

3-1 시작 지점에서의 두께를 기준으로 총 선의 길이와 비례적으로 라인의 두께를 줄여나간다. 각 점의 길이를 계산해서 비례적으로 줄어든 두께를 이용하여 2-2와 같은 방식으로 선을 그려나간다.

여기서 한가지 짚어볼 점은 3번 항목의 문제를 해결하면 각에 따라 삼각형이 너무 한쪽으로 치우치는 현상을 볼 수 있다.
이 문제를 해결하기 위해서는 두께를 표현하기 위한 선을 그릴때, 해당 선의 시작점과 끝점을 각도에 따라 계산을 해서 그려야 한다. (해보니 좀 느려지기는 하는것 같다.)

실제로 시계를 만들어 그리는데 필요한 각의 개수는 15개 나머지는 15의 각을 기본 +,- 연산만으로 계산할 수 있으니 속도에 영향을 주지 않는 듯 하고, sin, cos은 해당 값을 << 10 (*1024)한 값으로 2byte 변수에 저장하였으니,

아날로그 시계를 그리는데 필요한 변수 메모리는 최대 80 byte를 넘기지 않는다는 대단한 결과가......홍홍홍...

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함