ISBN 검증하기
이장에서 배우는 기능 ISBN 검증 계산법 ISBN의 처음 12자리 숫자에 가중치 1과 3을 번갈아가며 곱한다. 각 가중치를 곱한 값의 합을 계산한다. 가중치의 합을 10으로 나눈 나머지를 구한다. 10에서 나머지를 뺀 값을 다시 10으로 나눈 나머지를 구한다. 위 계산의 결과가 13번째 숫자와 같으면 검증된 ISBN이고, 그렇지 않으면 검증되지 않은 값이다. ISBN… Continue Reading ISBN 검증하기
이장에서 배우는 기능 ISBN 검증 계산법 ISBN의 처음 12자리 숫자에 가중치 1과 3을 번갈아가며 곱한다. 각 가중치를 곱한 값의 합을 계산한다. 가중치의 합을 10으로 나눈 나머지를 구한다. 10에서 나머지를 뺀 값을 다시 10으로 나눈 나머지를 구한다. 위 계산의 결과가 13번째 숫자와 같으면 검증된 ISBN이고, 그렇지 않으면 검증되지 않은 값이다. ISBN… Continue Reading ISBN 검증하기
이장에서 배우는 기능 이진 탐색, 리스트의 오름차순 정렬 컴퓨터와 숫자 맞추기 대결 연습문제1(p193) 처음부터 순차적으로 비교하며 원하는 데이터를 찾는 선형 탐색 방법으로 데이터를 찾는 프로젝트를 만들어 봅시다. 연습문제2(p193) 리스트에 저장된 데이터를 오름차순으로 정렬하는 프로젝트를 만들어 봅시다.
이장에서 배우는 기능 스택(Stack) : 삽입과 삭제가 한쪽 방향에서만 일어나는 구조 큐(Queue) : 한쪽 방향에서 삽입되고 반대쪽 방향으로 삭제가 되는 구조 스택 사용 예제 스택에 공 넣고 빼기 실전14-3(p181) 문자열을 입력받아 1문자씩 스택에 삽입(Push)하고, 스택에서 1문자씩 거꾸로 읽어내어(Pop) 결과 리스트에 넣은 뒤 결과리스트를 말하기 파일다운로드
이 장에서 배우는 기능 리스트 활용 리스트에 항목삽입 리스트에서 항목 삭제 리스트에서 특정 항목 검색 리스트 내용 전체 보기 행운의 복불복
이장에서 배우는 기능 리스트 : 여러 개의 데이터를 한 곳에 저장하는 공간 블록 익히기 성적처리에 리스트 사용 예제 동물 영어 이름 맞추기 퀴즈 실전9-1(p135) 동일한 질문이 나오지 않도록 수정하시오. 실전9-2(p137) duck, crab, mouse를 추가하고 퀴즈가 종료되었을 때 맞은 문항수와 점수를 말하도록 수정하시오. 연습문제1(p137) 1부터 45까지의 수가 적혀있는 45개의… Continue Reading 동물 영어 이름 맞추기 퀴즈
이장에서 배우는 기능 재귀 호출 : 임의의 블록에서 자기 자신을 호출하여 문제를 해결하는 구조 시어핀스키 삼각형 출처: 위키백과 URL 1917년 폴란드 수학자인 시어핀스키가 고안한 도형 시에르핀스키 삼각형(Sierpinski triangle)은 바츠와프 시에르핀스키의 이름이 붙은 프랙탈 도형이다. 시에르핀스키 가스켓(Sierpinski gasket)으로도 불린다. 시에르핀스키 삼각형은 다음과 같은 방법을 통해 얻을 수 있다. 정삼각형 하나에서 시작한다.… Continue Reading 시어핀스키 삼각형 그리기
주의사항 인터넷 익스플로러(IE) 에서만 가능 파일명에 숫자와 영어 외의 다른 문자가 있으면 전송 불가능 파일명을 과제코드_학번으로 저장하여 업로드 할 것 FTP로 파일 전송과정 FTP 를 클릭하면 다음과 같은 창이 실행된다. 나타난 창에서 [보기] – [파일 탐색기에서 FTP 사이트 열기] 메뉴를 순서대로 선택한다.([보기] 메뉴가 없으면 키보드의 Alt키를 누르면 나타남) 다음과 같은 새로운 창이… Continue Reading FTP로 파일 보내기(인터넷 익스플로러 사용)
주파수 영역처리(푸리에변환) C# 소스 코드 메뉴를 다음과 같이 추가한다. [주파수_FFT변환] 메뉴를 더블클릭한 후 private void 주파수FFT변환ToolStripMenuItem_Click() 함수를 추가한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
private void 주파수FFT변환ToolStripMenuItem_Click(object sender, EventArgs e) { Bitmap bmp = f_OpenBitmapFile(); if (bmp == null) return; byte[] data = f_getDataFromImage(bmp); ///////// Start Image Processing //////////////// if (bmp.PixelFormat != PixelFormat.Format8bppIndexed) { MessageBox.Show("8bit 색상 모델만 실행 가능합니다."); return; } complex_num[] fft = f_FFT_2D(data, bmp.Width, bmp.Height); byte[] newdata = f_FFT_toImage(fft, bmp.Width, bmp.Height); ///////// End Image Processing //////////////// Bitmap bmpResult = f_makeImageFromData(bmp.Width, bmp.Height, bmp.PixelFormat, newdata); f_drawImage(bmp, bmpResult); } |
복소수를 저장할 클래스를 선언한다.
1 2 3 4 5 |
class complex_num { public double re; public double im; } |
reverse_bit_order() 함수를 생성한다. 최하위 비트부터 최상위비트 순으로 비트 순서를 거꾸로 변경하는 함수 예) 10101100 => 00110101
1 2 3 4 5 6 7 8 9 10 11 12 |
private int reverse_bit_order(int index, int log2N) { int b, r, k; r = 0; for (k = 0; k < log2N; k++) { b = (index & (1 << k)) >> k; r = (r << 1) | b; } return r; } |
shuffle_data() 함수를 생성한다. 복소수 x의 앞… Continue Reading 주파수 영역처리 C# 소스 코드(푸리에변환)
워핑과 모핑 부분 소스 코드 메뉴를 다음과 같이 추가한다. [기하_워핑] 메뉴를 더블클릭한 후 private void 기하워핑ToolStripMenuItem_Click() 함수 위쪽에 f_Warping 함수를 추가한다.
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
private byte[] f_Warping(int width, int height, control_line[] source_lines, control_line[] dest_lines, byte[] data) { int depth = data.Length / width / height; byte[] newdata = new byte[data.Length]; double u; // 수직 교차점의 위치 double h; // 제어선으로부터 픽셀의 수직 변위 double d; // 제어선과 픽셀 사이의 거리 double tx, ty; // 결과영상 픽셀에 대응되는 입력 영상 픽셀 사이의 변위의 합 double xp, yp; // 각 제어선에 대해 계산된 입력 영상의 대응되는 픽셀 위치 double weight; // 각 제어선의 가중치 double totalWeight; // 가중치의 합 double a = 0.001; double b = 2.0; double p = 0.75; int x1, x2, y1, y2; int src_x1, src_y1, src_x2, src_y2; double src_line_length, dest_line_length; int num_lines = 23; // 제어선의 수 int line; int x, y; int source_x, source_y; int last_row, last_col; last_row = height - 1; last_col = width - 1; // 출력 영상의 각 픽셀에 대하여 for (y = 0; y < height; y++) { for (x = 0; x < width; x++) { totalWeight = 0.0; tx = 0.0; ty = 0.0; // 각 제어선에 대하여 for (line = 0; line < num_lines; line++) { x1 = dest_lines[line].Px; y1 = dest_lines[line].Py; x2 = dest_lines[line].Qx; y2 = dest_lines[line].Qy; dest_line_length = Math.Sqrt((float)(x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); // 수직교차점의 위치 및 픽셀의 수직 변위 계산 u = (double)((x - x1) * (x2 - x1) + (y - y1) * (y2 - y1)) / (double)((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); h = (double)((y - y1) * (x2 - x1) - (x - x1) * (y2 - y1)) / dest_line_length; // 제어선과 픽셀 사이의 거리 계산 if (u < 0) d = Math.Sqrt((float)(x - x1) * (x - x1) + (y - y1) * (y - y1)); else if (u > 1) d = Math.Sqrt((float)(x - x2) * (x - x2) + (y - y2) * (y - y2)); else d = Math.Abs(h); src_x1 = source_lines[line].Px; src_y1 = source_lines[line].Py; src_x2 = source_lines[line].Qx; src_y2 = source_lines[line].Qy; src_line_length = Math.Sqrt((float)(src_x2 - src_x1) * (src_x2 - src_x1) + (src_y2 - src_y1) * (src_y2 - src_y1)); // 입력 영상에서의 대응 픽셀 위치 계산 xp = src_x1 + u * (src_x2 - src_x1) - h * (src_y2 - src_y1) / src_line_length; yp = src_y1 + u * (src_y2 - src_y1) + h * (src_x2 - src_x1) / src_line_length; // 제어선에 대한 가중치 계산 weight = Math.Pow((Math.Pow((double)(dest_line_length), p) / (a + d)), b); // 대응 픽셀과의 변위 계산 tx += (xp - x) * weight; ty += (yp - y) * weight; totalWeight += weight; } source_x = x + (int)(tx / totalWeight + 0.5); source_y = y + (int)(ty / totalWeight + 0.5); // 영상의 경계를 벗어나는지 검사 if (source_x < 0) source_x = 0; if (source_x > last_col) source_x = last_col; if (source_y < 0) source_y = 0; if (source_y > last_row) source_y = last_row; for (int dt = 0; dt < depth; dt++) { newdata[(y * width + x) * depth + dt] = data[(source_y * width + source_x) * depth + dt]; } } } return newdata; } |
control_line 클래스를 추가한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class control_line { public int Px; public int Py; public int Qx; public int Qy; public control_line(int px, int py, int qx, int qy) { this.Px = px; this.Py = py; this.Qx = qx; this.Qy = qy; } } |
[기하_워핑] 메뉴를 더블클릭한 후 다음코드를 완성한다.
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 |
///////// Start Image Processing //////////////// int[] source_init = new int[]{116,7,207,5, 34,109,90,21, 55,249,30,128, 118,320,65,261, 123,321,171,321, 179,319,240,264, 247,251,282,135, 281,114,228,8, 78,106,123,109, 187,115,235,114, 72,142,99,128, 74,150,122,154, 108,127,123,146, 182,152,213,132, 183,159,229,157, 219,131,240,154, 80,246,117,212, 127,222,146,223, 154,227,174,221, 228,252,183,213, 114,255,186,257, 109,258,143,277, 152,278,190,262}; int[] dest_init = new int[] {120,8,200,6, 12,93,96,16, 74,271,16,110, 126,336,96,290, 142,337,181,335, 192,335,232,280, 244,259,288,108, 285,92,212,13, 96,135,136,118, 194,119,223,125, 105,145,124,134, 110,146,138,151, 131,133,139,146, 188,146,198,134, 189,153,218,146, 204,133,221,140, 91,268,122,202, 149,206,159,209, 170,209,181,204, 235,265,208,199, 121,280,205,284, 112,286,160,301, 166,301,214,287}; control_line[] source_lines = new control_line[23]; control_line[] dest_lines = new control_line[23]; for (int i = 0; i < source_lines.Length; i++) { source_lines[i] = new control_line(source_init[i * 4], source_init[i * 4 + 1], source_init[i * 4 + 2], source_init[i * 4 + 3]); dest_lines[i] = new control_line(dest_init[i * 4], dest_init[i * 4 + 1], dest_init[i * 4 + 2], dest_init[i * 4 + 3]); } byte[] newdata = f_Warping(bmp.Width, bmp.Height, source_lines, dest_lines, data); ///////// End Image Processing //////////////// |
[기하_모핑] 메뉴를 더블클릭한 후 다음 코드를 완성한다.
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
private void 기하모핑ToolStripMenuItem_Click(object sender, EventArgs e) { Bitmap bmp = f_OpenBitmapFile(); if (bmp == null) return; PixelFormat pixelFormat = bmp.PixelFormat; byte[] data = f_getDataFromImage(bmp); Bitmap bmp2 = f_OpenBitmapFile(); if (bmp2 == null) return; byte[] data2 = f_getDataFromImage(bmp2); ///////// Start Image Processing //////////////// int[] source_init = new int[]{116,7,207,5, 34,109,90,21, 55,249,30,128, 118,320,65,261, 123,321,171,321, 179,319,240,264, 247,251,282,135, 281,114,228,8, 78,106,123,109, 187,115,235,114, 72,142,99,128, 74,150,122,154, 108,127,123,146, 182,152,213,132, 183,159,229,157, 219,131,240,154, 80,246,117,212, 127,222,146,223, 154,227,174,221, 228,252,183,213, 114,255,186,257, 109,258,143,277, 152,278,190,262}; int[] dest_init = new int[] {120,8,200,6, 12,93,96,16, 74,271,16,110, 126,336,96,290, 142,337,181,335, 192,335,232,280, 244,259,288,108, 285,92,212,13, 96,135,136,118, 194,119,223,125, 105,145,124,134, 110,146,138,151, 131,133,139,146, 188,146,198,134, 189,153,218,146, 204,133,221,140, 91,268,122,202, 149,206,159,209, 170,209,181,204, 235,265,208,199, 121,280,205,284, 112,286,160,301, 166,301,214,287}; control_line[] source_lines = new control_line[23]; control_line[] dest_lines = new control_line[23]; for (int i = 0; i < source_lines.Length; i++) { source_lines[i] = new control_line(source_init[i * 4], source_init[i * 4 + 1], source_init[i * 4 + 2], source_init[i * 4 + 3]); dest_lines[i] = new control_line(dest_init[i * 4], dest_init[i * 4 + 1], dest_init[i * 4 + 2], dest_init[i * 4 + 3]); } int NUM_FRAMES = 10; control_line[] warp_lines = new control_line[23]; for (int i = 0; i < warp_lines.Length; i++) { warp_lines[i] = new control_line(0, 0, 0, 0); } Bitmap[] bmpResult = new Bitmap[NUM_FRAMES + 1]; for (int frame = 0; frame <= NUM_FRAMES; frame++) { double fweight = (double)frame / NUM_FRAMES; for (int i = 0; i < warp_lines.Length; i++) { warp_lines[i].Px = (int)(source_lines[i].Px + (dest_lines[i].Px - source_lines[i].Px) * fweight); warp_lines[i].Py = (int)(source_lines[i].Py + (dest_lines[i].Py - source_lines[i].Py) * fweight); warp_lines[i].Qx = (int)(source_lines[i].Qx + (dest_lines[i].Qx - source_lines[i].Qx) * fweight); warp_lines[i].Qy = (int)(source_lines[i].Qy + (dest_lines[i].Qy - source_lines[i].Qy) * fweight); } byte[] newdata = f_Warping(bmp.Width, bmp.Height, source_lines, warp_lines, data); byte[] newdata2 = f_Warping(bmp.Width, bmp.Height, dest_lines, warp_lines, data2); for (int i = 0; i < newdata.Length; i++) { int val = (int)((1 - fweight) * newdata[i] + fweight * newdata2[i]); if (val > 255) val = 255; if (val < 0) val = 0; newdata[i] = (byte)val; } bmpResult[frame] = f_makeImageFromData(bmp.Width, bmp.Height, pixelFormat, newdata); } ///////// End Image Processing //////////////// for (int frame = 0; frame <= NUM_FRAMES; frame++) { f_drawImage(bmp, bmp2, bmpResult[frame]); System.Threading.Thread.Sleep(1000); } } |