블로그 이미지
.
속눈썹맨

공지사항

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

calendar

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

[CG Algorhtim]Midpoint circle algorithm

2006. 4. 6. 17:16 | Posted by 속눈썹맨

. 방법 1 : 원의 방정식에서 x값을 증가시키면서 y를 구하자.
  . 문제점
  . x가 원의 가장 왼쪽, 오른쪽 근처에서 원 위의 점들이 듬성듬성 찍힌다.
  . sqrt() 함수를 써야 한다. (느리다.)
  . y = yc +-sqrt(r^2-(x-xc)^2)

. 방법 2 : Polar coordinate를 이용하자.
  . 듬성듬성찍히는 문제를 해결
  . sin(), cos() 함수를 써야 한다. (느리다.) 
  . x = xc + rcos(theta)
  . y = yc + rsin(theta)

. 방법 3
  . 8-way symmetry를 이용하자.(x축 대칭, y축 대칭, y=x 대칭)
  2 x 2 x 2 = 8, 1/8, 45도만 계산하면 된다.
  . 북~북서쪽의 45도를 계산하자.(듬성듬성하지 않게)
  . Midpoint line algorithm을 응용하자.

void MidpointCircle ( int radius, int value )
{
  int   x, y;
  float d;

  x = 0;
  y = radius;
  d = 5.0 / 4 - radius;
  CirclePoints ( x, y, value );
 
  while ( y > x ) {
     if ( d < 0 ) {
        d = d + x * 2.0 + 3;
  ++x;
     }
     else {
        d = d + (x - y) * 2.0 + 5;
  ++x;
  --y;
     }
     CirclePoints ( x, y, value );
  }
}

. 방법 4
  . floating point 연산을 없애자

void MidpointCircle (int radius, int value )
{
  int x, y;
  int d;

  x = 0;
  y = radius;
  d = 1 - radius;
  CirclePoints ( x, y, value );
 
  while ( y > x ) {
     if ( d < 0 ) {
        d = d + x * 2 + 3;
  ++x;
     }
     else {
        d += (x - y) * 2 + 5;
  ++x;
  --y;
     }
     CirclePoints ( x, y, value );
  }
}

. 방법 5
  . loop 내의 곱셈을 없애자.
  . Second Order Differences
  . Key idea: Just as we calculate x and y incrementally, we can also calculate deltaE and deltaSE incrementally
caseE:
  deltaEold = 2xp + 3
  deltaEnew = 2xp + 5
  deltaDeltaE  = 2
  deltaDeltaSE = ( 2(xp - 1) - 2yp + 5 ) - ( 2xp - 2yp + 5 )
               = 2
caseSE:
  deltaDeltaE  = (2xp + 5) - (2xp + 3)
               = 2
  deltaDeltaSE = ( 2(xp + 1) - 2(yp - 1) + 5 ) - ( 2xp - 2yp - 5 )
               = 4

Starting out:
  deltaEstart = 2 * 0 + 3 = 3
  deltaSEstart = 2 * 0 - 2 * R + 5
                  = 5 - 2R

void MidpointCircle ( int radius, int value )
{                  
  int     x, y, d, deltaE, deltaSE;

  x       = 0;
  y       = radius;
  d       = 1 - radius;
  deltaE  = 3;
  deltaSE = 5 - radius * 2;

  CirclePoints ( x, y, value );
 
  while ( y > x ) {
     if ( d < 0 ) { /* Select E */
        d       += deltaE;
  deltaE  += 2;
  deltaSE += 2;
  x       ++;
     }
     else {         /* Select SE */
        d       += deltaSE;
  deltaE  += 2;
  deltaSE += 4;
  x       ++;
  y       ++;
     }
     CirclePoints ( x, y, value );
  }
}

참고)
http://www.cs.umbc.edu/~rheingan/435/pages/res/gen-3.Circles-single-page-0.html

Midpoint Circle Algorithm
Implicit Equation
  f(x,y) = x^2 + y^2 - R^2
     f(x,y) > 0  =>  point outside circle
     f(x,y) < 0  =>  point inside circle

Midpoint Criteria
  f(M) = f(xp+1, yp - 1/2)
       = (xp + 1)^2 + (yp - 1/2)^2 - R^2

  d >= 0 choose SE
       next M: +1 in x, -1 in y

  d <  0 choose E
       next M: +1 in x

Book keeping
  deltaE  = dnew - dold
          = f(xp + 2, yp - 1/2) - f(xp+1, yp - 1/2)
  = 2xp + 3

  deltaSE = f(xp + 2, yp - 3/2) - f(xp+1, yp - 1/2)
      = 2xp - 2yp + 5

  dstart   = f(x0 + 1, y0 - 1/2) = f(1, R - 1/2)
        = 5/4 - R

void CirclePoints (float x, float y, int value)
{
  WritePixel (  x,  y, value );
  WritePixel (  y,  x, value );
  WritePixel (  y, -x, value );
  WritePixel (  x, -y, value );
  WritePixel ( -x, -y, value );
  WritePixel ( -y, -x, value );
  WritePixel ( -y,  x, value );
  WritePixel ( -x,  y, value );
}

[CG]circular arc 그리기

2006. 4. 1. 15:54 | Posted by 속눈썹맨
. (x1, y1), (x2, y2), (x3, y3) 세점이 주어졌을 때
(x1, y1) -> (x2, y2) -> (x3, y3)를 차례로 지나는 arc를 그린다.
. 점을 지나는 순서를 지켜야 한다는 사실이 중요하다. 그렇게 해야 unique하게 arc가 결정된다.
. 두 점과 원의 중심이 주어지는 경우에는 arc가 unique하게 결정되지 않고 시계방향과 반시계방향의 2개가 나온다.

// theta들은 360 degree(not radian)

// 두 각이 입력되었을 때 같은 각인지 검사한다.
bool isEqualDegree(const int theta1, const int theta2)
{
int diff = (theta1 - theta2) % 360;

if (diff == 0)
return true;

return false;
}

