[CPP|MFC] 감마보정 데모

프로그래밍 2008/08/15 13:52
감마보정에 대해 간단하게 테스트 해 볼 수 있는 MFC 프로그램. 매우 간단한 대화상자 응용프로그램이다. 웹프로그래밍같은 걸 잘 몰라서, 그나마 익숙한 비주얼C 6.0 mfc로 짰다. 빨리 대충 짠 거라 버그가 많이 있을 수 있다. 소스도 올려 놓으니, 더 개선할 사람은 개선하라. 소스는 자유롭게 사용할 수 있다. 최초저자를 밝혀줘서 피드백 받을 수 있게 해주면 고맙고.

대화상자위에서 마우스 휠을 돌리면, 감마값이 바뀌면서 바뀐 감마에 대한 그레이스케일과 그래프를 보여준다. 그래프의 위아래라던가, 어느 축이 무얼 나타내는지는 소스를 보고 파악하시라. 딱 보면 알겠지만, 일반적인 수학 그래프랑 원점과 x, y 축의 방향이 다르다. 따로 윈도우 그리기 좌표계에서 변환을 하지 않아서 그렇다.

사용자 삽입 이미지

Gamma_Corr1002.zip

소스코드 + 실행파일


이올린에 북마크하기(0) 이올린에 추천하기(0)
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 0 : Comment 0

[Py|수치해석] 무식하게 DFT

프로그래밍 2008/08/14 01:13
DFT (discrete fourier transformation), FFT가 이것보다 효율적인 거란 말이지. 알았어 다음 포스팅은 그거다. DFT의 정의는 http://en.wikipedia.org/wiki/Fast_Fourier_transform 에서.

#!/usr/bin/env python

### DFT Bruteforce

### didn't check if this coding gives the right answer. I just followed the
### definition.

### by DwYoon

N_DATA = 1024
#N_DATA = 16

import cmath
import random

# populate raw data using random generator
# you can change this to use your own data set
x = []
for i in xrange(N_DATA):
        x.append(random.random())

## Following is the definition of discrete fourier transformation
## essentially, it approximates frequency of the give data.

##       N-1          /   2 pi i      \
## X   = sum x   exp |  - ------- n k  |
##   k   n=0   n      \     N         /

## What computer is good at is computing, don't think much, we just follow
## the given definition.

X = []
for k in xrange(N_DATA):
        Xk = 0 # initialize Xk
        # do summation over n = [ 0, ..., N-1 ]
        for n in xrange(N_DATA):
                Xk += (x[n] * cmath.exp( - 2*cmath.pi*1j*n*k/N_DATA ) )
                #                      /   2 pi i      \
                #      x          exp |  - ------- n k  |
                #        n             \     N         /
        X.append(Xk)

# check the result. Do beutify this to see the meaning clearly.
print x
print "-------------------------"
print X

이올린에 북마크하기(0) 이올린에 추천하기(0)
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 0 : Comment 0

[CPP|MFC] 초간단 Blob 효과

프로그래밍 2008/05/13 20:08
효과가 매우 안 좋다. 기냥 무식하게 모든 픽셀에 대한 함수값을 계산해서 색깔을 지정하므로 속도도 엄청나게 느리다. 코드프로젝트의 기사 보고 한번 해 봤다. 물론 내 것이 훨씬 성능이 좋지 않다. 각각의 공이 웅까웅까 움직이는 효과도 없고...

사용자 삽입 이미지


Blob.rar

MFC, VC6.0 소스. 초간단, 초초초기초.


이올린에 북마크하기(0) 이올린에 추천하기(0)
크리에이티브 커먼즈 라이선스
Creative Commons License
tags : Blob, MFC, 그래픽
Trackback 0 : Comment 0

[CPP|MFC] 선분으로 단어 그려 돌리기

프로그래밍 2008/05/11 03:33

