在家的幸福生活~

元太初 发表于 2009-06-29 10:16:25

回家路途遥远,中间还要到东京转机,十几个钟头的飞机,修炼打坐功夫。
每次乘长途飞机,我的座位附近总有小朋友嚎啕大哭,每次都要在哭声中入睡,再在哭声中醒来,我已经头昏脑涨,小朋友却依然精力旺盛,中气十足,令人不得不甘拜下风。日后我可能需要勤加修炼吊嗓子,才能应付避无可避的讲课之类的差事。不然我这小破嗓子,说上1小时话就觉得声涩气绝,浑身乏力,那可怎么长时间侃侃而谈,侃晕同志们?

回家之后暴饮暴食,吃得太多,第一周周末出现胃部不适。一早醒来,似乎是昨天吃得太多,以至于夜里胃酸分泌过剩,于是十分恶心反胃。但我意志坚强,在马桶边转悠了几圈之后终究没有吐出来,而是压制了种种反胃之感,当天稍微修身养性,第二天就飞奔去吃老鸭面和小龙虾了……之后我的胃部机能得到加强,一直处于胡吃海喝的状态,目前吃饭大业有了阶段性成果——肚子粗了至少5圈~~还有一周,要继续奋战!

回老家的长途汽车现在比以前好了很多。杭州湾跨海大桥修成之后,上海到宁波可以不用到杭州去绕行了。36公里的桥,这头看不到那头,当然也可能是因为这几天雾大。感觉还是很壮观的。桥中间的服务区还在修建,等修好之后,过桥时在湾心上小驻,吹着小海风,眺望滔滔浊浪,别有一番情趣XD~~
(话说滩涂式的海岸真的没有希望有碧波万顷了咩……)
总之目前上海到临海车程5小时,钻钻隧道,还是在接受范围内的。以前从杭州去,一路上盘山公路要走十多个小时,还要随时面临翻车的危险,实在太恐怖了。等甬台温铁路通车之后,去临海会更方便吧。

临海自古是台州府,然而目前这个府已经迁至椒江,临海自此复为依山傍水的小县城一枚(水仍然是黄泥浆水Orz|||)。老城旧屋,每天清晨太阳从牛头山升起的时候,这个城市熙熙攘攘的一天也就开始了。我的印象里,她的发展一直没有什么明确的规划,东一榔头西一棒的。台州医院和台州一中似乎暂时不会搬,那么人气大概也不会骤减,麦油子和麦饼的小店依然会在街头巷尾。建了崇和门广场,出现了肯德基,似乎也有些大型卖场,可是我在街上晃悠的时候,总感觉这地方十多年来未曾变过。黄包车还是在路上来去如风,出租车的起步价是5块钱。这是我的家乡,已经不熟悉了,土话都说不流畅,却觉得亲切。
就算建了些高楼,涌进了一些连锁店,这小城骨子里还是我小时候认识的那个。偏于一隅的小地方。
PS:此地旅游业总是发展不起来,就算复原江南长城又建戚公祠也木有帮助。我仔细想想是能成号召力的景点实在是木有。山上的狐狸狗头熊还有蛇都已经绝迹了,娘亲当年革命战斗过的地方已经破败不堪。那段城墙,婉约有余,气势不足,倒是很符合江南淫民的性格:韧而不强,平时看不出来气性有多大……
收藏: QQ书签 del.icio.us 订阅: Google 抓虾

我讨厌处理新数据!

元太初 发表于 2009-06-02 13:46:07

每次处理新的数据集,都是对我想象力的一次严重挑战——我知道乃们会说,咦你不是写程序的嘛,那玩意儿要啥想象力啊,不就是蓝领苦功么?
我原来也是这么想的。
现在终于知道,如果基本功不扎实,那么就一定要插上想象的翅膀,不然Debug到斯巴达都折腾不明白哪里出了问题。

比如这次对付的新数据集,来来回回和它横着练了三天,一个周末都着急上火,死活显示不出来说有问题。问题出在哪里呢?是原始数据转换格式的时候不对?还是中间倒腾BigEdian或LittleEndian的时候强制转型有误?又或者是弱智Bug,但需要手工梳理?