int arcDirectionTest(const int theta1, const int theta2, const int theta3)
{
// 시계방향으로 돌아야 할지, 반시계방향으로 돌아야 할지 test
// direction = 1 : 반시계방향
// direction = -1 : 시계방향
int direction = 1;

for (int theta_i = theta1; theta_i < 360 + theta1; theta_i++)
{
if (isEqualDegree(theta_i, theta3)) {
// theta2를 theta3보다 먼저 지나게 그려야 하므로
// 방향을 바꾸자.
direction = -1;
break;
}

if (isEqualDegree(theta_i, theta2)) {
// theta2를 theta3보다 먼저 지나고 있으므로 방향 유지
break;
}
}

return direction;
}

// arc 그리기
direction = arcDirectionTest(theta1, theta2, theta3);
int theta_i = theta1;

while(1)
{
if (theta_i >= 180) {
theta_i = -179;
}

if (theta_i <= -180) {
theta_i = 180
}
// -179 <= theta_i <= 180

glVertex3f(x0 + r * cos(theta_i) , y0 + r * sin(theta_i), 0);

if (isEqualDegree(theta_i, theta3))
break;

theta_i += direction
}

[CG]외접원 - Circumscribed Circle

2006. 4. 1. 15:23 | Posted by 속눈썹맨
외접원 구하기

// (x1, y1), (x2, y2), (x3, y3) 삼각형의 세 꼭지점
// (x0, y0) - 외접원의 중심
// r - 외접원의 반지름

void circumscribedCircle(const float x1, const float y1, const float x2, const float y2, const float x3, const float y3, float* x0, float* y0, float r)
{
// (x1, y1), (x2, y2), (x3, y3) 세 점 중 2개 이상이 같거나
// 세 점이 일직선 상에 있으면 안된다.

// divide by 0 조건도 피해야 한다.
// 1. y1 - y2 = 0
// 2. y1 - y2 = 0
// 3. (x1 - x3 - (y1 - y3) * (x1 - x2) / (y1 - y2)) = 0
// 4. x1 - x2 = 0

*x0 = (pow(y1, 2) + pow(x1, 2) - pow(y3, 2) - pow(x3, 2) - (y1 - y3) * (pow(y1, 2) + pow(x1, 2) - pow(y2, 2) - pow(x2, 2)) / (y1 - y2)) / 2 / (x1 - x3 - (y1 - y3) * (x1 - x2) / (y1 - y2));
*y0 = (pow(y1, 2) + pow(x1, 2) - pow(y2, 2) - pow(x2, 2) - 2 * x0 * (x1 - x2)) / (y1 - y2) / 2;
*r = sqrt(pow(x3 - x0, 2) + pow(y3 - y0, 2));
}

Atan2 - Arc tangent

2006. 4. 1. 15:22 | Posted by 속눈썹맨
atan2(y, x);
좌표상 원점(0, 0)을 기준으로 (x, y)가 x축가 이루는 각 theta를 구해준다.
x-y coordinate를 polar coordinate로 바꿀 때나 원을 그릴 때 사용한다.

. atan(x) 대신 atan2(y, x)를 쓰는 이유
x가 0일 때 분모가 0이 되므로 atan(x)로는 모든 각을 계산할 수가 없다.

(x, y)
. 1사분면일때 : 0 ~ Pi/2 (0 ~ 1.5708)
. 2사분면일때 : Pi/2 ~ Pi (0 ~ 3.14159)
. 3사분면일때 : -Pi ~ -Pi/2 (-3.14159 ~ -1.5708)
. 4사분면일때 : -Pi/2 ~ 0 (-1.5708 ~ 0)
. (x, y)가 원점을 기준으로 반시계방향으로 돌 때
atan2(y, x)의 값은 2사분면에서 3사분면으로 넘어가는 순간 -2Pi가 되고
나머지 구간에서는 항상 증가한다.

. atan2(y, x) 컴파일시 에러가 날때
. 오버로드된 함수에 대한 호출이 모호합니다.
=> y, x의 type을 float나 double로 통일해준다.
int type으로 하거나 float, double을 섞으면 안된다.

. 예제 프로그램
#include
#include
using namespace std;

void print(int x, int y)
{
cout << "atan2(" << y << ", " << x << ") : " << atan2(y, x) << endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
print(0, 0); // 0
print(10, 0); // 0
print(10, 10); // Pi/4
print(0, 10); // Pi/2
print(-10, 10); // 3*Pi/4
print(-10, 0); // Pi
print(-10, -10); // -3*Pi/4
print(0, -10); // -Pi/2
print(10, -10); // -Pi/4

return 0;
}

. radian(0~Pi)을 degree(0~180)로 바꾸기
0 -> 0
Pi/4 -> 45
Pi/2 -> 90
Pi -> 180

즉) radian * 180 / Pi = degree

OpenGL - Tessellation

2006. 4. 1. 03:18 | Posted by 속눈썹맨
nonconvex polygon을 triangles로 break down하여
convex polygons(Tessellation)으로 만든다.

. Nonconvex polygon
. concave - 180도 이상의 각이 있음.
. complex - hole 같은 것이 있음.

. Contour(외곽선)
. convec, concave polygon의 경우 1개 이상있음.
. hole 1개당 contour 1개가 추가됨.
. Nested Contour - holes 안에 holes가 있음.

. OpenGL에서 Polygon을 그릴 때 convex가 아닌 경우(concave) 모양이 이상하게 그려질 수가 있다.
. OpenGL은 performance를 위해 입력이 convex임을 가정하기 때문이다. 따라서 tessellation을 해서 concave를 convex 여러개로 나눈다.

예제)
void CALLBACK tessVertexCallback(GLvoid *vertex)
{
GLdouble *ptr;
ptr = (GLdouble *) vertex;
glVertex3dv((GLdouble *) ptr);
// glColor3dv((GLdouble *) ptr + 3);

cout << "vertex[0] : " << ptr[0] << endl;
cout << "vertex[1] : " << ptr[1] << endl;
cout << "vertex[2] : " << ptr[2] << endl;
}