네덜란드 디자이너 크리스티나 포스탐(Christina Postam, 로마자는 여기서, 발음은 대충 읽은 것)의 미친시계에 대한 포스팅에서 플래시를 보고 대략 (한글로도) 할 수 있을 것 같아서, 기본 원리만 간단하게 MFC로 만들어 봤다.

내가 만든 건 대화창 바닥에 마우스로 선분을 몇 개 그려서 글자든 뭐든 그림을 그리고, rotate 버튼을 누르면 각각의 선분이 시계바늘처럼 돌아가는 것. MFC라 예쁘진 않다.

프로그램 캡쳐이미지, 각 선분이 돌아간다

Clock.zip

VC6.0용 소스.

VC6.0용 소스. 소스의 라이센스는 블로그의 사용 라이센스와 동일함. 출처명시.

이올린에 북마크하기(0) 이올린에 추천하기(0)
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 0 : Comment 0

[FORTRAN77|초급] exp 함수 테일러급수

프로그래밍/숙제도둑질 2008/05/10 18:58

exp(x) 의 테일러 급수를 이용하여, exp(5)의 값을 구하는 기초기초적인 프로그래밍. 포트란 77로 짠 소스이고, 문제에서는 20번째 항까지 계산하라고 한다. 포트란에서 인자 받고 하는 걸 몰라서 소스에 박혀있다.

간단한 거지만 살짝 설명하면, TERM이 더할 각 항이고, 각 항과 다음 항 하고의 관계가 아주 예뻐서 프로그래밍 숙제로 나오기 아주 좋다.


PROGRAM Exp
SUM = 0
X = 5
TERM = 1
SUM = SUM + TERM
DO 1, I = 1, 20
TERM = TERM * X / I
SUM = SUM + TERM
1 CONTINUE
PRINT *, SUM
STOP
END

빨간 색으로 된 부분은 스페이스가 아니라 탭으로 들여쓰기 한 걸 구분해 주기 위해 빔에서 표시된 것. DO 루프의 끝을 1이라는 표지와 CONTINUE 문에 나오는 첫 줄의 1이라는 표지가 일치해야 하는 것 같다. 포트란 공부해 본 게 아니고, 예전에 짰던 코드 보고 다시 짠거라 맞는지 모르겠다. 아무튼 cygwin환경에서 g77 로 컴파일해서 돌려본 결과는 잘 나왔다.

이올린에 북마크하기(0) 이올린에 추천하기(0)
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 1 : Comment 0

[CPP|MFC] 중력장의 인공위성 궤도

프로그래밍 2008/04/21 13:46
사용자 삽입 이미지
원주 근처에서 클릭하면 초기속도 지정 시작. launch 버튼은 아무짓도 안한다.

이올린에 북마크하기(0) 이올린에 추천하기(0)
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 0 : Comment 0

[C|MFC|수치해석] 라그랑지 다항식

프로그래밍/숙제도둑질 2008/04/14 18:38
라그랑지 다항식. 주어진 n 개의 점들을 지나는 n-1차 다항식을 구하는 것. 공식은 위키백과 영문판을 참고했다.

#include <stdio.h>
#include <math.h>

typedef struct _data {
double x;
double y;
} DATA;

double l(DATA *dataList, int nData, int j, double x)
{
double prod = 1;

for(int i=0; i<nData; i++)
{
if(i==j)
continue;
prod *= ((x-dataList[i].x)/(dataList[j].x -dataList[i].x));
}

return prod;
}

double lagrange(DATA *dataList, int nData, double x)
{
// L(x) = sum (j=0 to k) y_j x l_j(x)
//
// x -x_i
// where l_j(x) = prod (i=0, i!=j to k) -----
// x_j-x_i
double sum = 0;

for(int j=0; j<nData; j++)
{
sum += dataList[j].y * l(dataList, nData, j, x);
}
return sum;
}