最后我终于灵光一现:MD,难道是这个数据集的Z轴方向维数太高,显卡崩了?

经过几番试验,终于确认,果然是这样。只能512x512x512,再高就崩了。

流泪自挂东南枝ing。


接下来还要跟Powered Voronoi Diagram玩儿命。然后才能回家玩一段……
收藏: QQ书签 del.icio.us 订阅: Google 抓虾

路边扑街的小松鼠

元太初 发表于 2009-05-29 11:33:33



鼠标画起来可真不顺= =|||于是只能意思意思。
今天回家路上看到有闲人聚在路中间的隔离绿化带上围观什么东西,于是路过时便留心看了一眼,发现居然是一只这里十分常见的肌肉LOLI款的松鼠,四肢平趴,屁股向后平沙落雁于地。
因为与同学一起,也没好意思下车围观。
不知道这小东西到底怎么了,是天太热中暑了,还是和别的松鼠打架从树上摔下来伤了?身上似乎并无明显伤痕。可是扑街确是千真万确的:被闲人们如此围观却一动不动,如果真的是装死,定力也好了点啊……

(5月29日)
今日路过,确认它真的挂了……
离可怜的尸体不远处,就有一只松鼠在悠然自得的觅食——我说乃的神经也太粗了吧!!!???
收藏: QQ书签 del.icio.us 订阅: Google 抓虾

新相机——Fuji S8100

元太初 发表于 2009-05-19 10:52:16

新相机终于到手了。
Fuji的老机型了,打折到245刀,于是拿下。具备长焦广角,手动功能。反正我怎么玩也是业余玩票,就不用上单反那么复杂啦~这个机器重量适中,握起来手感也不错,应该可以玩很久了吧。

刚刚忍不住出去拍了一下黄昏。感觉还可以耶。胡乱调了调快门速度光圈值什么的,拍出来的天上的云彩和肉眼所见的感觉差不多,我也就这点追求了Orz|||所见即所得……
满意,爬走~~

啊,放几张刚才喀嚓的片片吧。这是摸新相机几分钟的人拍的,所以如果觉得很烂的话,也请包涵……




收藏: QQ书签 del.icio.us 订阅: Google 抓虾

入夏了

元太初 发表于 2009-05-17 11:21:37

之前在德国时住的宿舍,第一个夏天阴凉舒爽与众不同,我硬是怀疑人家闹鬼还煞有介事地思考了好一会儿。所以后来大概那位全天然制冷机怒了,说我明明是英俊潇洒(或者)风流袅娜的仙人,你居然怀疑我是冤魂,实在不识好歹,老子以后不保佑你了!

——所以现在,本人的小黑屋朝北,窗前有棵松树,时有松鼠上下,冬天阴冷无光,夏天炎热难当。夏天了,于是炎热了。坐在窗前都能感觉到热浪一阵阵扑面而来。也就是说我以前躲在小黑屋里自己玩的光荣传统是坚持不了了,我只能好好学习天天向上地去蹲实验室……蹭空调。

 

学习在我是最后一种选择——也就是说但凡有可能,在下都要先玩了再说。这是什么时候养成的坏习惯呢?经过深刻严肃地自我剖析,是从高中时代开始的……一切都要从学校里那位肤若凝脂眼含秋水隆准菱唇瓜子脸的帅哥,长咧了说起。那之后顿时觉得上学了无生趣,假期有气无力,人生没了盼头。你说,那么美的绝代佳人,都有可能发生如此的人间惨剧,这人生还有什么意义呢?

 

但人生即使没有了意义,也不能就此驾鹤西去,好歹还是要苟延残喘的。因为世界上毕竟还是有很多帅哥等待在下去萌去发现,去欣赏去配对的~为了实现这一目标,有时候就不得不对现实妥协,偶尔也要好好学习一下,以换得盘缠银两,好继续糟蹋人生。

 

如今堕落又到了一个阶段,需要暂时收心运气鸟= =|||这样才能在六月中时大喝一声“I am back!”……

 