void CALLBACK tessCombineCallback(GLdouble coords[3], GLdouble *vertex_data[4],
GLfloat weight[4], GLdouble **dataOut)
{
GLdouble *vertex;
vertex = new GLdouble[6];
vertex[0] = coords[0];
vertex[1] = coords[1];
vertex[2] = coords[2];

for (int i = 3; i < 6; i++)
{
// vertex에 color 값을 주지 않았다면
// 메모리 오류가 난다.
// 그 때는 vertex[i] = 0; 이라고 적당히 적어주자.
vertex[i] = weight[0] * vertex_data[0][i] +
weight[1] * vertex_data[1][i] +
weight[2] * vertex_data[2][i] +
weight[3] * vertex_data[3][i];
}
*dataOut = vertex;

}

void CALLBACK tessError(GLenum error)
{
const GLubyte* szError = gluErrorString(error);

cerr << "tessError : " << szError << endl;
}

GLUtesselator *tobj;
tobj = gluNewTess();
gluTessCallback(tobj, GLU_TESS_VERTEX, (GLvoid(__stdcall*) ())&tessVertexCallback);
gluTessCallback(tobj, GLU_TESS_COMBINE, (GLvoid(__stdcall*) ())&tessCombineCallback);
gluTessCallback(tobj, GLU_TESS_BEGIN, (GLvoid(__stdcall*) ())&glBegin);
gluTessCallback(tobj, GLU_TESS_END, (GLvoid(__stdcall*) ())&glEnd);
gluTessCallback(tobj, GLU_TESS_ERROR, (GLvoid(__stdcall*) ())&tessError);

gluTessBeginPolygon(tobj, NULL);
gluTessBeginContour(tobj);

for(적절히 i의 loop를 돌면 됨)
{
gluTessVertex(tobj, polygon2[i], polygon2[i]);
++i;
}

gluTessEndContour(tobj);
gluTessEndPolygon(tobj);
gluDeleteTess(tobj);

delete polygon2를 지움.

. 아무 것도 찍지 않을 때.
. 값을 잘 넣었는 지 확인
. error callback을 등록
. callback들에서 어느 vertex를 이용해 나눴는 지 출력해본다.

. combine callback을 등록하지 않을 때 나는 에러 메시지
: Need combine callback

. combine callback이 불리는 경우 오목한 정도가 심해서 나누려면 새로운 vertex가 필요할 때

. callback 함수 type casting
. Visual Studio 2003 .NET의 경우 위 처럼 적어줘야 한다.
책에서 다른 방식으로 적는 경우가 있는 데, 컴파일 에러(타입 오류)가 난다.

. callback 함수는 일반  function이거나 state member function 이어야만 한다.
  non-static member function일 때는 callback으로 등록할 수 없다.
  따라서 global variable 등을 동원하는 다른 꽁수를 써야 한다.

참고)
OpenGL Super Bible P.508
http://www.flipcode.com/articles/article_tesselating.shtml
http://www.songho.ca/opengl/gl_tessellation.html

[강의필기]E-business 전략 - 2006.3.30

2006. 3. 30. 21:47 | Posted by 속눈썹맨
. 기본을 이야기하자(수식어 빼고 일단 기술적으로 basic하게)
. Internet - TCP/IP를 지키는 장비들의 모임
분산적인 특성을 가진다.
. Web - HTTP위에 HTML이라는 문서를 보내는 서버들의 모임
중앙집중(웹서버)인 특성을 가진다.

. Web 증가 : 2000~2002년 정체기였다. (닷컴 버블 붕괴)
. Internet의 증가 : 꾸준히 증가했다.
. 웹서버는 늘리는 데 돈이 들지만 사용자는 추가비용이 들지 않는 다.

. Blog
. 신문이나 일기처럼 교육을 위해 강제로 읽고 쓸 필요도 있다.

. Naver
. 1998년부터 뉴스추가(Yahoo는 2000년에 뉴스추가)
. 이해진 사장이 그 때부터 신문사를 찾아다님
. 기획에서 외국을 앞서고 있다.
. 꾸준히 전략을 추구해나감.

. 주니어 네이버
. 야후 꾸러기와 함께 50:50 먹고 있으며, 꼬마들 숙제검색 등에 유용하다.
. 초등학생들에게는 디렉토리 서비스도 필요하다.

. OpenAPI
. 2006년 3월 Naver OpenAPI 하기는 했지만 그것이 자사에 도움이 되지는 않는 다. 반면 아마존의 OpenAPI는 자사 매출에 도움이 된다.

. Cyworld
. 1999년 - 인맥관리 사이트
. 2000년 - 인맥 파도타기
. 2001년 - 미니홈피 아직 없음, 클럽 중심
. 2002년 - 지금과 비슷하지만 클럽에 집착, 도토리 서비스 시작
(네오위즈는 아바타라는 수익모델을 세계 최초로 개발)
도토리가 미니홈피보다 먼저 나왔음.
. 2002년 12월 - 미니홈피 등장
SK로 넘어가면서 싸이월드 대박
. 2003년 - 사업성공, 현재의 UI가 됨
. Naver와 달리 adaptive하게 사용자의 요구를 수용

. SK Communications
. SK net's go + lycos + cyworld가 합쳐짐
. 이질적인 문화로 인해 cyworld 사람들이 naver로 옮김

. Nate - 통, 팀플 - nate와 cyworld는 따로 놀고 있다.

. 검색 - lock-in이 없지만 data가 많아서 하루 아침에 무너지지 않는 다.
. community - lock-in이 있지만 금방 무너질 수도 있다.
ex) freechal - 2주만에 무너졌다.

. cyworld의 새 수입모델
. 미니홈피 광고 상품소개(google adwords, adsense 비슷)
. CPC(cost per click) - 300원
. 광고 노출여부를 싸이 주인이 결정
. 1촌에 micro target광고 가능
. 싸이 주인과 이득을 share - 도토리로 줌
. allblog에서도 긍정적인 여론

. cyworld
. 모바일 SMS와는 다르다.
. 이것은 비실시간 messanger, communicator이다.
. Naver blog는 archive이다.

. 전용단말기
. 무조건 망하게 되어있다.

