PDF 벡터 좌표를 격자 지도에 넣다 3번 뭉갠 이야기
175개 부스 좌표를 격자 번호로 반올림했다가 배치가 깨졌다. 렌더러는 이미 소수를 받고 있었다.
도면 PDF에서 좌표를 정확히 뽑았는데, 화면에 올리는 순간 배치가 뭉개지는 경우가 있다.
아트페어 도면을 지도 화면으로 옮기는 작업이었다. 부스가 175개. 도면 PDF 안에 부스가 벡터 사각형으로 들어 있어서 좌표를 그대로 뽑았다. 여기까지는 정확했다 — 부스마다 x·y·폭·높이가 소수점까지 나왔다. 도면에서 읽은 175개와 주최 측 참가자 명단 175곳이 개수까지 맞아서 빠뜨린 것도 없었다.
문제는 그다음이었다. 지도는 정사각형 칸이 늘어선 격자다. 그래서 뽑은 좌표를 격자 번호로 반올림했다.
배치가 뭉개졌다. 부스 폭이 실제로는 12.7pt에서 50pt까지 제각각인데 전부 같은 칸이 되니 넓은 부스와 좁은 부스가 구분되지 않았다. 세로로도 늘어져서 원본과 딴판이었다.
세 번 고쳤다.
- 칸 수로 크기를 표현했다(
colspan/rowspan) — 이번엔 세로가 43줄까지 늘어났다 - 빈 줄을 압축했다 — 부스는 붙었는데 통로가 사라졌다
- 구역을 나눠 가로로 배치했다 — 모양은 비슷해졌지만 여전히 「비슷한」 수준이었다
세 번째를 보여줬을 때 돌아온 말은 한마디였다.
"안 맞아."
선택지를 둘로 셌다
이 시점에 내가 정리한 선택지는 둘이었다.
하나는 「격자의 한계를 인정한다」. 격자에 넣는 순간 손실이 생기는 건 구조적이니, 정확도를 포기하고 부스 번호와 순서만 맞추자는 것. 관람객이 부스를 찾는 데는 그걸로 충분하다는 논리였다.
다른 하나는 「렌더러를 개조한다」. 좌표를 그대로 쓸 수 있게 그리는 코드를 바꾸는 것. 파일을 세어보고 4시간을 불렀다. 다만 사람들이 실제로 쓰는 화면이라 회귀가 나면 다른 행사 지도까지 같이 깨진다는 위험을 붙였다.
둘 다 틀렸다. 셋째 선택지가 있었는데 내가 그걸 찾을 생각을 안 했다. 「이 시스템은 격자다」를 전제로 깔아놓고, 그 전제 안에서만 답을 찾고 있었다.
코드를 읽으니 소수를 이미 받고 있었다
렌더러를 개조하기 전에 그리는 코드를 읽었다. 좌표를 픽셀로 바꾸는 함수는 이렇게 생겼다. 부스에 다각형 좌표가 있으면 그걸 쓰고, 없으면 격자 번호를 쓴다. 그리고 다각형 좌표를 정수로 제한하는 코드가 어디에도 없었다. 주석에는 아예 이렇게 적혀 있었다.
다각형의 칸 단위 경계 상자(소수 칸)
같은 시스템의 다른 행사 지도를 열어보니 이미 소수 좌표를 쓰고 있었다. 몇 달 전에 누가 넣은 기능이었다.
부스를 다각형으로 만들고 좌표를 소수로 넣었다. 코드는 한 줄도 안 고쳤다. 부스 크기도 간격도 통로도 도면 그대로가 됐다.
바뀐 건 데이터 한 칸이다. 되돌리려면 예전 값을 다시 넣으면 끝이고, 다른 행사 지도는 아예 건드리지도 않았다.
남는 것
- 「이 시스템은 X다」라는 전제를 내가 언제 만들었는지 기억나지 않는다. 격자 화면을 보고, 격자 좌표가 든 데이터를 보고 자연스럽게 굳혔을 것이다. 그리고 그 뒤로는 그 전제 안에서만 선택지를 셌다. 세 번을 고치는 동안 한 번도 「격자여야 하나」를 묻지 않았다
- 기능을 만들자고 결론이 났을 때가 위험하다. 그건 대개 모르는 것을 다 확인한 뒤에 나오는 결론이 아니라, 아는 것 안에서 답이 안 나올 때 나오는 결론이다. 순서가 반대다
- 코드 읽는 데 20분 걸렸다. 4시간을 부르기 전에 그 20분을 썼어야 했다