前段时间的生活,其实过得没啥意义。就是填补了一下知识空白。比如宫崎骏的一堆动画(我之前还真没完整地从头到尾看过),还有一些香港老电影。最近心灵空虚,而且对电视剧绝望之后,要求降低,反而能从中获得乐趣。比如最近就连熬两个通宵,看了《宝莲灯前传》,还觉得挺不错的Orz。怨念就是,为毛大金乌要死掉,为毛哮天犬不找帅哥演(当然要找帅哥演估计是通不过审查了,那RP的对话……)?

 

一堆天涯的鬼故事,比如091气象所,搞鬼一家人,七域杀机,莫问天机,饕餮饲养指南,灵异第五科,黄金鬼捕,无证驱魔,湘西鬼事,恢复更新的大漠苍狼,还有无穷多,几乎把莲蓬翻了个底儿掉。又得养肥一段再杀了。

 

正宗耽美看得倒少了。

下午刚看了一篇,感觉还不错。名字是《佛说仕途一场梦》。难得有篇文,我觉得非圆满结局反而是比较圆满的,两位男主的性格我也都挺喜欢。[不像很多文,我看完要么恨渣攻要么恨渣受要么恨作者要么恨自己浪费时间……都快赶上七大恨了……]

类似感觉不错的还有景帝纪事,但主角的性格不够妙,还是今日看的更合我的脾胃。

 

现在喜欢看暧昧多过看H,看主角相互尊重心灵伙伴多过强制爱你追我逐,所以难怪会泡在鬼话出不来。因为除了BG气场特别强的玛丽苏过度的,一般都会有双男主,至少有抢眼男配可以供我脑补。

收藏: QQ书签 del.icio.us 订阅: Google 抓虾

这遭瘟的世界哟Orz

元太初 发表于 2009-05-04 16:23:35

我想这段时间我不务正业确实很欠抽,泡在小粉红刷无聊贴是不能促进社会和谐经济发展学习进步的,可是我还是坚持不懈地浪费着生命不肯改邪归正。
于是老天爷终于看不过眼,来给我下猛药了。
先来一个明显的种族掐架贴。但最终老天爷发现我已经没志气到连小康被黑都不在意了,继续愉快刷其他贴中,他不得不给我来狠的。
遭瘟的小粉红出现了。首页一片狼藉,竟无可看可Y可萌之有爱贴=口=|||这在我多年小粉红的经验中也是少有的。

我,我还是去看医学图像学去吧……两害相权取其轻,那玩意儿虽然不萌,好歹也不恶Orz

……泪指,算你狠!!!

暂时拜别小粉和阿耽还有玄幻鬼话,待日后养肥了再杀贴~~~
收藏: QQ书签 del.icio.us 订阅: Google 抓虾

Wall E

元太初 发表于 2009-04-16 15:37:53

我喜欢这只小机器人很久了。
人问我为啥喜欢他,我说:楚楚可怜。

整个电影最喜欢看到瓦力蹙起眉眼,瞪着亮晶晶的大眼睛,发出无辜的“呜呜”声。

越是忙碌的时候,越是要浪费时间。
于是今晚爬回家,硬撑着打架的眼皮,还是坚持看了一遍。
现在能看进去的BG感的片子,怎么都是G攻呢?

收藏: QQ书签 del.icio.us 订阅: Google 抓虾

面食——饺子包子以及剩下的粉变成的馒头

元太初 发表于 2009-04-05 13:52:42

今天馋得不行,于是折腾,不停地折腾……
掺发酵粉和了面,用一部分做了饺子皮,煮起来也没啥,就是在锅里时饺子都涨成气球状了Orz
这些饺子是前几天做的时候拍的。


饱餐战饭之后继续做包子~
奋力地胡乱包着……
还不错吧?


上笼蒸出来就成这样了,



这次粉发得不是很好,我觉得我发酵粉掺少了。之后用剩下的面做的馒头虽然也发起来了,但不够蓬松。需要寻找关键技术以求改进啊~

现在每天不务正业,不是看小说就是做吃的Orz|||泪奔~~~想吃什么都要自己动手,好惨啊……
收藏: QQ书签 del.icio.us 订阅: Google 抓虾