. Apple
. 업계의 유일한 독재기업 - 1인 독재와 그 시종들이 지배
하청도 없고 모두 in-house product

. MVNO - Mobile Virtual Network Operator
. Network Operator : 망사업자, KT, SKT 등.
. 망은 가지고 있지 않고 브랜드 자산을 통해 휴대폰이나 서비스를 팜.
. 한국에서는 아직 합법이 아니나 유럽, 미국에서는 실시되고 있음.
. 영국 - 버진 모바일
. 버진 - 인간의 쾌락에 관련된 모든 상품 판매
. 버진 메가 스토어
. 미국 - 월마트 쯤이 하면 될 듯.
. 한국 - 솔직히 브랜드가 막강한 기업이 별로 없다.

. 연료전지 - 휴대폰에 소주를 넣어도 돌아간다. (휴대폰과 함께 술을..)
. 음악서비스 - 1등 : itunes, 2등 : cyworld
. 개인화 - Yahoo가 제일 잘함.
. RSS - 미국인의 27%가 blog를 잘 이용함.

. 인기있는 블로그 소개
. http://totheno1.egloos.com/ - 다인의 편의점
. 구글에서 '편의점'이라고 치면 제일 먼저 나옴
. 매일 편의점 메뉴만 먹고 사는 사람.
. http://lgaim.egloos.com/ - 백금기사의 평범한 연구소 (만화 1위)
. http://lezhin.egloos.com/ - 생각이 없는 블로그 (성인 1위)

. Blog도 투자다. 개인 브랜드의 일종.

. VoIP -Skype
. 새롬 다이얼 패드와 거의 같은 기술
. 다이얼 패드가 실패한 이유
. 시대를 너무 앞섰다. 인터넷을 전화망으로 접속하는 시대에 그 위에서 다시 전화를 걸게 해준다는 것은 별 가치가 없다.(물론 국제 전화는 싸게 되겠지만, 대부분의 사람들은 시내 전화를 쓴다.)
. 이제는 다들 broadband를 쓰고 인터넷이 정액제이므로 VoIP가 의미가 있다.

. 공간의 distortion
. KTX와 internet은 공간을 disrotion한다. 서울역 -> 천안역 사이의 공간이 서울역 -> 의정부보다 가깝다. 서울 반대편에 사느니, 서로가 역 근처에 살면 더 가깝다.

. 설문조사
. 의미없는 짓이다. 고객은 본인도 본인이 원하는 것을 모른다.
. 노래방이 없던 시절, 지하 어두운 곳에서 모니터을 보면서 친구들과 소리지르는 서비스를 원하던 사람은 없었다.
. 의식이 아닌 무의식을 읽어야 한다.

. Jeff barr - Amazon API
. QBox - 음악 서비스
. 테크노 경영대학원 - 기술을 주로 다루는 기업의 문제를 다루는 곳, 기술보다 경영이 우세 (경영이 더 돈이 되므로 힘이 세다.)
. CT - 문화보다 기술의 우세가 점쳐짐 (KAIST background이므로)

. Skinner의 심리상자 이야기 - 심리학적으로 유명한 7가지 실험 소개
. 책은 사는 데, CD는 망한 이유는?
. 가수 뭘로 먹고 살까? CD 안팔림, CF, 팬클럽, 모바일 음원, cyworld
. 책임감 - 사람이 n명이 되면 책임감이 1/n이 된다.

Escherization

2006. 3. 30. 11:48 | Posted by 속눈썹맨
. M.C. Escher (Maurits Cornelis Escher)
Dutch graphic artist. 책 'Godel, escher, bach, '미학 오디세이'에 나오는 화가.

. Tessellation
동일한 모양을 이용해 틈이나 포개짐 없이 평면이나 공간을 완전하게 덮는 것

. Escherization
Escher의 그림처럼 plane을 tessellation해서 tiling함.
source S가 있을 때 최대한 적게 바꿔서 tiling되는 T로 만들어 붙이기.
http://www.cgl.uwaterloo.ca/~csk/projects/escherization/

. isohedral
. dihedral Escherization
. tiling two different shapes
. Aperiodic Escherization
. period가 없음.
. Non-Euclidean Escherization
. Escher의 작품
. Sky and water

미디어 미학 - 2006.3.24

