山顶洞
在家的幸福生活~
元太初 发表于 2009-06-29 10:16:25
每次乘长途飞机,我的座位附近总有小朋友嚎啕大哭,每次都要在哭声中入睡,再在哭声中醒来,我已经头昏脑涨,小朋友却依然精力旺盛,中气十足,令人不得不甘拜下风。日后我可能需要勤加修炼吊嗓子,才能应付避无可避的讲课之类的差事。不然我这小破嗓子,说上1小时话就觉得声涩气绝,浑身乏力,那可怎么长时间侃侃而谈,侃晕同志们?
回家之后暴饮暴食,吃得太多,第一周周末出现胃部不适。一早醒来,似乎是昨天吃得太多,以至于夜里胃酸分泌过剩,于是十分恶心反胃。但我意志坚强,在马桶边转悠了几圈之后终究没有吐出来,而是压制了种种反胃之感,当天稍微修身养性,第二天就飞奔去吃老鸭面和小龙虾了……之后我的胃部机能得到加强,一直处于胡吃海喝的状态,目前吃饭大业有了阶段性成果——肚子粗了至少5圈~~还有一周,要继续奋战!
回老家的长途汽车现在比以前好了很多。杭州湾跨海大桥修成之后,上海到宁波可以不用到杭州去绕行了。36公里的桥,这头看不到那头,当然也可能是因为这几天雾大。感觉还是很壮观的。桥中间的服务区还在修建,等修好之后,过桥时在湾心上小驻,吹着小海风,眺望滔滔浊浪,别有一番情趣XD~~
(话说滩涂式的海岸真的没有希望有碧波万顷了咩……)
总之目前上海到临海车程5小时,钻钻隧道,还是在接受范围内的。以前从杭州去,一路上盘山公路要走十多个小时,还要随时面临翻车的危险,实在太恐怖了。等甬台温铁路通车之后,去临海会更方便吧。
临海自古是台州府,然而目前这个府已经迁至椒江,临海自此复为依山傍水的小县城一枚(水仍然是黄泥浆水Orz|||)。老城旧屋,每天清晨太阳从牛头山升起的时候,这个城市熙熙攘攘的一天也就开始了。我的印象里,她的发展一直没有什么明确的规划,东一榔头西一棒的。台州医院和台州一中似乎暂时不会搬,那么人气大概也不会骤减,麦油子和麦饼的小店依然会在街头巷尾。建了崇和门广场,出现了肯德基,似乎也有些大型卖场,可是我在街上晃悠的时候,总感觉这地方十多年来未曾变过。黄包车还是在路上来去如风,出租车的起步价是5块钱。这是我的家乡,已经不熟悉了,土话都说不流畅,却觉得亲切。
就算建了些高楼,涌进了一些连锁店,这小城骨子里还是我小时候认识的那个。偏于一隅的小地方。
PS:此地旅游业总是发展不起来,就算复原江南长城又建戚公祠也木有帮助。我仔细想想是能成号召力的景点实在是木有。山上的狐狸狗头熊还有蛇都已经绝迹了,娘亲当年革命战斗过的地方已经破败不堪。那段城墙,婉约有余,气势不足,倒是很符合江南淫民的性格:韧而不强,平时看不出来气性有多大……
我讨厌处理新数据!
元太初 发表于 2009-06-02 13:46:07
我原来也是这么想的。
现在终于知道,如果基本功不扎实,那么就一定要插上想象的翅膀,不然Debug到斯巴达都折腾不明白哪里出了问题。
比如这次对付的新数据集,来来回回和它横着练了三天,一个周末都着急上火,死活显示不出来说有问题。问题出在哪里呢?是原始数据转换格式的时候不对?还是中间倒腾BigEdian或LittleEndian的时候强制转型有误?又或者是弱智Bug,但需要手工梳理?
最后我终于灵光一现:MD,难道是这个数据集的Z轴方向维数太高,显卡崩了?
经过几番试验,终于确认,果然是这样。只能512x512x512,再高就崩了。
流泪自挂东南枝ing。
接下来还要跟Powered Voronoi Diagram玩儿命。然后才能回家玩一段……
路边扑街的小松鼠
元太初 发表于 2009-05-29 11:33:33

鼠标画起来可真不顺= =|||于是只能意思意思。
今天回家路上看到有闲人聚在路中间的隔离绿化带上围观什么东西,于是路过时便留心看了一眼,发现居然是一只这里十分常见的肌肉LOLI款的松鼠,四肢平趴,屁股向后平沙落雁于地。
因为与同学一起,也没好意思下车围观。
不知道这小东西到底怎么了,是天太热中暑了,还是和别的松鼠打架从树上摔下来伤了?身上似乎并无明显伤痕。可是扑街确是千真万确的:被闲人们如此围观却一动不动,如果真的是装死,定力也好了点啊……
(5月29日)
今日路过,确认它真的挂了……
离可怜的尸体不远处,就有一只松鼠在悠然自得的觅食——我说乃的神经也太粗了吧!!!???
新相机——Fuji S8100
元太初 发表于 2009-05-19 10:52:16
Fuji的老机型了,打折到245刀,于是拿下。具备长焦广角,手动功能。反正我怎么玩也是业余玩票,就不用上单反那么复杂啦~这个机器重量适中,握起来手感也不错,应该可以玩很久了吧。
刚刚忍不住出去拍了一下黄昏。感觉还可以耶。胡乱调了调快门速度光圈值什么的,拍出来的天上的云彩和肉眼所见的感觉差不多,我也就这点追求了Orz|||所见即所得……
满意,爬走~~
啊,放几张刚才喀嚓的片片吧。这是摸新相机几分钟的人拍的,所以如果觉得很烂的话,也请包涵……