烤红薯

元太初 发表于 2009-04-04 06:47:35

挑选纤细修长红薯一根(因为胖大的不容易烤透)
烤箱375F预热5分钟以上(相当于摄氏190度的样子)
然后将小红薯放进去,不用洗,不用去皮,什么都不用做~
烤1小时,在过程中大概10分钟去翻一下面.

出来的结果是皮肉分离水嫩嫩的红心红薯~味道非常好~居家旅行必备的点心啊~
关键词(Tag): 烤红薯
收藏: QQ书签 del.icio.us 订阅: Google 抓虾

一个小小的无聊的程序

元太初 发表于 2009-04-03 01:40:52

近日实在是馋透了,于是奋不顾身地又包了一回饺子。

就揉了自己需要吃的那点面,和起来还算轻松,最后一共擀出大大小小十七张皮。馅儿照例是白菜牛肉馅的。切了些葱进去。拌了一点盐给菜去水,也加了些酱油,但最终馅儿还是尝不出咸味。

我包饺子技术有待练习。某几个留了空气缝隙的煮水后膨胀起来,于是破损,十分恼人。

酱油里放了点辣油虾酱。

 

言归正传,记录一下OpenGL的进程。这个其实是上学期的初代作业了。基本上没有技术含量可言。不过因为自己觉得有纪念意义,所以还是要厚颜放出来,作为我咸猪手的成果展示。

其实就是把函数f(x,y)=0.13+0.5*sqrt(x*x+y*y)+0.18*sin(30*(x+y))*cos(10*(x-y))在一个unit square上画出来,然后用1D Texture着色,再用Marching Square的方法画Contour Line(类似气象学中的气压等高线一类的东西)。

 

当时可怜我接触OpenGL才一周就要做这种作业,所以现在把代码贴一下,说不定能帮到和我一样的废柴。回头看看这些代码,写得真是恶心= =p。不过反正也是我真实的成长记录,出糗就出糗吧Orz|||

 

Linux下操作命令(windows下稍微改改就好啦)

1) compile command: g++ -o hw1d hw1d.cpp,

2) visualize command: ./hw1d,

3) Input the n value or just "enter" let n=24,

4) Input the contour value between [0,1],

5) Get the result.

You can use 'i' to increase the n value and

'd' to decrease the n value,

'h' to increase the contour value and

'l' to decrease the contour value.

 

//#include <windows.h>

//#pragma comment( lib, "opengl32.lib")

/*we need these code under windows+VC

  include the opengl32 lib, you can include it by

  add "opengl32.lib" to property->link*/

#include <GL/gl.h>

#include <GL/glu.h>

#include <GL/glut.h>

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

#include <float.h>

 

struct Vertex{

     float x;

     float y;

     float fvalue;

     float vR;

     float vG;

     float vB;

     bool flag;//show the position of the point

     int situ;//the situation of the quad depend on this point, 0-7

};

 

int NUM;

float d;

struct Vertex **_2DVertex;

static int i, j;

static GLubyte rainbow[256][3];

static GLuint texName;

float x_temp;

float y_temp;

static float alpha;

 

float max(float max1, float max2){

     if(max1>max2)

         return max1;

     else

         return max2;

}

 

float min(float min1, float min2){

     if(min1<min2)

         return min1;

     else

         return min2;

}

 

//rainbow mapping

/*void rainbow(float f, float& R, float& G, float& B)

{

     const float dx = 0.8;

     f = (f<0)? 0 : (f>1)? 1 : f;

     float g = (6-2*dx)*f +dx;

     R = max(0,(3-fabs(g-4)-fabs(g-5))/2);

     G = max(0,(4-fabs(g-2)-fabs(g-4))/2);

     B = max(0,(3-fabs(g-1)-fabs(g-2))/2);

     //printf("in c function [%f,%f,%f]", R, G, B);

}*/

//the 1D texture of rainbow

void makerainbow(void)