2006. 3. 26. 10:47 | Posted by 속눈썹맨
. 예술은 아니지만 예술가들을 위한 사진을 찍음.
예술 사진은 아니지만 예술적인 모든 것을 찍으려고 함.
근대화 때문에 사라지는 것들에 대한 사진들
노출을 길게해서 사람들이 유령처럼 나옴.
(노출이 길어지면 aura가 생김.)
. 벤야민 - 막시스트가 되려고 했음 + 유태계의 랍비적 요소
생산력 + 생산관계, 벅적 정치적 상부구조.
하부구조는 빨리 변하나, 상부구조는 늦게 변한다. - cultural lag
. 창조성, 천재성, 영감 - 19세기 보수적 전통적 개념, 파시즘이 될 가능성이 있다.
. modernism의 미학을 만들겠다. - 실천적 목적을 가지고 쓰인 논문
. 전통적 미학 - 보수적 견해로 파시즘적 정치가 된다.
한스 제델마이어 - '중심의 상실' = 퇴폐로 빠짐.
중심 - 신, 신을 닮은 인간, 그것을 재현하는 것이 예술의 최고 목표.
예) 미켈란젤로 - 다비드 상
. 초현실주의 - 리비도, 광기, 인간 신체의 금속화(무기물화 해버림)
. 사실 대중도 징그러운 현대 미술은 별로 안 좋아하기는 한다.
. 나치 - 퇴폐 전시회(침을 뱉게 함) vs 대독일 전시회(나치적, 영웅적 그림), 히틀러를 성기사로 묘사
잡것들 vs 아리아인의 정신
. '기술복제 가능성 시대의 예술 작품'이 올바른 번역일 것임
reproduzierbarkeit - barkeit : 가능성
. 사실 과거에도 복제가 있었다.
. 그리스인의 주화(동전, coin) - 제우스 신상(좌상) 등.
. 로마 - 황제의 초상(동전)
. 중세 - 목판 - 최초의 bestseller(유럽 2만부 판매) + 종이 - 주로 그림
. 구텐베르크 - 금속활자 - 주로 text
. 중세의 책 - '복되게 사는 법' - 죽을 때 마지막 guide book.
. 사람이 죽을 때 저승으로 인도할 성직자가 부족해 짐.
. 일반인인 수도승도 성직자로 임명.
. 흑사병으로 너무 많은 사람이 죽음.(유럽인 2/3 사망)
성직자 부족(수요는 늘고, 공급은 부족)
. 100년 전 목판화 - 할아버지가 죽으면 집 정리를 위해 물건이 벼룩시장에 나옴.
. 예술복제 - 필사
. 기술복제 - 사진(손의 개입이 없음.)
. 초기 사진은 비싸나 사진이 싸져서 복제의 전면화(복제의 보편성)
. 녹음기 - 청각도 복제, 시각, 청각 일체가 복제됨
. 시청각 예술 - 예술의 거의 모든 것. (소리나 영상)
. 양적 변화 -> 질적 변화(복제가 원작의 변화를 가져옴)
. 에드가 드가 - 화가, 다른 화가와 시점이 다름, 위나 뒤에서 봄, 화가의 시점이 아닌 카메라의 시점.
계단을 내려오는 나그네, 크로노 포토그라피 - 연속 사진 촬영술
. photo montage
. 엔디 워홀의 'pop art'
. 플라톤 - 시뮬라르크, 이데아 -> 현실(1차 복제) -> 시뮬라르크(2차 복제)의 위계가 있다.
. 시뮬라르크의 반란 - 플라톤의 위계를 무너뜨림.
. 생산 패러다임(공장)에서 정보 패러다임(사진, 소리, 영상)으로 변화
. 2장
. 원작과 복제 - 유일 무이한 현존성(aura) - 지금, 여기(place)가 중요하다.
. 복제 - '지금, 여기'를 파괴하고 언제 어디서라도(ubiquitous, telepresence)
. 대부분 우리가 아닌 그리스 조각은 로마시대의 모작(imitation, 복제)이다.
. 물 속에 넣고 조금씩 꺼내면서 부분씩 그림.
. 모나리자도 루브르 전시는 가짜, 진짜는 저장고에 있다.
. camera - 인공적, 기계적 view
. 망원경, 현미경, 초고속촬영
ex) 물방울, 우유왕관
. paris 지하철 - 아르누보 - 현미경을 보고 그린 것
. 생물학자 헤켈 - 현미경보고 그리는 것이 취미.
. 공간과 시간을 벗어날 수 있다. - telepresence
. 음악회에 가지 않아도 언제나 들을 수 있다.

. 기술 발전의 추이
. 대한 늬우스 - 반공영화, 외국에서 벌어진 일이 눈앞에 나타남.
. 전국 동시 상영
. 영화마저도 거기가야 봄, 인터넷은 방에서 download 받아봄.
. 전축 - 음악을 듣기 위해 다방에 감, 다방죽돌이, 다방죽순이
. 워크맨(walkman)에 의해 다방이 밀림.
. mp3
. omnipresent(어디에나 있게), omniabsent(어디에도 없게, 작아서 안보이게)
. Aura의 파괴 - 결국은 원작마저 손상되게 된다. 이미 훌륭한 그림을 너무 많이 봐서 미술관에서도 감응이 줄어든다.
. 사물의 권위가 떨어진다. 유일물의 장인적 생산에서 대량생산으로 변함.

. 제 3장 - 미디어를 지각적으로 바라보게 된다.
. 오감도 사실 문화에 의해 짜여진 것이다.
. 독일 - 생마늘을 먹을 수 없다.
. 한국 아파트 - 벽지에 된장 냄새가 베어있다. (오래살면 또 안난다.)
. 한국식당 - 음식 먹는 소리가 매우 크다. (가청 범위가 독일과 다름)
. 문명이 발달하면 원거리 지각이 쇠퇴하고 근거리 지각이 나타난다.
. 일본 - 논리, 이성의 발달.
. 마사이족- 2Km 밖의 사람의 모습을 봄, 지각, 감각의 발달.
하지만 자신들 몸에서 나는 냄새는 맡지 못함.
. 현대인(특히 서양인) - 냄새를 잘 맡는 다.
. 밀집에 의해 히스테리 증가.(도시의 삶)

. 원근법도 code화되어 있어 변한다.
. 르네상스 - 인물의 전면 배치
. 바로크 - 인물의 측면, 후면 배치
. 빈(wein)학파
. 유물론적 이론 - 벤야민의 접근 방법
. '아무리 가까이 있어도 어떤 먼 것의 일회적 나타남'
. 거리(가까움, 먼)
. 일회성
. 왜 전화에 camera를 내장할까? 활자세대와 영상세대

