안티에일리어싱 ASCII 아트
시간 제한1초메모리 제한128 MB
직선 y = mx + b에 대해 정수 x마다 두 픽셀을 소수부로 명암 처리하고, 명암을 소수 첫째 자리로 반올림해 20x20 문자 그림을 출력한다.
문제
에일리어싱(aliasing)은 디지털 장치가 아날로그 원본을 유한한 해상도로 표본화할 때 생기는 왜곡을 가리키는 말이다. 컴퓨터 그래픽스에서 흔히 나타나는 문제로, 직선이나 매끄러운 곡선을 낱낱의 픽셀로 그리면 계단처럼 울퉁불퉁하게 보인다. 예를 들어 직선
을 단순하게 그리면 다음과 비슷한 결과가 나온다.
***
**
***
***
매끄러운 직선이라기보다는 계단에 가깝다.

에일리어싱(계단 현상, jaggies)은 안티에일리어싱으로 완화할 수 있다. 픽셀을 여러 단계의 회색으로 칠해서, 멀리서 보았을 때 영상이 더 매끄럽게 보이도록 하는 방법이다.
여기서 사용하는 방법은 각 열마다 두 개의 픽셀을 칠한다. 모든 정수 에 대해 를 구하고, 이를 정수 부분 ( 이하의 가장 큰 정수)와 소수 부분 로 나눈다. 그러면
이 성립한다. 예를 들어 이면 , 이고, 이면 , 이다.
픽셀의 회색 농도를 부터 까지의 수로 나타내자. 은 완전한 흰색, 은 완전한 검은색이다. 열 에서는 다음과 같이 칠한다.
- 이면 픽셀 를 농도 으로 칠한다.
- 이면 픽셀 를 농도 로, 픽셀 을 농도 로 칠한다.
이 방법으로 안티에일리어싱된 직선을 그리는 프로그램을 작성하라.
입력
입력은 여러 개의 테스트 케이스로 이루어진다. 각 케이스는 한 줄에 두 수 과 가 주어지며, 이는 직선 의 기울기와 절편이다. 두 값 모두 소수점 아래 최대 두 자리까지의 실수로 주어진다. 은 이상 이하, 는 이상 이하이다.
과 가 모두 인 줄은 입력의 끝을 의미하며, 그리지 않는다.
출력
각 입력 줄마다 별도의 그림을 그린다. 그림은 문자 크기이며, 데카르트 평면에서 , 인 영역을 나타낸다. 직선이 지나지 않는 자리는 공백(빈칸)으로 둔다.
칠해지는 각 픽셀에 대해 회색 농도를 구한 뒤, 소수 첫째 자리로 반올림하고(정확히 중간 값이면 올림), 아래 표에서 대응하는 문자를 고른다.
문자는 차례대로 마침표, 콜론, 붙임표, 등호, 더하기, 소문자 t, 소문자 w, 별표, 우물 정, 백분율, 골뱅이이다. 와 회색 농도는 반드시 정확히 계산해야 한다.
그림은 위쪽부터 아래로 출력한다. 즉 첫 줄이 , 마지막 줄이 이다. 각 줄은 20개의 문자로 이루어지며, 바로 앞과 뒤에 세로 막대(|)를 붙여 출력한다. 각 그림 뒤에는 밑줄(_) 22개로 이루어진 줄을 한 줄 출력한다.