计算几何悲剧归……

感觉考试很难。当然与自己复习不当也有关系。昨天从hjc冰窖一般的图书馆回到温暖的寝室后身体就一直没缓过劲,感觉有些胸闷气短,看书愣是看不下去,虽然我明知道考试在即,而自己还没怎么复习。觉得自己平时的 assignment 交了,midterm 考的个人感觉也还行,怎么着也不会挂。结果今天看了考卷就知道悲剧了。midterm 都是书上的概念,考卷却都是乱七八糟没怎么见过的东西。也罢,东拼拼西凑凑,蒙了不少。但愿老师宽宏大量,我给您烧高香了。

看来,以后不能乱选课,选了课以后不能随便跷课。

而且我也发现,学术这条路我差不多走到尽头了。尽管这两个月自己很努力,但是似乎成效不大。而我对每周按部就班的上课又提不起兴趣,一门普通的如计算几何,计算机组成等课程就把我搞的焦头烂额,叫苦不迭。呃……

我的学习基本属于兴趣驱动。兴趣来了,就会去看很多很多的东西,哪怕它与课程不相关,甚至因此耽误了复习,导致成绩低下等等。算了,还是尽快毕业吧。

考试周几日一直在 HJC,奈何遇上冰冻天气,在 HJC 图书馆冻的不行,叫苦不迭,不过大概低温使人清醒,使人难于犯困,所以效率还是有保障的。第一天复习了汇编语言,看的是清华大学那本经典的《IBM PC机汇编语言教程》,基本熟悉了程序的结构,各种模式。但是让我写一个象样的程序还有些小困难。汇编很难,难就难在将人脑变成电脑来使用。对此我兴趣不大。希望课程能够得过且过吧。

后三天主攻图形学,看 OpenGL。三天的研究颇有成效,一股成就感油然而生,上几张图吧:

这张图看上去很炫,其实是在GLSINGLE单缓冲模式下让一个三角形以一定的速率旋转而成。在这个过程中不要清除GLCOLORBUFFERBIT就行了

一个三角形的三个顶点绕v=(1,1,1)旋转而成。不要清除GLCOLORBUFFERBIT

加了小虫子的纹理填充(不知道这样说是不是正确)。

一个三维的立体 cube。我觉得很漂亮。呵呵。

球体和正方体都可以旋转并且同时放大或者缩小。键盘控制旋转方向。

图形学第三次作业,我自己加了个功能,就是可以让茶壶跳起来,呵呵。也是由键盘控制的。蛮有趣的。顺便把源码发上来,做个备份好了:

/**
 * @file   opengl_exp3.c
 * @author  <lox@freelox>
 * @date   Wed Nov 18 18:01:43 2009
 *
 * @brief  This program illustrate the opengl 3d transformation, such as modelview transformation, projection
 * transformation, and some opengl animation skills
 *
 *
 */

#include <GL/glut.h>
#include <stdlib.h>
#include <math.h>
#include <stdio.h>

#define PERS 0                  /**< define the perspecive projection method */
#define ORTHO 1                 /**< define the orthogonal projection method */

#define WIRE 0                  /**< draw the object with wire */
#define SOLID 1                 /**< draw the object with solid fill color */

static int winWidth = 0;        /**< the new view width */
static int winHeight = 0;       /**< the new view height */

static int projection = PERS;   /**< determine whether perspective or orthogonal */
static int drawMethod = 1;      /**< determine the draw method */

static float cameraX = 0;       /**< the x position of the camera */
static float cameraY = 1.0;     /**< the y position of the camera */
static float cameraZ = 10;      /**< the z position of the camera */

static float teapotX = 0.0;     /**< the x position of the teapot */
static float teapotY = 1.2;     /**< the y position of the teapot */
static float teapotZ = 0.0;     /**< the z position of the teapot */
static float teapotRotateY = 0.0; /**< the rotation degree of the teapot along y axis  */

/**
 * I myself add a jump function to the teapot use i and ty[15]
 */

int i = 0;
float ty[15] = {1.3, 1.4, 1.6, 1.9, 2.3, 3.0, 3.3, 3.4, 3.42, 3.4, 3.3, 3.0, 2.3, 1.5, 1.2};

/**
 * @brief just init the background color
 *
 */