. 움베르토 에코 - 러시아에서는 뚱뚱한 개와 마른 개가 있다.
파블로브 연구소에 가면 조건반사적 인간이 먹이를 준다.
. 화살표, van diagram, emoticon
. 쉼표, 마침표 이외 불가.
. 세대에 따라 욕구가 다르다.
. 체험의 고유성이 상실되고 있음 - 다들 그것을 볼 수 있음.
. 일회성과 지속성 -> 일시성과 반복성
. 시뮬라르크의 생산으로 바뀌어 간다.
. 모나리자 - 생산부터 지금까지의 역사가 연속성이 있다.
. 연속성이 없다면 위작이라는 의심을 받는 다.
. 전시회 플랑카드 - 이사할 때마다 벽이 심심하니 걸어둔다.
. 동질적(gleichartig = similitude) - 형제간의 닮음.(위계가 없다.)
. ressamblance : 원본과 복제의 관계 - 부모, 자식 관계.(위계가 있다.)
. 하이데거(Heideger) vs 벤야민(Benjamin)의 태도 차이
형이상학적 vs 대중적
aura보존 vs aura 파괴도 긍정, aura 파괴에 대한 입장
종교적(숭배), 보수적 vs 미학적(감상) - 종교적 제의의 흔적파괴(진보적)
place vs space
. 귀여니 - 몇 년 째 internet 작가 1위지만, 국문학자들은 싫어함,
작가의 복제로 생각함.
. 세인 - man, 일반인, 잡것들
. 진중권 - 미적관점
. 어머니 - 중교적 관점, 복제에대 예수님의 aura가 있다.(최후의 만찬 복제품)
. 그리스인 - 신을 목격하면 죽음, 그리스인은 신을 보고 조각을 만든 것이 아니라 조각을 만들어 신을 만들었다.
. 박물관 - 물건, 유적들이 context를 상실하고 미학적 관점만 남음.(Aura의 파괴)
. 종교적 - 르네상스 대부분이 교회의 위촉을 받음(패트런), 마법성, 종교성
. 예배가치 -> 전시가치 (종교적 기능 약화, 미적 기능만 남음.) -> 정치가치(혁명영화, 선동예술)
. Aura 파괴시 끝까지 남기 위해 버팀
. 신의 위치를 예술이 대신함(19세기, 유미주의), 신없이 aura만 가짐.
. 유미주의 - 예술을 위한 예술, 미의 절대화, 윤리 위에 미가 존재.
. 일본 - 윤리가 실패하면 미적화함.(독일 - 나치, 일본 2차대전 전쟁 책임)
. 순수, 참여 논쟁
. 서정주 - 순수
. 벤야민 - 참여

. 아방가르드 - 대부분 좌파적, 사실 정치적 좌파가 아니라 문화적 좌파
. ex) Picaso - 자신들도 자신이 정치적이라고 생각(자의식), 예술이 결국 사회에도 영향을 끼칠 것이다. 미학적 실험이 정치적 실험으로 이어질 것이다.
. 1934년 이전까지 예술가는 혁명이 해방이라 생각함.
. 유럽은 소련을 asia라고 비하함.
. 말레비치 - 검은 사각형, 현대 미술은 신성, 미를 추구하지 않음.
. 기능전환 - 브레이트
. 마틴루터 - 인쇄술의 사회적 impact
1. 복제
2. 번역 - 성경을 독일어(자국어)로 번역. 신성한 언어가 아닌 일반인이 쓰는 언어를 채택
. 벤야민 - '번역자의 과제', 번역은 일봉의 복제, 일용시는 원본이 아닌 번역본을 인용.
. 구약 - 히브리어, 70인역(실제로는 62명) - 모두 같은 내용을 번역해옴.
. 신약 - 헬라어(헬레니즘시대)
. 불가타 - 카톨릭의 정전, 헬라어 -> 라틴어 번역, 원본에 가깝다.
. 플라톤 - 번역을 하면 질이 떨어진다.
. 벤야민 - 번역을 하면서 신의 의미가 풍부해짐, 시뮬라르크 놀이에 의해 진리에 도달. (시뮬라르크 긍정)
ex) 빵 - brot, bread, panis, pain, 떡 (의미 - semantic field가 다르다.)
. 권력 - 누가 성격을 해석할 권리가 있는 가? 그가 신이고 나머지는 이단.
성직자 외의 일반신도도 성경을 읽게 됨.
. 구텐베르크 - text 복제
. 벤야민 - image 복제
. 초상사진 -> 텅빈사진(사진 aura의 몰락)
. 회화 vs 사진 = 연극 vs 영화
. 연극 배우 - 과장된 연기, 눈의 마주침(aura적 요소)
. 이중의 aura
1. 배역의 aura
2. 배우 자신의 aura
. 통일적 (막이 오르면 끝까지), 인격적
. 영화배우 - camera에 의해 시선차단, 지금 여기가 아닌 edit 후를 보게 됨.
. 편집적, 시간순이 아니다. 선형적이지 않고 공간적(location)
해외 로케를 하면 공간적으로 모음, 연기의 파편화(fragmentation)
aura를 가질 수 없다. 무정한 연기(외과의사가 환자를 보듯 냉정함)
. camera 앞의 강의 - feedback이 없고 눈을 뜨고 잔다. 기계적이다. 자동인형들(강의와 교감이 없는 알바생), 어색함
. TV강의와 일반강의는 다르다. - internet과 TV에서는 더 비판적이 된다. (수용자의 태도가 다름.)
. 조선일보 - 독자마당(aura의 파괴), 만만해진다. 반말을 함.
. 영화평론가 - 막강한 대중앞에서 사기치기 힘들다. 미술평론은 단지거는 사람이 없다.
. 씨네 21 - 한국에서 가장 진보적인 잡지, 진중권의 '유토피아, 디스토피아'
. 영화 배우의 사라짐 - 공허감, 유배, 인격이 없어짐, 연극배우와 달리 상황 control이 불가능하다.
. 자신의 모습을 시사회 전에 볼 수 없다. 과거의 나를 나중에 본다.
. 복제(영화) 앞에서 원본(배우)가 사라진다.
. 연극 - 기승전결
. 영화 - montage, 파편적
. 생산성격 변화(노동의 성격)
. 농경 - 자연적 흐름에 따른 전체적, 파종, 모내기, 추수, 탈곡 등.
. 현재 - 생산 노동 파편화, 찰리 채플린 - modern times, 전체 의미를 모르고 부분적인 일만 함.
. 미학적 의미 - 예술 전체의 원리
. 아리스토텔레스 - '시학' - 에피소드(하나의 사건)을 빼도 plot(이야기) 진해에 지장이 없으면 그것은 반드시 빠져야 한다. 부분과 전체의 유기적 사건(유기적 총체성), 에피소드 간에는 인과적 필연성이 있어야 한다. 합리적 - 반전에는 반드시 복선이 있어야 한다.(고전주의 미학), 삽화적 구성을 피해라. 아름다운 가상.
. 호메로스 서사시 - 구술문화 - 파편적, 샛길로 셈, 반복됨, 글은 반복이 안됨. 호메로스는 집단 창작일 수 있다. 유기적 정체성이 없고 삽화적
. Hypertext - 다시 삽화적으로 돌아감.
. 피카소 추상화, 콜라주 - 파편적, 현대 예술 전체는 montage이다.
. 소비에트 혁명영화 사람 - 영화는 사람을 비판적으로 만들고 사람들을 똑똑하게 만든다.
. Mass production - 사람들의 수용과 참여가 일어난다. 일상에 있는 사람이 출현, 인민 대중이 출현(중국, 소련)
. 서구 영화와 전함 '포템킨'의 차이 - 전함 ' 포템킨'에는 주인공이 없다. 등장인물 모두가 주인공
. 주인공 없는 영화는 만들기 쉽지 않다.
. 길가는 행인 모두가 주인공으로 상승할 수 있다.
. 필자와 독자의 구분이 차이가 없어짐 - 신문 독자 투고란, 인터넷 게시판
. 과거 - 필자와 독자는 신분적 관계
. 귀여니는 등단을 하지 않아싿.
. 오마이 뉴스 - 시민기자
. 조선일보 - 우리가 쓰면 권력이 된다.
. Blog가 기사가 됨.
. 죽음의 마라톤 - 기업이 사원에게 운동을 시킴(예 - 현대 계열사)
. '갑'판에서 나오고 배달판에서는 빠짐
. 공무원은 기자보다 internet이 무섭다. - 민주주의적 가능성

