쿠몬 식 영어 학습 장치 "E-Pencil"을 해킹 [2]
실제로 도트를 배치하여 출력해 본다
지난번 계속.
1개의 격자를 64*64로 하고, 도트의 상대적인 위치를 이하와 같이 정의하였다.
int data_pos[8][2] = {
{18,18}, //0 左上
{32,16}, //1 上
{46,18}, //2 右上
{16,32}, //3 左
{48,32}, //4 右
{18,46}, //5 左下
{32,48}, //6 下
{46,46}, //7 右下
};
이것으로 3bit의 데이터를 좌표로 표현할 수 있게 되었으므로,
적당한 3bit의 데이터 배열을 준비해, 9개의 격자에 격납해 본다.
int data[9] = {0,1,2,3,4,5,6,7,0};
POINT DotPos[9];
for(int i=0; i<9; i++){
int x = 64 * (i%3) + data_pos[data[i]][0];
int y = 64 * (i/3) + data_pos[data[i]][1];
DotPos[i].x = x;
DotPos[i].y = y;
}
※제대로 실장할 때에는 만든 배열의 외측을 지정하지 않도록 주의한다.
그래서 실제로 점을 그릴 때 64x64의 상대 위치에서
실제로 그리려는 크기의 캔버스에 그립니다.
이번에는 Win32API의 HDC를 사용했으므로 원을 그리는 함수 Ellipse를 사용하여
double scale = 2.5;
int r = 7;
for (int i = 0; i<9; i++) {
int left = (int)((DotPos[i].x - r) * scale);
int top = (int)((DotPos[i].y - r) * scale);
int right = (int)((DotPos[i].x + r) * scale);
int bottom = (int)((DotPos[i].y + r) * scale);
::Ellipse(hDC, left, top, right, bottom);
}
이렇게 하면 64*64의 격자에 대해 반경 7의 원을 그리는 이미지가 되지만,
실제로는 2.5배의 160*160픽셀에 반경 17.5(int에 캐스트되기 때문에 17)의 원이 그려진다.
키 닷이나 격자 닷도 그리면 이런 느낌이 된다.
이것으로 3*3의 격자 데이터를 화상에 할 수 있으므로,
이것을 x 방향으로 7회, y 방향으로 5회 반복함으로써 오리지널에 가까운 도트 화상을 만들 수 있었다.
간이적으로 도트 패턴 제너레이터를 만들었으므로,
임의의 9자리 정수(27bit 코드)로부터 도트 패턴을 생성할 수 있다.
인쇄해보기
그런데 실제로 인쇄해 보았지만…
흠, 도트가 부서져 버렸다. E-Pencil도 반응 없음.
이 화상이 약 10.0mm*7.0mm이므로, 상당히 세세한 것은 틀림없지만, 프린터의 한계일까?
그러나 프린터의 공칭 스펙에서는 9600 DPI로 낼 수 있을 것이므로,
프린터에 출력하는 쪽의 소프트의 문제일지도 모른다.
좀 더 인쇄 환경을 정돈하고 나서 재챌린지가 필요하다고 생각되므로,
계속은 또 이번이라고 하는 것에. 좀처럼 진행되지 않는다.
Reference
이 문제에 관하여(쿠몬 식 영어 학습 장치 "E-Pencil"을 해킹 [2]), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Ogawan/items/48467dc0925ef52dbd5a
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
int data_pos[8][2] = {
{18,18}, //0 左上
{32,16}, //1 上
{46,18}, //2 右上
{16,32}, //3 左
{48,32}, //4 右
{18,46}, //5 左下
{32,48}, //6 下
{46,46}, //7 右下
};
int data[9] = {0,1,2,3,4,5,6,7,0};
POINT DotPos[9];
for(int i=0; i<9; i++){
int x = 64 * (i%3) + data_pos[data[i]][0];
int y = 64 * (i/3) + data_pos[data[i]][1];
DotPos[i].x = x;
DotPos[i].y = y;
}
double scale = 2.5;
int r = 7;
for (int i = 0; i<9; i++) {
int left = (int)((DotPos[i].x - r) * scale);
int top = (int)((DotPos[i].y - r) * scale);
int right = (int)((DotPos[i].x + r) * scale);
int bottom = (int)((DotPos[i].y + r) * scale);
::Ellipse(hDC, left, top, right, bottom);
}
그런데 실제로 인쇄해 보았지만…
흠, 도트가 부서져 버렸다. E-Pencil도 반응 없음.
이 화상이 약 10.0mm*7.0mm이므로, 상당히 세세한 것은 틀림없지만, 프린터의 한계일까?
그러나 프린터의 공칭 스펙에서는 9600 DPI로 낼 수 있을 것이므로,
프린터에 출력하는 쪽의 소프트의 문제일지도 모른다.
좀 더 인쇄 환경을 정돈하고 나서 재챌린지가 필요하다고 생각되므로,
계속은 또 이번이라고 하는 것에. 좀처럼 진행되지 않는다.
Reference
이 문제에 관하여(쿠몬 식 영어 학습 장치 "E-Pencil"을 해킹 [2]), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Ogawan/items/48467dc0925ef52dbd5a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)