入夏了
元太初 发表于 2009-05-17 11:21:37
之前在德国时住的宿舍,第一个夏天阴凉舒爽与众不同,我硬是怀疑人家闹鬼还煞有介事地思考了好一会儿。所以后来大概那位全天然制冷机怒了,说我明明是英俊潇洒(或者)风流袅娜的仙人,你居然怀疑我是冤魂,实在不识好歹,老子以后不保佑你了!
——所以现在,本人的小黑屋朝北,窗前有棵松树,时有松鼠上下,冬天阴冷无光,夏天炎热难当。夏天了,于是炎热了。坐在窗前都能感觉到热浪一阵阵扑面而来。也就是说我以前躲在小黑屋里自己玩的光荣传统是坚持不了了,我只能好好学习天天向上地去蹲实验室……蹭空调。
学习在我是最后一种选择——也就是说但凡有可能,在下都要先玩了再说。这是什么时候养成的坏习惯呢?经过深刻严肃地自我剖析,是从高中时代开始的……一切都要从学校里那位肤若凝脂眼含秋水隆准菱唇瓜子脸的帅哥,长咧了说起。那之后顿时觉得上学了无生趣,假期有气无力,人生没了盼头。你说,那么美的绝代佳人,都有可能发生如此的人间惨剧,这人生还有什么意义呢?
但人生即使没有了意义,也不能就此驾鹤西去,好歹还是要苟延残喘的。因为世界上毕竟还是有很多帅哥等待在下去萌去发现,去欣赏去配对的~为了实现这一目标,有时候就不得不对现实妥协,偶尔也要好好学习一下,以换得盘缠银两,好继续糟蹋人生。
如今堕落又到了一个阶段,需要暂时收心运气鸟= =|||这样才能在六月中时大喝一声“I am back!”……
前段时间的生活,其实过得没啥意义。就是填补了一下知识空白。比如宫崎骏的一堆动画(我之前还真没完整地从头到尾看过),还有一些香港老电影。最近心灵空虚,而且对电视剧绝望之后,要求降低,反而能从中获得乐趣。比如最近就连熬两个通宵,看了《宝莲灯前传》,还觉得挺不错的Orz。怨念就是,为毛大金乌要死掉,为毛哮天犬不找帅哥演(当然要找帅哥演估计是通不过审查了,那RP的对话……)?
一堆天涯的鬼故事,比如091气象所,搞鬼一家人,七域杀机,莫问天机,饕餮饲养指南,灵异第五科,黄金鬼捕,无证驱魔,湘西鬼事,恢复更新的大漠苍狼,还有无穷多,几乎把莲蓬翻了个底儿掉。又得养肥一段再杀了。
正宗耽美看得倒少了。
下午刚看了一篇,感觉还不错。名字是《佛说仕途一场梦》。难得有篇文,我觉得非圆满结局反而是比较圆满的,两位男主的性格我也都挺喜欢。[不像很多文,我看完要么恨渣攻要么恨渣受要么恨作者要么恨自己浪费时间……都快赶上七大恨了……]
类似感觉不错的还有景帝纪事,但主角的性格不够妙,还是今日看的更合我的脾胃。
现在喜欢看暧昧多过看H,看主角相互尊重心灵伙伴多过强制爱你追我逐,所以难怪会泡在鬼话出不来。因为除了BG气场特别强的玛丽苏过度的,一般都会有双男主,至少有抢眼男配可以供我脑补。
这遭瘟的世界哟Orz
元太初 发表于 2009-05-04 16:23:35
于是老天爷终于看不过眼,来给我下猛药了。
先来一个明显的种族掐架贴。但最终老天爷发现我已经没志气到连小康被黑都不在意了,继续愉快刷其他贴中,他不得不给我来狠的。
遭瘟的小粉红出现了。首页一片狼藉,竟无可看可Y可萌之有爱贴=口=|||这在我多年小粉红的经验中也是少有的。
我,我还是去看医学图像学去吧……两害相权取其轻,那玩意儿虽然不萌,好歹也不恶Orz
……泪指,算你狠!!!
暂时拜别小粉和阿耽还有玄幻鬼话,待日后养肥了再杀贴~~~
Wall E
元太初 发表于 2009-04-16 15:37:53
我喜欢这只小机器人很久了。
人问我为啥喜欢他,我说:楚楚可怜。
整个电影最喜欢看到瓦力蹙起眉眼,瞪着亮晶晶的大眼睛,发出无辜的“呜呜”声。
越是忙碌的时候,越是要浪费时间。
于是今晚爬回家,硬撑着打架的眼皮,还是坚持看了一遍。
现在能看进去的BG感的片子,怎么都是G攻呢?
面食——饺子包子以及剩下的粉变成的馒头
元太初 发表于 2009-04-05 13:52:42
掺发酵粉和了面,用一部分做了饺子皮,煮起来也没啥,就是在锅里时饺子都涨成气球状了Orz
这些饺子是前几天做的时候拍的。

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

上笼蒸出来就成这样了,

这次粉发得不是很好,我觉得我发酵粉掺少了。之后用剩下的面做的馒头虽然也发起来了,但不够蓬松。需要寻找关键技术以求改进啊~
现在每天不务正业,不是看小说就是做吃的Orz|||泪奔~~~想吃什么都要自己动手,好惨啊……
烤红薯
元太初 发表于 2009-04-04 06:47:35
烤箱375F预热5分钟以上(相当于摄氏190度的样子)
然后将小红薯放进去,不用洗,不用去皮,什么都不用做~
烤1小时,在过程中大概10分钟去翻一下面.
出来的结果是皮肉分离水嫩嫩的红心红薯~味道非常好~居家旅行必备的点心啊~
一个小小的无聊的程序
元太初 发表于 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;
}