. 자기 표현 가능
. 루터 - 교황권의 권위 무시됨
. 이제 지식인이 무너지고 논객이 됨. 평등함.
. 배우는 자기 자신을 연출하는 민중이다.
. 이제 셀카를 찍어 가장 예쁜 각도로 찍음.
. 실제로는 더 상업적이 되버렸다. - 소비에트의 몽타주 이론과 다름.
. 비판적이면 즐기기 힘들다. 하지만 영화는 감상적 태도와 비판적 태도가 일치한다.
. 브레이트 - '서사극 이론' 관중의 몰입을 방해함. 계속 관중에게 말을 검, 극적 상황에 자꾸 태도를 취하게 함.
. 영화는 주체적, 비판적 수용이 가능하다. 영화, game에 들어가서 나오지 않음.(48시간 PC방 게임, 오타쿠들, game 중독증)
. 귄터 한더스 - 벤야민과 정반대

Numerical Analysis

2006. 3. 24. 01:18 | Posted by 속눈썹맨
. 시험 주의 사항

. 계산기
. 성능이 뛰어나면 좋다.
. Graph가 그려지면 좋다.
. 사용법을 잘 익힌다.
. exp
. sin, cos - radian mode로 변경
. 간단한 미적분이나 값의 성질을 알아야 한다.
. exp(0) = 1
. exp(n) > 1
. exp는 monotonous increasing function
. 답안은 영어로 작성
. 부호가 맞는 지 잘 따져본다.
. Ans key를 활용하면 변수 한 개짜리 iteration을 편하게 할 수 있다.

. pn = (an + bn)/2 = an + (bn - an) / 2
. Mathematically same.
. Numerically different.
. It's considering the round-off error

. bisection method
. 언제나 수렴한다.
. |p-p*| < |b-a|/(2^n)
. n : iteration 횟수
. p1 = (b-a)/2
. f(a) * f(b) < 0
. f(pi)의 sign만 check하면 된다.
. Graph를 잘 그리고 bisection method의 경우 sign만 잘 check하면 되지
참값을 구할 필요는 없다.
. 음수를 홀수가 곱하면 음수, 짝수개 곱하면 양수
. Graph로 봐서 명시적으로 음수, 양수가 나오는 경우가 있다.
. Boundary 내에 해가 홀수개 있어도 잘 수렴한다.
단, 어느 해에 수렴할 지는 알 수 없다.
. 중근 : multiple root
. 실근 : real root
. 허근 : imaginary root

. fixed point (= functional iteration)
. f(p) = p
. root-finding 문제로 바꿀 수 있다. (무수히 많은 방법이 가능)
. 가끔 다른 곳에 수렴하거나 발산하거나 값이 없기도 한다.(허수 등..)
. 수렴 속도 계산시 수렴때까지 주의깊게 살펴본다.
(가끔 순위가 바뀌기도 한다.)

. Newton's method (First Taylor series polynomial)
. Taylor series
. f(x) = f(x0) + (x - x0)f(x0) + (x - x0)^2/2!*f(x0) + ...
. f(x) = sigma(i = 0, n, (x-x0)^n/n!*f(x0)) + (x-x0)^(n+1)/(n+1)!*f(error(x0))
. pn = pn-1 - f(pn-1)/f'(pn-1)
. pn의 값은 (pn-1, f(pn-1))을 지나고 기울기가 f'(pn-1)인 직선의 x절편

. Secant method
. Newton's method에서 f'(x)가 계산하기 어려울 때 f'(x)만 이용
. f'(pn-1) = (f(pn-1) - f(pn-2))/((pn-1) - (pn-2))
. pn = pn-1 - f(pn-1)((pn-1) - (pn-2))/(f(pn-1) - f(pn-2))
. pn의 값은 (pn-1, f(pn-1))과 (pn-2, f(pn-2))을 지나는 직선의 x절편
. Newton's method보다 수렴이 느리다.

. Method of False Position
. Secant method를 계량하여 만든 것
. bisection method처럼 항상 입력하는 두 값의 부호가 반대라서
bracket이 되게 한다.
. bracket : f(pi) * f(pi+1) < 0
. Newton's method보다 수렴이 느리다.

. stopping criteria
. |pn - pn-1| < e
acctual error를 이용함.

. |pn - pn-1|/|pn| < e
scale에 상관없다.

. |f(pn)| < e
유연하게 정할 수 있으나 actual error를 알 수 없다.