void init() {
  glClearColor(0.0, 0.0, 0.0, 0.0);
}

/**
 * @brief draw one leg of the Desk
 *
 */
void drawLeg() {
  glPushMatrix();
  glScalef(1.0, 3.0, 1.0);
  glutSolidCube(1.0);
  glPopMatrix();
}

/**
 * @brief draw the desktop
 *
 */
void drawDesktop() {
  glPushMatrix();
  glScalef(5.0, 1.0, 4.0);
  glutSolidCube(1.0);
  glPopMatrix();
}

/**
 * @brief draw the whole desk through drawing four legs and one desktop
 *
 * @see drawDesktop
 * @see drawLeg
 */
void drawDesk() {
  glPushMatrix();
  drawDesktop();
  glPopMatrix();

  glPushMatrix();
  glTranslatef(-1.5, -2, -1);
  drawLeg();
  glPopMatrix();

  glPushMatrix();
  glTranslatef(1.5, -2, -1);
  drawLeg();
  glPopMatrix();

  glPushMatrix();
  glTranslatef(1.5, -2, 1);
  drawLeg();
  glPopMatrix();

  glPushMatrix();
  glTranslatef(-1.5, -2, 1);
  drawLeg();
  glPopMatrix();
}

/**
 * @brief draw the whole scene
 *
 * @see drawDesk()
 */
void drawScene() {
  drawDesk();
  glPushMatrix();
  glTranslatef(teapotX, teapotY, teapotZ);
  glRotatef(teapotRotateY, 0.0, 1.0, 0.0);
  glutSolidTeapot(1.0);
  glPopMatrix();
}

/**
 * @brief display the three sides of the desktop
 *
 * @see drawScene();
 */
void display() {
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  glColor3f(1.0, 1.0, 1.0);
  glLoadIdentity();

  gluLookAt(cameraX, cameraY, cameraZ, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0);

  if(drawMethod == SOLID) {
    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  }
  else {
    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  }

  glEnable(GL_DEPTH_TEST);

  glEnable(GL_LIGHTING);
  GLfloat white[] = {1.0, 1.0, 1.0, 1.0};
  GLfloat light_pos[] = {3,5,5,1};

  glLightfv(GL_LIGHT0, GL_POSITION, light_pos);
  glLightfv(GL_LIGHT0, GL_AMBIENT, white);
  glEnable(GL_LIGHT0);

  drawScene();

  glFlush();

  glutSwapBuffers();
}

/**
 * @brief update the viewport of the whole scene when press a special key
 *
 * @param width the width of the new viewport
 * @param height the height of the new viewport
 */
void updateView(int width, int height) {
  glViewport(0, 0, (GLint)width, (GLint)height);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();

  if (projection == PERS) {
    glFrustum(-1.0, 1.0, -1.0, 1.0, 0.5, 40.0);
  }
  else if (projection == ORTHO) {
    glOrtho(-10.0, 10.0, -10.0, 10.0, 0.5, 40.0);
  }
  else {
    projection = PERS;
  }

  glMatrixMode(GL_MODELVIEW);
}

/**
 * @brief glut reshape function
 *
 * @param width
 * @param height
 * @see updateView()
 */
void reshape(int width, int height) {
  if (height == 0) {
    height = 1;
  }

  winWidth = width;
  winHeight = height;

  updateView(winWidth, winHeight);
}

/**
 * @brief glut idle function
 *
 */
void idle() {
  glutPostRedisplay();
}

/**
 * @brief control the keyboard interactive actions
 *
 * @param key the key which pressed
 * @param x the x mouse position
 * @param y the y mouse position
 */