{

     float g, f_temp, contour = -1.0;

     f_temp = 1.0/256;

     const float dx = 0.8;

     for(i = 0; i<256; i++)

     {

         g = (6-2*dx)*i*f_temp +dx;

         rainbow[i][0] = (GLubyte) (max(0,(3-fabs(g-4)-fabs(g-5))/2)*255);

         rainbow[i][1] = (GLubyte) (max(0,(4-fabs(g-2)-fabs(g-4))/2)*255);

         rainbow[i][2] = (GLubyte) (max(0,(3-fabs(g-1)-fabs(g-2))/2)*255);

     }

}

 

float cross(Vertex pi, Vertex pj, int flag)

{

     if(flag == 1){

         float p = (pi.x*(pj.fvalue - alpha) + pj.x*(alpha - pi.fvalue))/(pj.fvalue - pi.fvalue);

         return p;

     }

     else if(flag == 2){

         float p = (pi.y*(pj.fvalue - alpha) + pj.y*(alpha - pi.fvalue))/(pj.fvalue - pi.fvalue);

         return p;

     }

     return 0;

}

 

float BST(Vertex P0, Vertex P1, Vertex P2, Vertex P3)

{

     float p_temp = (P0.fvalue * P2.fvalue + P1.fvalue * P3.fvalue)/(P0.fvalue + P2.fvalue - P1.fvalue - P3.fvalue);

     return p_temp;

}

 

/* Create display list with Triangle and initialize state*/

static void init(void)

{

     glClearColor(0.0, 0.0, 0.0, 0.0);

     glShadeModel(GL_SMOOTH);

     glEnable(GL_DEPTH_TEST);

     glOrtho(0,1,0,1,-1,1);

     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

 

     makerainbow();

}

 

void display(void)