. Interpolation
. Talyor Polynomial
. Point에 가까울 때만 exact
. Linear : Not smooth
. Lagrange Polynomial
. High order일 때 oscilllation이 심해짐.
. Osculating Polynomial : 모든 점을 지나고 derivative도 만족
. Hermite : f(x0), f'(x0) ... f(xn), f'(xn) => (2n + 1)th Polynomial
. Lagrange와 함께하는 식이 있지만 결국 어떻게든 n차 방정식을 만들면 장땡이다.
. Quadratic Spline : Piece-wise approach, f(x0), f(x1) ...
. Cubic Spline : f(x0), ... f(xn), S0, ..., Sn-1
. Free Boundary : f'(x0) = 0, f'(xn) = 0
. Clamped Boundary : P'(x0) = f'(x0), P'(xn) = f'(xn)

. Pseudo code
. INPUT : p0~pi(Initial estimation), N0(Maximum # of iterations), TOL(tolerance, e)
. OUTPUT : approximate solution or message of failure
. INPUT : n(number of data), data(n)
. OUTPUT : solution
. STEP statement ; statement ; statement.
. IF (condition) then . else .
. SET i = constant.
. SET i = i + 1. (Increment)

. Basic Calculus
. (a^x)' = (a^x)ln(a)
. f(g(x)) = f'(g(x))*g'(x)
. f(g(h(x))) = f'(g(h(x)))*g'(h(x))*h'(x)
. (sin(x))' = cos(x)
. (cos(x))' = -sin(x)
. (tan(x))' = (sec(x))^2
. (csc(x))' = -csx(x)*cot(x)
. (sec(x))' = sec(x)*tan(x)
. (cot(x))' = -(csc(x))^2
. (a^x)' = (a^x)*ln(a)
. (e^(a*x))' = ((e^x)^a)' = a*(e^x)^(a-1)*(e^x) = a*(e^x)
. (ln(x))' = 1/x
. (x^x)' = (ln(x)+1)*(x^x)
. (e^(f(x)))' = f'(x)*(e^(f(x)))

. 계산기 사용법
. calc를 이용하여 a~e, x, y 등의 변수를 식에 대입
. solver가 있다면 이용할 것
. 단점 - unique root 일때만 이용가능하다.

MFC OpenGL Cube 그리기 + Maya Control 기능

2006. 3. 21. 23:01 | Posted by 속눈썹맨
. MDI는 복잡하므로 SDI로 할 것.
. seperate window로 화면을 2개로 나눌 것.
. viewport를 2개 저장해 놓고 2D, 3D image를 잘 찍을 것.
. OpenGL을 2개 띄울 수 있는 지 찾아 볼 것.

. MSDN -> Search
키워드 : SDI MFC Opengl
CUBE Sample : Demonstrates an OpenGL Application

. 클래스 뷰 -> CCubeView -> 마우스 오른쪽 -> 속성
-> WM_MOUSEMOVE -> OnMouseMove

. 추가할 멤버변수
CCubeView Class의
float m_fPosX;
float m_fPosY;
float m_fZoom;
float m_fRotX;
float m_fRotY;
float m_fLastX;
float m_fLastY;
(Wizard를 안 써도 class view에 잘 추가된다.)

. 멤버함수 수정
OnMouseMove(UINT nFlags, CPoint point)
{
int diffX = (int)(point.x - m_fLastX);
int diffY = (int)(point.y - m_fLastY);
m_fLastX = (float)point.x;
m_fLastY = (float)point.y;

// Left mouse button
if (nFlags & MK_LBUTTON)
{
m_fRotX += (float)0.5f * diffY;

if ((m_fRotX > 360.0f) || (m_fRotX < -360.0f))
{
m_fRotX = 0.0f;
}

m_fRotY += (float)0.5f * diffX;

if ((m_fRotY > 360.0f) || (m_fRotY < -360.0f))
{
m_fRotY = 0.0f;
}
}

// Right mouse button
else if (nFlags & MK_RBUTTON)
{
m_fZoom -= (float)0.1f * diffY;
}

// Middle mouse button
else if (nFlags & MK_MBUTTON)
{
m_fPosX += (float)0.05f * diffX;
m_fPosY -= (float)0.05f * diffY;
}

OnDraw(NULL);
// 위 내용을 추가

// 원래 내용 유지
}

. 생성자에서 맴버 변수를 모두 0으로 초기화

. Cubeview.h 파일에서
CubeView class 형식 재정의 에러가 날 때.
-> 첫 줄에 #pragma once 라고 적는다.

. pan (축의 방향으로 카메라만 움직이는 것)

. Visual Studio - solution > project보다 상위 개념, solution이 project를 포함한다.

. 단축키를 만들어서 그것을 누르면 가장 기본좌표(0,0,0) + 기본 카메라 뷰로 돌아오는 기능을 넣는 다.

. panning
. 도형과 카메라가 이루는 vector를 먼저 구한다.
적당한 up vector를 정한다.
위 두 vector를 cross product하면 left, right로 panning 할 수 있다.
up vector 방향을 이용하면 up, down으로 panning 할 수 있다.

. pan과 translate는 다르다.

. 리소스 뷰
-> Menu -> IDR_MAINFRAME - 메뉴를 추가한다.
-> Menu 이름에서 마우스 오른쪽을 클릭하면 이벤트 처리기를 추가할 수 있다.
-> Menu이름\tCtrl+Y(&O) : \t를 누르면 탭으로 적절한 간격으로 벌어지고 &를 누르면
-> Accelerator -> IDR_MAINFRAME - 추가한 메뉴 ID에 대해 키를 넣는 다.
예) ctrl + Y : Redo
ctrl + Z : Undo

. toolbar에 새로운 dialog 추가하기
. 프로젝트명.rc -> Dialog -> IDD_DIALOGBAR를 추가한다.
. 적당히 버튼들을 추가한다.
. 동적으로 위의 dialog를 추가한다.
. 그림 그리는 곳에서 마우스 오른쪽 클릭 -> 클래스 추가
. MainFrm.h의 include에 새로 만든 header를 추가

. 현재 solution 파일이 있는 경로 : $(SolutionDir)
(include시 유용하게 쓰인다.)
속성 -> C/c++ -> 일반 -> 추가 포함 디렉터리 -> $(SolutionDir)

참고)
http://www.codeguru.com/cpp/g-m/opengl/openfaq/article.php/c10975__2/