안티에일리어싱 ASCII 아트

시간 제한1초메모리 제한128 MB

요약
직선 y = mx + b에 대해 정수 x마다 두 픽셀을 소수부로 명암 처리하고, 명암을 소수 첫째 자리로 반올림해 20x20 문자 그림을 출력한다.
난이도

보통10점 중 4점

유형
구현, 시뮬레이션, 수학
정답자
아직 제출이 없습니다

문제

에일리어싱(aliasing)은 디지털 장치가 아날로그 원본을 유한한 해상도로 표본화할 때 생기는 왜곡을 가리키는 말이다. 컴퓨터 그래픽스에서 흔히 나타나는 문제로, 직선이나 매끄러운 곡선을 낱낱의 픽셀로 그리면 계단처럼 울퉁불퉁하게 보인다. 예를 들어 직선

y=mx+by = mx + b

을 단순하게 그리면 다음과 비슷한 결과가 나온다.

        *** 
      **
   ***
***

매끄러운 직선이라기보다는 계단에 가깝다.

에일리어싱(계단 현상, jaggies)은 안티에일리어싱으로 완화할 수 있다. 픽셀을 여러 단계의 회색으로 칠해서, 멀리서 보았을 때 영상이 더 매끄럽게 보이도록 하는 방법이다.

여기서 사용하는 방법은 각 열마다 두 개의 픽셀을 칠한다. 모든 정수 xx에 대해 y=mx+by = mx + b를 구하고, 이를 정수 부분 ywy_w(yy 이하의 가장 큰 정수)와 소수 부분 yfy_f로 나눈다. 그러면

yw+yf=y,0≤yf<1y_w + y_f = y, \qquad 0 \le y_f < 1

이 성립한다. 예를 들어 y=23.56y = 23.56이면 yw=23y_w = 23, yf=0.56y_f = 0.56이고, y=−1.3y = -1.3이면 yw=−2y_w = -2, yf=0.7y_f = 0.7이다.

픽셀의 회색 농도를 0.00.0부터 1.01.0까지의 수로 나타내자. 0.00.0은 완전한 흰색, 1.01.0은 완전한 검은색이다. 열 xx에서는 다음과 같이 칠한다.

  • yf=0y_f = 0이면 픽셀 (x,yw)(x, y_w)를 농도 1.01.0으로 칠한다.
  • yf≠0y_f \ne 0이면 픽셀 (x,yw)(x, y_w)를 농도 1−yf1 - y_f로, 픽셀 (x,yw+1)(x, y_w + 1)을 농도 yfy_f로 칠한다.

이 방법으로 안티에일리어싱된 직선을 그리는 프로그램을 작성하라.

입력

입력은 여러 개의 테스트 케이스로 이루어진다. 각 케이스는 한 줄에 두 수 mm과 bb가 주어지며, 이는 직선 y=mx+by = mx + b의 기울기와 yy절편이다. 두 값 모두 소수점 아래 최대 두 자리까지의 실수로 주어진다. mm은 0.000.00 이상 0.500.50 이하, bb는 −20.00-20.00 이상 20.0020.00 이하이다.

mm과 bb가 모두 00인 줄은 입력의 끝을 의미하며, 그리지 않는다.

출력

각 입력 줄마다 별도의 그림을 그린다. 그림은 문자 20×2020 \times 20 크기이며, 데카르트 평면에서 0≤x<200 \le x < 20, 0≤y<200 \le y < 20인 영역을 나타낸다. 직선이 지나지 않는 자리는 공백(빈칸)으로 둔다.

칠해지는 각 픽셀에 대해 회색 농도를 구한 뒤, 소수 첫째 자리로 반올림하고(정확히 중간 값이면 올림), 아래 표에서 대응하는 문자를 고른다.

반올림한 회색 농도0.00.10.20.30.40.50.60.70.80.91.0
문자.:-=+tw*#%@

문자는 차례대로 마침표, 콜론, 붙임표, 등호, 더하기, 소문자 t, 소문자 w, 별표, 우물 정, 백분율, 골뱅이이다. yfy_f와 회색 농도는 반드시 정확히 계산해야 한다.

그림은 위쪽부터 아래로 출력한다. 즉 첫 줄이 y=19y = 19, 마지막 줄이 y=0y = 0이다. 각 줄은 20개의 문자로 이루어지며, 바로 앞과 뒤에 세로 막대(|)를 붙여 출력한다. 각 그림 뒤에는 밑줄(_) 22개로 이루어진 줄을 한 줄 출력한다.

예제1

  1. 예제 1

    입력
    0.5 0
    0.2 10.0
    0 0
    
    예상 출력
    |                    |
    |                    |
    |                    |
    |                    |
    |                    |
    |                    |
    |                    |
    |                    |
    |                    |
    |                   t|
    |                 t@t|
    |               t@t  |
    |             t@t    |
    |           t@t      |
    |         t@t        |
    |       t@t          |
    |     t@t            |
    |   t@t              |
    | t@t                |
    |@t                  |
    ______________________
    |                    |
    |                    |
    |                    |
    |                    |
    |                    |
    |                -+w#|
    |           -+w#@#w+-|
    |      -+w#@#w+-     |
    | -+w#@#w+-          |
    |@#w+-               |
    |                    |
    |                    |
    |                    |
    |                    |
    |                    |
    |                    |
    |                    |
    |                    |
    |                    |
    |                    |
    ______________________