{

     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

 

     glGenTextures(1, &texName);

     glBindTexture(GL_TEXTURE_1D, texName); // Bind Our Texture

     glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT);

     glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_T, GL_REPEAT);

     glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

     glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

     glTexImage1D(GL_TEXTURE_1D, 0, GL_RGB, 256, 0, GL_RGB, GL_UNSIGNED_BYTE, rainbow);

 

     glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);

     glEnable(GL_TEXTURE_1D);

     glEnable(GL_BLEND);

 

 

     glBegin(GL_TRIANGLES);

     for(i = 0; i < NUM - 1; i++){

         for(j = 0; j < NUM - 1; j++){

              glTexCoord1f(_2DVertex[i][j].fvalue); glVertex2f(_2DVertex[i][j].x, _2DVertex[i][j].y); 

              glTexCoord1f(_2DVertex[i+1][j].fvalue); glVertex2f(_2DVertex[i+1][j].x, _2DVertex[i+1][j].y);

              glTexCoord1f(_2DVertex[i][j+1].fvalue); glVertex2f(_2DVertex[i][j+1].x, _2DVertex[i][j+1].y);

 

              glTexCoord1f(_2DVertex[i+1][j+1].fvalue); glVertex2f(_2DVertex[i+1][j+1].x, _2DVertex[i+1][j+1].y);   

              glTexCoord1f(_2DVertex[i+1][j].fvalue); glVertex2f(_2DVertex[i+1][j].x, _2DVertex[i+1][j].y);

              glTexCoord1f(_2DVertex[i][j+1].fvalue); glVertex2f(_2DVertex[i][j+1].x, _2DVertex[i][j+1].y);

         }

         //printf("end\n");

     }

     glEnd();

     glDisable(GL_TEXTURE_1D);

 

     //decide whether the point is in the contour or out the countour

     for(i = 0; i < NUM; i++){

         for(j = 0; j < NUM; j++){

              if(_2DVertex[i][j].fvalue > alpha)

                   _2DVertex[i][j].flag = true;

              else

                   _2DVertex[i][j].flag = false;

         }

     }

 

     //Marching square

     //set the situation of the quad

     for(i = 0; i < NUM-1; i++){

         for(j = 0; j < NUM-1; j++){

              _2DVertex[i][j].situ = 0;

              if(!_2DVertex[i+1][j].flag){//V3 no flag

                   if(!_2DVertex[i+1][j+1].flag){//V2 no flag

                       if(!_2DVertex[i][j+1].flag){//V1 no flag

                            if(!_2DVertex[i][j].flag){//V0 no flag

                                 _2DVertex[i][j].situ = 0;

                            }//end of the action when V0 no flag

                            else{//V0 flag

                                 _2DVertex[i][j].situ +=6;

                            }//end of the action when V0 flag

                       }//V1 no flag

                       else{//V1 flag

                            _2DVertex[i][j].situ +=1;

                            if(!_2DVertex[i][j].flag){//V0 no flag

                                 _2DVertex[i][j].situ +=2;

                            }//end of the action when V0 no flag

                            else{//V0 flag

                                 _2DVertex[i][j].situ +=4;

                            }//end of the action when V0 flag

                       }//V1 flag

                   }//V2 no flag

                   else{//V2 flag

                       _2DVertex[i][j].situ +=0;

                       if(!_2DVertex[i][j+1].flag){//V1 no flag

                            _2DVertex[i][j].situ +=1;

                            if(!_2DVertex[i][j].flag){//V0 no flag

                            }//end of the action when V0 no flag

                            else{//V0 flag

                                 _2DVertex[i][j].situ +=6;

                            }//end of the action when V0 flag

                       }//V1 no flag

                       else{//V1 flag

                            if(!_2DVertex[i][j].flag){//V0 no flag

                                 _2DVertex[i][j].situ +=2;

                            }//V0 no flag

                            else{//V0 flag

                                 _2DVertex[i][j].situ +=4;

                            }//V0 flag

                       }//V1 flag

                   }//V2 flag

              }//V3 no flag

              else{//V3 flag

                   if(!_2DVertex[i+1][j+1].flag){//V2 no flag

                       _2DVertex[i][j].situ +=0;

                       if(!_2DVertex[i][j+1].flag){//V1 no flag

                            if(!_2DVertex[i][j].flag){//V0 no flag

                                 _2DVertex[i][j].situ +=4;

                            }//end of the action when V0 no flag

                            else{//V0 flag

                                 _2DVertex[i][j].situ +=2;

                            }//end of the action when V0 flag

                       }//V1 no flag

                       else{//V1 flag

                            _2DVertex[i][j].situ +=1;

                            if(!_2DVertex[i][j].flag){//V0 no flag

                                 _2DVertex[i][j].situ +=6;

                            }//end of the action when V0 no flag

                            else{//V0 flag

                            }//end of the action when V0 flag

                       }//V1 flag

                   }//V2 no flag

                   else{//V2 flag

                       if(!_2DVertex[i][j+1].flag){//V1 no flag

                            _2DVertex[i][j].situ +=1;

                            if(!_2DVertex[i][j].flag){//V0 no flag

                                 _2DVertex[i][j].situ +=4;

                            }//end of the action when V0 no flag

                            else{//V0 flag

                                 _2DVertex[i][j].situ +=2;

                            }//end of the action when V0 flag

                       }//V1 no flag

                       else{//V1 flag

                            if(!_2DVertex[i][j].flag){//V0 no flag

                                 _2DVertex[i][j].situ +=6;

                            }//V0 no flag

                            else{//V0 flag

                                 _2DVertex[i][j].situ +=0;

                            }//V0 flag

                       }//V1 flag

                   }//V2 flag

              }//V3 flag

         }

     }

 

    

     //draw the contour line(s) with different cases,

     glColor3f(0.0f, 0.0f,0.0f);

     glBegin(GL_LINES);

     for(i = 0; i < NUM-1; i++){

         for(j = 0; j < NUM-1; j++){

              switch(_2DVertex[i][j].situ){

              case 0:

                   break;

              case 1:

                   glVertex2d(cross(_2DVertex[i+1][j], _2DVertex[i+1][j+1], 1), cross(_2DVertex[i+1][j], _2DVertex[i+1][j+1], 2));

                   glVertex2d(cross(_2DVertex[i+1][j+1], _2DVertex[i][j+1], 1), cross(_2DVertex[i+1][j+1], _2DVertex[i][j+1], 2));

                   break;

              case 2:

                   glVertex2d(cross(_2DVertex[i+1][j], _2DVertex[i+1][j+1], 1), cross(_2DVertex[i+1][j], _2DVertex[i+1][j+1], 2));

                   glVertex2d(cross(_2DVertex[i][j+1], _2DVertex[i][j], 1), cross(_2DVertex[i][j+1], _2DVertex[i][j], 2));

                   break;

              case 3:

                   glVertex2d(cross(_2DVertex[i+1][j+1], _2DVertex[i][j+1], 1), cross(_2DVertex[i+1][j+1], _2DVertex[i][j+1], 2));

                   glVertex2d(cross(_2DVertex[i][j+1], _2DVertex[i][j], 1), cross(_2DVertex[i][j+1], _2DVertex[i][j], 2));

                   break;

              case 4:

                   glVertex2d(cross(_2DVertex[i+1][j], _2DVertex[i+1][j+1], 1), cross(_2DVertex[i+1][j], _2DVertex[i+1][j+1], 2));

                   glVertex2d(cross(_2DVertex[i+1][j], _2DVertex[i][j], 1), cross(_2DVertex[i+1][j], _2DVertex[i][j], 2));

                   break;

              case 5:

                   glVertex2d(cross(_2DVertex[i+1][j+1], _2DVertex[i][j+1], 1), cross(_2DVertex[i+1][j+1], _2DVertex[i][j+1], 2));

                   glVertex2d(cross(_2DVertex[i+1][j], _2DVertex[i][j], 1), cross(_2DVertex[i+1][j], _2DVertex[i][j], 2));

                   break;

              case 6:

                   glVertex2d(cross(_2DVertex[i+1][j], _2DVertex[i][j], 1), cross(_2DVertex[i+1][j], _2DVertex[i][j], 2));

                   glVertex2d(cross(_2DVertex[i][j+1], _2DVertex[i][j], 1), cross(_2DVertex[i][j+1], _2DVertex[i][j], 2));

                   break;

              case 7:

              //   if(_2DVertex[i][j].flag){

                   if(alpha > BST(_2DVertex[i][j], _2DVertex[i][j+1], _2DVertex[i+1][j+1], _2DVertex[i+1][j])){

                   glVertex2d(cross(_2DVertex[i+1][j], _2DVertex[i+1][j+1], 1), cross(_2DVertex[i+1][j], _2DVertex[i+1][j+1], 2));

                   glVertex2d(cross(_2DVertex[i+1][j+1], _2DVertex[i][j+1], 1), cross(_2DVertex[i+1][j+1], _2DVertex[i][j+1], 2));

 

                   glVertex2d(cross(_2DVertex[i+1][j], _2DVertex[i][j], 1), cross(_2DVertex[i+1][j], _2DVertex[i][j], 2));

                   glVertex2d(cross(_2DVertex[i][j+1], _2DVertex[i][j], 1), cross(_2DVertex[i][j+1], _2DVertex[i][j], 2));

                   }

                   else{

                   glVertex2d(cross(_2DVertex[i+1][j], _2DVertex[i+1][j+1], 1), cross(_2DVertex[i+1][j], _2DVertex[i+1][j+1], 2));

                   glVertex2d(cross(_2DVertex[i+1][j], _2DVertex[i][j], 1), cross(_2DVertex[i+1][j], _2DVertex[i][j], 2));

 

                   glVertex2d(cross(_2DVertex[i+1][j+1], _2DVertex[i][j+1], 1), cross(_2DVertex[i+1][j+1], _2DVertex[i][j+1], 2));

                   glVertex2d(cross(_2DVertex[i][j+1], _2DVertex[i][j], 1), cross(_2DVertex[i][j+1], _2DVertex[i][j], 2));

                   }

                   break;

              default:

                   break;

              }

         }

     }

     glEnd();

     glFlush();

}

 