int main()
{
DATA data[4] = {
{ 0, 1 },
{ 1, 2.7183 },
{ 2, 7.3891 },
{ 3, 20.0855}
};
int k = 4;
double xs[4] = {1.5, 2.5, 3.5, 4.5 };

for(int i=0; i<4; i++)
{
printf("f_l(%lf) = %lf\n", xs[i], lagrange(data, 4, xs[i]));
}

return 0;
}

mfc로 짜본 것.

사용자 삽입 이미지

소스는

LagrangePoly.rar

라그랑지 mfc 소스.

여기. 마음껏 고치라.

이올린에 북마크하기(0) 이올린에 추천하기(0)
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 1 : Comment 0

[비주얼베이직|초급] 별찍기 변형

프로그래밍/숙제도둑질 2008/04/14 08:47
목표는 이거.
     *
***
*****
*******
*********
이렇게 나오는 소스는 이거. 변수명을 한글로 썼다. 변수명을 보면 어떤 의도인지 알 수 있을 것이다.

Module Module1

Sub Main()
Dim 줄수 As Integer
Dim 칸수 As Integer
Dim 줄수최대값 As Integer
Dim 갯수 As Integer

줄수최대값 = 5

For 줄수 = 1 To 줄수최대값

Dim 빈칸수 As Integer
빈칸수 = 줄수최대값 - 줄수 + 1

For 칸수 = 1 To 빈칸수
Console.Write(" ")
Next

Dim 별갯수 As Integer
별갯수 = 2 * 줄수 - 1

For 갯수 = 1 To 별갯수
Console.Write("*")
Next

Console.WriteLine()
Next
Console.ReadLine()
End Sub

End Module

이올린에 북마크하기(0) 이올린에 추천하기(0)
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 1 : Comment 0

[Py|초급] 달팽이 이차원배열, 나머지연산과 논리연산

프로그래밍/숙제도둑질 2008/04/05 00:52

#!/usr/bin/env python

# Daum sinjisik
# Author : DwYoon

##################################################################
print "---------------------"
for i in xrange(12):
    for j in xrange(12):
        print (((i+2)/2)%2)^(((j)/2)%2),
    print
##################################################################
print "---------------------"
for i in xrange(12):
    for j in xrange(12):
        print (((i+3)/3)%2)^(((j)/3)%2),
    print
##################################################################
print "---------------------"
array = [ [ 0 for i in xrange(6) ] for j in xrange(6) ]
# for i in xrange(6):
#   print array[i]

n = 1
x, y = 0, 0
v = 1, 0
array[y][x] = n
while [ x, y ] !=  [ 0, 1 ]:
    if (x, y) == (5, 0):
        v = 0, 1
    elif (x, y) == (5, 5):
        v = -1, 0
    elif (x, y) == (0, 5):
        v = 0, -1
    n+=1
    x, y = x+v[0], y+v[1]
    array[y][x] = n

for y in xrange(6):
    for x in xrange(6):
        print "%2d"%array[y][x],
    print
##################################################################
print "---------------------"
array = [ [ 0 for i in xrange(6) ] for j in xrange(6) ]
n = 1
x, y = 0, 0
v = 1, 0
array[y][x] = n
while 1:
    x, y = x+v[0] , y+v[1]
    if x < 0 or x > 5 or y < 0 or y > 5 or array[y][x] != 0:
        x, y = x-v[0] , y-v[1]
        v = -v[1], v[0] # velocity vector +90 degree rotation
        x, y = x+v[0] , y+v[1]
    n+=1
    array[y][x] = n
    if n == 36:
        break
for y in xrange(6):
    for x in xrange(6):
        print "%2d"%array[y][x],
    print
결과는 아래와 같다.