void keyboard(unsigned char key, int x, int y) {
  switch(key) {
  case 27:
  case 'q':                   /**< press q or ESC to quit this program */
    exit(0);
    break;

  case 'p':                   /**< press x to switch between perspective and oothogonal view */
    projection = (projection + 1) % 2;
    updateView(winWidth, winHeight);
    break;

  case 't':
    drawMethod = (drawMethod + 1) % 2;
    break;

  case 'a':                   /**< press a to adjust camera position along negative x axis */
    cameraX--;
    break;

  case 'd':
    cameraX++;
    break;

  case 'w':
    cameraY++;
    break;

  case 's':
    cameraY--;
    break;

  case 'z':
    cameraZ++;
    break;

  case 'c':
    cameraZ--;
    break;
    /**
     * operations about teapot
     *
     */
  case 'l':                   /**< move the teapot along positive x axis */
    if (teapotX >= 2.5) {    /**< the teapot cannot be moved out of the desktop */
      teapotX -= 2.5;
    }
    teapotX += 0.1;
    break;

  case 'j':
    if (teapotX <= -2.5) {
      teapotX += 2.5;
    }
    teapotX -= 0.1;
    break;

  case 'i':
    if (teapotZ >= 2.0) {
      teapotZ -= 2.0;
    }
    teapotZ += 0.1;
    break;

  case 'k':
    if (teapotZ <= -2.0) {
      teapotZ += 2.0;
    }
    teapotZ -= 0.1;
    break;

  case 'e':
    teapotRotateY ++;
    break;

  case 'o':                   /**< make the teapot jump on the desktop */
    teapotY = ty[i++];
    if (i >= 15) {
      i -= 15;
    }
  }

  glutPostRedisplay();
}

/**
 * @brief main function
 *
 * @param argc
 * @param argv
 *
 * @return 0
 */
int main(int argc, char** argv) {
  glutInit(&argc, argv);
  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);

  glutInitWindowSize(500, 500);
  glutInitWindowPosition(100, 100);

  glutCreateWindow("Simple opengl 3d modelview program");

  init();

  glutDisplayFunc(display);
  glutReshapeFunc(reshape);
  glutKeyboardFunc(keyboard);
  glutIdleFunc(idle);

  glutMainLoop();

  return 0;
}

思路还是蛮清晰的。理解起来也不是很难。这三天看了很多的资料,觉得自学的好处就是可以接触大量的资料,从多方面对同一个问题有更好的理解,但是缺点就是太耗费时间了。有些问题老师一句话就可以点明白,但是自己探索却要好长时间。不过我很享受这种探索的乐趣。

前几日耗费了一天多的时间看完了开复自传《世界以你不同》,感慨颇多。毫无疑问,开复是幸运的,他有着良好的家庭条件,及早的接受了美国先进的教育,在那里又碰到了很多对他未来起着决定性作用的好老师,如教他英语的中学老师,他的大学课上说了那句“make a difference"的哲学老师,“不同意却支持他”的博士导师。正是这些人将开复推向了人生的顶峰。最喜欢的是开复的座右铭:

用勇气去改变那些可以改变的事情,用胸怀来接纳那些不能改变的事情,用智慧来辨别两者的不同。

说的非常好。开复精彩的一生就是这句话的写照。做任何事情总是“lead my heart”,这样的人活的潇洒、惬意。

但是并不是所有人都能像开复一样。所以我觉得人生二字,唯机遇与奋斗两字。机遇是先天的,可遇而不可求,奋斗是后天的,自己可以掌控。你不可能指望偏远山区一个放牛的娃子去做科学研究,也不能指望有了机遇坐山吃空就能如何如何。哪些是机遇哪些需要奋斗,这需要用智慧来辨别。

每次去 88 逛 work、careerlife 版块,就会给自己点压力。我告诉自己,要通过自己的努力,找到一份自己喜欢的工作,可能的话开创一片属于自己的事业。在海边有自己的一幢房子,落地大窗,听着海浪的声音入睡。四十岁之前赚足够多的钱,留下一部分,剩下的捐给需要钱的人,然后辞职,追随我心,去做自己想做的事情。这件事情可能是旅行,可能是慈善,可能是教育,或者是自己的事业。等等。

网上有句话,当今的中国是政治精英、文化精英、经济精英三足鼎立,想想还是蛮形象的。自己该选择那个呢?政治自己是干不来了。对所谓的马列毛邓着实感到恶心。文化,经济,如果二者选一,我还是选择后者吧。我已经失去了对学术探索的热情和雄心了。

两个月之前,浙大海归博士涂序新跳楼自杀,引起来学术界的轩然大波。越长大越孤单,随着年龄的增大,社会也在逐渐掀开那层层的面纱。当代中国人活的太辛苦了。我只能这么说,这么说是因为我只知道中国。我觉得中国人活的很辛苦。别的国家我没有去过,没有切身感受。所以我喜欢旅行,我想要看看这大千世界。

又罗嗦了这么多。吃饭去了。