void reshape(int w, int h)

{

     glViewport(0, 0, (GLsizei) w, (GLsizei) h);

     glMatrixMode(GL_PROJECTION);

     glLoadIdentity();

}

 

void keyboard (unsigned char key, int x, int y)

{

   switch (key) {

      case 27:

         exit(0);

         break;

      case 'i':

      NUM ++;

      

      d = 1.0/(NUM-1);

 

     _2DVertex = (struct Vertex **)malloc(NUM * sizeof(struct Vertex *));

     for(i = 0; i<NUM; i++){

       _2DVertex[i] = (struct Vertex *)malloc(NUM * sizeof(struct Vertex));

     }

    

     //Set the value of (Xi,Yj):

     for(i = 0; i < NUM; i++){

         for(j = 0; j < NUM; j++){

              _2DVertex[i][j].x = d*i;

              _2DVertex[i][j].y = d*j;

                  x_temp = _2DVertex[i][j].x;

              y_temp = _2DVertex[i][j].y;

              _2DVertex[i][j].fvalue = 0.13 + 0.5 * sqrt(x_temp * x_temp + y_temp * y_temp) + 0.18 * sin(30*(x_temp + y_temp))*cos(10*(x_temp - y_temp));

         }

     }

      glutPostRedisplay();

      break;

      case 'd':

      if(NUM>3){

         NUM --;

         d = 1.0/(NUM-1);

 

     _2DVertex = (struct Vertex **)malloc(NUM * sizeof(struct Vertex *));

     for(i = 0; i<NUM; i++){

       _2DVertex[i] = (struct Vertex *)malloc(NUM * sizeof(struct Vertex));

     }

    

     //Set the value of (Xi,Yj):

     for(i = 0; i < NUM; i++){

         for(j = 0; j < NUM; j++){

              _2DVertex[i][j].x = d*i;

              _2DVertex[i][j].y = d*j;

                  x_temp = _2DVertex[i][j].x;

              y_temp = _2DVertex[i][j].y;

              _2DVertex[i][j].fvalue = 0.13 + 0.5 * sqrt(x_temp * x_temp + y_temp * y_temp) + 0.18 * sin(30*(x_temp + y_temp))*cos(10*(x_temp - y_temp));

         }

     }

      glutPostRedisplay();

      }

      break;

      case 'h':

      if(alpha<1.0){

         alpha += 0.001;

         glutPostRedisplay();

      }

      break;

      case 'l':

      if(alpha>0.0){

         alpha -= 0.001;

         glutPostRedisplay();

      }

      break;

      default:

         break;

   }

}

 

 