---------------------
1 1 0 0 1 1 0 0 1 1 0 0
1 1 0 0 1 1 0 0 1 1 0 0
0 0 1 1 0 0 1 1 0 0 1 1
0 0 1 1 0 0 1 1 0 0 1 1
1 1 0 0 1 1 0 0 1 1 0 0
1 1 0 0 1 1 0 0 1 1 0 0
0 0 1 1 0 0 1 1 0 0 1 1
0 0 1 1 0 0 1 1 0 0 1 1
1 1 0 0 1 1 0 0 1 1 0 0
1 1 0 0 1 1 0 0 1 1 0 0
0 0 1 1 0 0 1 1 0 0 1 1
0 0 1 1 0 0 1 1 0 0 1 1
---------------------
1 1 1 0 0 0 1 1 1 0 0 0
1 1 1 0 0 0 1 1 1 0 0 0
1 1 1 0 0 0 1 1 1 0 0 0
0 0 0 1 1 1 0 0 0 1 1 1
0 0 0 1 1 1 0 0 0 1 1 1
0 0 0 1 1 1 0 0 0 1 1 1
1 1 1 0 0 0 1 1 1 0 0 0
1 1 1 0 0 0 1 1 1 0 0 0
1 1 1 0 0 0 1 1 1 0 0 0
0 0 0 1 1 1 0 0 0 1 1 1
0 0 0 1 1 1 0 0 0 1 1 1
0 0 0 1 1 1 0 0 0 1 1 1
---------------------
 1  2  3  4  5  6
20  0  0  0  0  7
19  0  0  0  0  8
18  0  0  0  0  9
17  0  0  0  0 10
16 15 14 13 12 11
---------------------
 1  2  3  4  5  6
20 21 22 23 24  7
19 32 33 34 25  8
18 31 36 35 26  9
17 30 29 28 27 10
16 15 14 13 12 11
이올린에 북마크하기(0) 이올린에 추천하기(0)
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 1 : Comment 0

[C#|초급] 성적입력 및 출력

프로그래밍/숙제도둑질 2008/03/31 00:47

using System;
using System.IO;

namespace 점수
{
class Program
{
private static string[] 이름 = new string[30];
private static int[,] 점수 = new int[30,5];
private static string[] 학점 = new string[30];
private static string[] 성적구분 = { "중간", "기말", "과제물", "출석" };
private static TextReader 콘솔입력 = Console.In;
private static TextWriter 콘솔출력 = Console.Out;

//###############
//# 여기가 시작 #
//###############
static void Main(string[] args)
{
점수입력받기();
점수출력하기();
}

static void 점수입력받기()
{

for (int i = 0; i < 30; i++)
{
콘솔출력.Write("이름을 입력하세요. : ");
이름[i] = 콘솔입력.ReadLine();
if (이름[i] == "")
break;
for (int j = 0; j < 4; j++)
{
콘솔출력.Write(이름[i] + "님의" + 성적구분[j] + " 성적을 입력하세요. ");
if (j == 0 || j == 1) 콘솔출력.Write("(30) : ");
else 콘솔출력.Write("(20) : ");

점수[i, j] = Convert.ToInt16(콘솔입력.ReadLine());
}
점수[i, 4] = 점수[i, 0] + 점수[i, 1] + 점수[i, 2] + 점수[i, 3]; // 합계

if (점수[i, 4] >= 90) 학점[i] = "수";
else if (점수[i, 4] >= 80) 학점[i] = "우";
else if (점수[i, 4] >= 70) 학점[i] = "미";
else if (점수[i, 4] >= 60) 학점[i] = "양";
else if (점수[i, 4] >= 50) 학점[i] = "가";
else 학점[i] = "낙제";

}

}

static void 점수출력하기()
{
콘솔출력.Write("이름\t");
for(int k = 0; k < 4; k++) 콘솔출력.Write(성적구분[k] + "\t");
콘솔출력.WriteLine("합계\t학점");

for (int i = 0; i < 30; i++)
{
if (이름[i] == "")
break;
콘솔출력.Write(이름[i] + "\t");
for (int k = 0; k < 5; k++) 콘솔출력.Write(점수[i,k] + "\t");
콘솔출력.WriteLine(학점[i]);
}
}

}
}

이올린에 북마크하기(0) 이올린에 추천하기(0)
크리에이티브 커먼즈 라이선스
Creative Commons License