int main(int argc, char** argv){

    

     printf("Please enter the n value:");

 

     scanf("%d", &NUM);

     NUM +=1;

 

     d = 1.0/(NUM-1);

 

     _2DVertex = (struct Vertex **)malloc(NUM * sizeof(struct Vertex *));

     for(i = 0; i<NUM; i++){

       _2DVertex[i] = (struct Vertex *)malloc(NUM * sizeof(struct Vertex));

     }

    

     //Set the value of (Xi,Yj):

     for(i = 0; i < NUM; i++){

         for(j = 0; j < NUM; j++){

              _2DVertex[i][j].x = d*i;

              _2DVertex[i][j].y = d*j;

                  x_temp = _2DVertex[i][j].x;

              y_temp = _2DVertex[i][j].y;

              _2DVertex[i][j].fvalue = 0.13 + 0.5 * sqrt(x_temp * x_temp + y_temp * y_temp) + 0.18 * sin(30*(x_temp + y_temp))*cos(10*(x_temp - y_temp));

         }

     }

    

     //get the contour value

     printf("Please enter the contour value between [0,1] :");

     scanf("%f", &alpha);

 

     while(!(alpha>0.0 && alpha<1.0)){

         printf("invalid contour value!\n");

         printf("Please enter the contour value between [0,1]:");

         scanf("%f", &alpha);

     }

 

     glutInit(&argc, argv);

     glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);

     glutInitWindowSize(600, 600);

     glutInitWindowPosition(100, 100);

     glutCreateWindow(argv[0]);

     init();

     glutDisplayFunc(display);

     glutReshapeFunc(reshape);

     glutKeyboardFunc(keyboard);

     glutMainLoop();

 

     for(i=0; i<NUM; i++)

       free(_2DVertex[i]);

     free(_2DVertex);

     return 0;

}

收藏: QQ书签 del.icio.us 订阅: Google 抓虾