嚎叫一声  
让我尝试写一些opengl的东西吧
公告
日历
<2009年7月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678
统计
  • 随笔 - 73
  • 文章 - 0
  • 评论 - 204
  • 引用 - 0

导航

与我联系

搜索

 

常用链接

留言簿

我参与的团队

随笔分类

随笔档案

相册

blog

links

宠物

积分与排名

  • 积分 - 57222
  • 排名 - 1072

最新评论

阅读排行榜

评论排行榜

 

2009年3月17日

自前一次战斗以来,倜斯族一直享受着和谐与宁静。不过沃尔纳特族这次又展开行动了,他们妄图侵略倜斯的领地。
这一次,倜斯族增加了强悍的佛斯倜斯,他们是武装了乳白色防酸腐蚀侵害的钛合金的倜斯族战士。
还有专门为了对付沃尔纳特而被制造的沃尔纳特夹子。他们与沃尔纳特族展开了激烈的战斗。
无数的沃尔纳特被肢解,而后倜斯们分享了大量战利品:沃尔纳特肉。

这是一场正义的战争,伟大而又激烈!

posted @ 2009-03-17 13:31 kaikai 阅读(45) | 评论 (0)编辑

2009年3月1日

好久没写点什么了。
浮点数在fpu上处理有个精度控制,可以是单精度(长32bit其中尾数24bit),双精度(长64bit尾数56bit),扩展精度(长80bit,尾数64bit)。这是通过浮点控制字的一个位段来控制的。
在windows/vc环境(未证实,也许与编译器有关,比如是vc)下,默认的精度是双精度。
在linux/gcc环境则默认是扩展精度。
这可以造成你在含有浮点计算的程序移植时出现一些细微的差异。
win/vc可以通过_controlfp函数改变默认设置,linux/gcc则是用_FPU_SETCW宏。
另外要说一点,dx初始化时可以选择浮点的精度为单精度,那个接口最终应该也是通过改变fpu的控制字实现的。
posted @ 2009-03-01 12:24 kaikai 阅读(85) | 评论 (0)编辑

2008年2月13日

     摘要: 翻到以前写的一个程序。贴出来优先推理,无法确定的情况下找分支最少的一个去猜,并把当前状态保存,以备将来回溯。#include<cstdio>#include<cstring>#include<cassert>#include<vector>#include<algorithm>usingnamespacestd;structNode{ch... 阅读全文
posted @ 2008-02-13 13:55 kaikai 阅读(952) | 评论 (0)编辑

2008年2月12日

天龙八部中,姑苏慕容家婢女阿朱本是大理镇南王段正淳和阮星竹所生的两个女儿之一。她与乔峰历经坎坷之后情投意合,本打算在乔峰报了血海深仇之后一同放牛牧马过平谈快乐的生活。谁知道机缘巧合,居然让阿朱为了救自己生父段正淳而不得与亲人相认,甚至还要替父而死。

阿朱重情重义,甘愿舍身为乔峰而死。实在让我很感动。爱一个人可以爱到这样的地步。唉,只能叹息造物弄人,让有情人不能团聚,让骨肉分离。

因为段王爷的那无关生死的花心大萝卜行为经过一连串的事件放大之后可以造成无数的惨案和悲剧。蝴蝶效应应该是金大侠发现的才对~跑题了。

只能说阿朱太好了。好到太为乔峰着想了。假如有一些话能挑明,能再说得清楚一些。应该就不会有这样不幸的结局了。一连串事情实在太巧了,巧得让人觉得假...真希望阿朱没有死。

阿朱,走好~
posted @ 2008-02-12 23:21 kaikai 阅读(335) | 评论 (0)编辑

2007年7月19日

一个只包含EOF三个字符的字符串,并且不存在连续的O,问长度为n的这种串有多少种。
其中0<n<40。

递推: e'=e+o+f, o' =e+f, f'=e+o+f
// 预处理查表
main(i,n){__int64 d[39]={1,1,1,3};for(;i<39;i++)d[i][1]=d[i-1][0]+d[i-1][2],d[i][2]=d[i][0]=d[i][1]+d[i-1][1],d[i][3]=d[i][1]+d[i][0]*2;while(~scanf("%d",&n))printf("%I64d\n",d[n][3]);}
// 把eof分开存,去掉二级数组的括号
main(i,n){__int64 e[39]={1},o[39]={1},f[39]={1},s[39]={3};for(;i<39;i++)f[i]=e[i]=(o[i]=e[i-1]+f[i-1])+o[i-1],s[i]=o[i]+e[i]*2;while(~scanf("%d",&n))printf("%I64d\n",s[n-1]);}
// e,f总是一样的,于是去掉f
main(i,n){__int64 e[39]={1},o[39]={1},s[39]={3};for(;i<39;i++)e[i]=(o[i]=e[i-1]*2)+o[i-1],s[i]=o[i]+e[i]*2;while(~scanf("%d",&n))printf("%I64d\n",s[n-1]);}
// 与其保存总和,不如结果时计算一下
main(i,n){__int64 e[39]={1},o[39]={1};for(;i<39;i++)e[i]=(o[i]=e[i-1]*2)+o[i-1];while(~scanf("%d",&n))printf("%I64d\n",o[n-1]+e[n-1]*2);}
// 不再查表,按需计算
main(i,n){__int64 e,o,t;for(;~scanf("%d",&n);printf("%I64d\n",o+e+e))for(i=e=o=1;i<n;i++)t=o,e=(o=e+e)+t;}
// 调整一下递推式
main(n){__int64 e,o,t;for(;~scanf("%d",&n);printf("%I64d\n",o+e+e))for(e=o=1;--n;e=(o=e+e)+t)t=o;}
// 再调整递推式,去掉临时变量
main(n){__int64 e,o;for(;~scanf("%d",&n);printf("%I64d\n",o+e+e))for(e=o=1;--n;o=e-o)e+=e+o;}
// 多一次循环,结果就是e
main(n){__int64 e,o;for(;~scanf("%d",&n);printf("%I64d\n",e))for(e=o=1;n--;o=e-o)e+=e+o;}
农夫三拳,这下你还能更短吗。嘿嘿嘿:)
posted @ 2007-07-19 11:44 kaikai 阅读(321) | 评论 (1)编辑

2007年7月18日

给定一个日期,输出这个日期是该年的第几天。输入数据有多组,每组占一行,数据格式为YYYY/MM/DD组成。对于每组输入数据,输出一行,表示该日期是该年的第几天。
比如
1985/1/20
2006/3/12
输出
20
71
main(y,m,d){while(scanf("%d/%d/%d",&y,&m,&d)==3){char s[]={0,1,-1,0,0,1,1,2,3,3,4,4};m--;d+=m*30+s[m],(y%400==0||y%100&&y%4==0)&&m>1&&d++;printf("%d\n",d);}}

int s[]={0,1,-1,0,0,1,1,2,3,3,4,4};main(y,m,d){for(;~scanf("%d/%d/%d",&y,&m,&d);printf("%d\n",d+m*30+s[m]+!((y%400&&0==y%100||y%4)||m<2)))m--;}

int s[]={0,1,-1,0,0,1,1,2,3,3,4,4};main(y,m,d){for(;~scanf("%d/%d/%d",&y,&m,&d);printf("%d\n",d+m*30+s[m]+!(y%400&&0==y%100||y%4||m<2)))m--;}

int s[]={0,1,-1,0,0,1,1,2,3,3,4,4};main(y,m,d){for(;~scanf("%d/%d/%d",&y,&m,&d);printf("%d\n",d+m*30+s[m]+!(y/100%4||y%4||m<2)))m--;}

int s[]={0,1,-1,0,0,1,1,2,3,3,4,4};main(y,m,d){for(;~scanf("%d/%d/%d",&y,&m,&d);printf("%d\n",d+m*30+s[m]+!(y/100%4+y%4||m<2)))m--;}

main(y,m,d)
{for(;~scanf("%d/%d/%d",&y,&m,&d);printf("%d\n",d+m*30+"bcabbccdeeff"[m]-'b'+!(y/100%4+y%4||m<2)))m--;}

main(y,m,d)
{for(;~scanf("%d/%d/%d",&y,&m,&d);printf("%d\n",d+m*30+"BCABBCCDEEFF"[m-1]-96+!(y/100%4+y%4||m<3)));}


main(y,m,d)
{for(;~scanf("%d/%d/%d",&y,&m,&d);printf("%d\n",d+m*30+"XBCABBCCDEEFF"[m]-96+!(y/100%4+y%4||m<3)));}

main(y,m,d)
{for(;~scanf("%d/%d/%d",&y,&m,&d);printf("%d\n",d+m*30+"XBCABBCCDEEFF"[m]-95-(y/100%4+y%4||m<3)));}
不多解释了...

也许这里只有y/100%4+y%4判断是否是闰年有点价值吧...
posted @ 2007-07-18 23:35 kaikai 阅读(298) | 评论 (1)编辑

2007年7月14日

问题:
输入两点坐标(X1,Y1),(X2,Y2),计算并输出两点间的距离。
输入数据有多组,每组占一行,由4个实数组成,分别表示x1,y1,x2,y2,数据之间用空格隔开。
对于每组输入数据,输出一行,结果保留两位小数。
比如,输入:
0 0 0 1
0
 1 1 
0
那么输出:
1.00
1.41

题目很简单,甚至有点无聊了。
#include <math.h>
int main()
{
   
float
 a,b,c,d;
   
while(scanf("%f%f%f%f",&a,&b,&c,&d
)==4)
    {
        printf(
"%.2f\n",sqrt((a-c)*(a-c)+(b-d)*(b
-d)));
    }
    return 0;
}
好吧,第一个看上去已经挺短的了。好吧,换编译器,用c的编译器,gcc,vc也可以(存.c文件)。这样可以利用一些c的'好处',至少对缩短代码来说是好处。
#include <math.h>
main()
{
   
float
 a,b,c,d;
   
while(scanf("%f%f%f%f",&a,&b,&c,&d
)==4)
        printf(
"%.2f\n",sqrt((a-c)*(a-c)+(b-d)*(b
-d)));
}
默认函数返回类型为int,返回值?我管它是多少呢,短就行了。去掉不必要的空白。
#include<math.h>
main(){float a,b,c,d;while(scanf("%f%f%f%f",&a,&b,&c,&d)==4)printf("%.2f\n",sqrt((a-c)*(a-c)+(b-d)*(b-d)));}
125
可惜,怎么还得留着math.h,否则sqrt未定义的情况c语言认为它是一个返回int的函数,于是链接时没能链接到我们想要的函数。
继续缩短,那段差的平方很扎眼,那么多括号。scanf的返回值比3大和等于4也差不多了,总不至于要求4个输入,却得到5个吧。也改了
#include<math.h>
main(){float a,b,c,d;while(scanf("%f%f%f%f",&a,&b,&c,&d)>3)a-=c,b-=d,printf("%.2f\n",sqrt(a*a+b*b));}
118
while和for的长度其实是一样的,虽然for比while少2个字母,但for语句要多2个分号。算是打平,不过其实不然。注意当循环体有多句的时候,把最后一句放到for的末尾,还可以节约一个逗号- -
#include<math.h>
main(){float a,b,c,d;for(;scanf("%f%f%f%f",&a,&b,&c,&d)>3;printf("%.2f\n",sqrt(a*a+b*b)))a-=c,b-=d;}
117
那个包含文件真讨厌,而且非得换行。要是能去掉它就好了。既然我只是为了要sqrt,为什么不自己声明一下呢。
double sqrt();main(){float a,b,c,d;for(;scanf("%f%f%f%f",&a,&b,&c,&d)>3;printf("%.2f\n",sqrt(a*a+b*b)))a-=c,b-=d;}
114
嗯,看来确实短了一些。double和float能通用吗?也许不能吧,要不试试?
float sqrt();main(){float a,b,c,d;for(;scanf("%f%f%f%f",&a,&b,&c,&d)>3;printf("%.2f\n",sqrt(a*a+b*b)))a-=c,b-=d;}
113
居然可以,输出结果正确。奇怪啊...反编译一下。哦。原来作为参数,float也被转为double类型压栈。这个可能不太保险,天知道是不是所有机器都压double呢- -。不过好在这里能凑合,那x86的估计也都能。
啊呀,我傻啊,为什么有2个float在代码里!怎么不把它们合并了?
main(){float sqrt(),a,b,c,d;for(;scanf("%f%f%f%f",&a,&b,&c,&d)>3;printf("%.2f\n",sqrt(a*a+b*b)))a-=c,b-=d;}
107
农夫三拳想出了一个方法,他提示到“-1的二进制”。哦!对了,当scanf遇到输入结束时返回EOF,那就是-1。-1的二进制为全1,也就是说反码为0。好吧,感谢农夫三拳让我再缩短一个字节,让>3见鬼去吧~
main(){float sqrt(),a,b,c,d;for(;~scanf("%f%f%f%f",&a,&b,&c,&d);printf("%.2f\n",sqrt(a*a+b*b)))a-=c,b-=d;}
106
结束...
如果您有更bt的想法能缩短代码,请别忘了告诉我~
posted @ 2007-07-14 09:55 kaikai 阅读(427) | 评论 (8)编辑

2007年5月8日

我的结果:
Psytopic分析:您的性格类型是“ISTP”(内向+实感+思维+知觉)

容忍,有弹性;是冷静的观察者,但当有问题出现,便迅速行动,找出可行的解决方法。能够分析哪些东西可以使事情进行顺利,又能够从大量资料中,找出实际问题的重心。很重视事件的前因后果,能够以理性的原则把事实组织起来,重视效率。

ISTP型的人坦率、诚实、讲求实效,他们喜欢行动而非漫谈。他们很谦逊,对于完成工作的方法有很好的理解力。 ISTP型的人擅长分析,所以他们对客观含蓄的原则很有兴趣。他们对于技巧性的事物有天生的理解力,通常精于使用工具和进行手工劳动。他们往往做出有条理而保密的决定。他们仅仅是按照自己所看到的、有条理而直接地陈述事实。 ISTP型的人好奇心强,而且善于观察,只有理性、可靠的事实才能使他们信服。他们重视事实,简直就是有关他们知之甚深的知识的宝库。他们是现实主义者,所以能够很好地利用可获得的资源,同时他们擅于把握时机,这使他们变得很讲求实效。ISTP型的人平和而寡言,往往显得冷酷而清高,而且容易害羞,除了是与好朋友在一起时。他们平等、公正。他们往往受冲动的驱使,对于即刻的挑战和问题具有相当的适应性和反应能力。因为他们喜欢行动和兴奋的事情,所以他们乐于户外活动和运动。

您适合的领域有:技术领域 证券、金融业、贸易、商业领域 户外、运动、艺术等

您适合的职业有:

· 信息服务业经理
· 计算机程序员
· 警官
· 软件开发员
· 律师助理
· 消防员
· 私人侦探
· 药剂师
· 证券分析员
· 银行职员
· 管理顾问
· 财务顾问
· 电子专业人士
· 技术培训人员
· 信息服务开发人员
· 软件开发商
· 海洋生物学者
· 后勤与供应经理
· 经济学者
· 贸易商
· 商品经销商
· 产品代理商(有形产品)
· 警察
· 侦探
· 体育工作者
· 赛车手
· 飞行员
· 雕塑家
· 手工制作
· 画家
posted @ 2007-05-08 21:08 kaikai 阅读(248) | 评论 (3)编辑

2007年4月4日

使用Sketchup作为nebula2的场景编辑器
--kaikai

极短的简介
==========
Sketchup作为一个快速建模软件,有着易学易用、简洁高效的特点。十分适合美术以及关卡设计师使用。

组件 Component
==============
要编辑场景,必须把各个需要用到的模型转为组件,然后在把组建拖放到场景内摆放组合。组件区别于实际用于游戏中的组件模型,它可以是组件模型的简化甚至可以是象征。
概念
 组件定义Component Definition
  组件的内容
 组件实例Component Instance
  组件在场景的引用,包含位置、方向、缩放、别名等信息
规则
 1 组件要导出必须有文件名(注意此条规则可以去除,保留它仅仅了导出后可以导入)
 2 组件实例可以自定义组件名:右键点击组件实例,选择Entity Info,在弹出的Entity Info窗口内Name字段填写。
  自定义组件名用于程序识别组件的逻辑意义。比如同样的多个交通灯组件实例,可以分别定义组件名为:TrafficLightA, TrafficLightB, TrafficLightC等。

额外的配置文件
==============
为了赋予组件更多的功能,需要提供更多的信息来区分组件的性质。使用一个额外的配置文件来保存这些信息
概念
 唯一名称 Unique name
  组件定义的文件名,如 box.skp
 自定义组件名 Name
  标志组件逻辑的名字,参见 组件-规则-2
 输出路径 path
  相对路径,按组件类型不同对应不同的根路径
 摆放类型 Transform
  由平移(Position)、旋转(Rotation)、缩放/拉伸(Scale)的缩写PRS组成,如P,R,S,PR,PS,RS,PRS
 类型
  区分组件使用方法的名字,分为Graphics,Triggers,Collision,NamedPos等
 Graphics
  场景元素,组件是任意网格模型,可以被平移、旋转、缩放/拉伸(PRS)。
 Triggers
  触发器,组件是单位立方体,可以平移、旋转、缩放/拉伸(PRS)。
 Collision
  场景物理碰撞模型,组件是任意网格模型,可以平移、旋转(PR)但不能缩放/拉伸(S)。(ode不支持geom的缩放/拉伸)
  也可以是单位立方体/单位球/单位胶囊体(单位圆柱体两侧连2个单位半球体),可以平移、旋转、缩放/拉伸。(通过ode的内置几何体参数实现缩放/拉伸)球体只能缩放,不能拉伸;胶囊体只能缩放不能拉伸,但可以把圆柱体部分拉伸。
 NamedPos
  出生点SpawnPos, 目标点ExitPos等等逻辑坐标。可以平移、旋转(PR)。
规则
 1 Graphics组件的配置文件信息包含:unique name, name, path, transform, type。其中type为区分


导出流程
========
 1 带有组件的skp -(使用本项目附带的sketchup插件导出)-> map文件
 2 map文件 + xml配置文件 -(map2xml转换)-> 场景xml文件
 3 场景xml文件 -(nsketchupmaploader读取)-> mangalore场景

 

posted @ 2007-04-04 23:43 kaikai 阅读(505) | 评论 (2)编辑

2007年2月26日

例如:6的因数有1,2,3,6,它们的和是12
下面求n^m的所有因数之和除以一个数s的余数.
#include <cassert>
#include 
<vector>
using namespace std;

static vector<int> primes;
bool IsPrime(int n)
{
     
for(size_t i = 0; primes[i] * primes[i] <= n; i++)
     
{
          
if (n % primes[i] == 0)
               
return false;
     }

     
return true;
}


int GetPrime(size_t index)
{
     assert(index 
< 10000);
     
     
if (index >= primes.size())
     
{
          
if (primes.size() == 0)
          
{
               primes.reserve(
10000);
               primes.push_back(
2);
               primes.push_back(
3);
               primes.push_back(
5);
               primes.push_back(
7);
          }

          
for (int t = primes.back() + 2; index >= primes.size(); t += 2)
          
{
               
if (IsPrime(t))
                    primes.push_back(t);
          }

     }

     
     
return primes[index];
}


__int64 PowerMod(__int64 n, __int64 m, __int64 s)
{
    __int64 t;
    
for(t = 1; m; m >>= 1)
    
{
        
if (m & 1)
            t 
= t * n % s;
        n 
= n * n % s;
    }

    
return t;
}


int SumFactorMod(int n, int m, int s)
{
     
int t;
     
int sum = 1;
     
for(t = 0; n > 1; t++)
     
{
          
int p = GetPrime(t);
          
int q = 0;
          
while(n % p == 0)
               n 
/= p, q++;
          
if (q)
          
{
              
/* 
              若 n = PI{pi^qi}   pi为质数,则sum可以表示为 PI{ f(pi, qi) }
              其中的f(p, q) = p^0 + p^1 + P^2 +  p^q  = (p^(q+1) - 1) / (p-1)
              于是,要求的值sum % s = PI{ f(pi, qi) % s } % s
              其中f(p, q) % s = (p^(q+1) - 1) / (p-1) % s
              由x/y%z = x%(y*z)/y得到
              f(p, q) % s = (p^(q+1) - 1) % (s * (p-1)) / (p-1)
              = (p^(q+1) % (s*(p-1)) + (s*(p-1)-1)) % s*(p-1) / (p-1)
              其中 p^(q+1) % (s*(p-1)) 可以用PowerMod快速求解得到
              
*/

              q 
*= m;
              __int64 sp_1 
= __int64(s)*(p - 1);
              __int64 t 
= PowerMod(p, q+1, sp_1);
              t 
+= sp_1 - 1;
              sum 
*= t % sp_1 / (p - 1);
              sum 
%= s;
          }

     }

     
return sum % s;
}


int SumFactorMod(int n, int s)
{
     
return SumFactorMod(n, 1, s);
}

补充:把注释补充了一下,有人对"若 n = PI{pi^qi}   pi为质数,则sum可以表示为PI{ f(pi, qi) }"不理解。下面粗略推导一下:
n = PI{pi^qi}   pi为质数
则n的因数可以列为:a1, a2, ... a(PI{qi+1}) 按p0因数出现的次数排列如下:
a1=1               aq0+1=p1               ...         a(PI{qi+1}-q0+1) =p1^q1*p2^q2*...*p0^0
a2=p0             aq0+2=p1*p0         ...         a(PI{qi+1}-q0+2) =p1^q1*p2^q2*...*p0^1
a3=p0^2         aq0+3=p1*p0^2     ...         a(PI{qi+1}-q0+3) =p1^q1*p2^q2*...*p0^2
...                    ...                                        ...
aq0=p0^q0     aq0+q0=p1*p0^q0 ...         a(PI{qi+1}) =p1^q1*p2^q2*...*p0^q0
由乘法原理可知:
这些因数中有0个pi因子的因数有PI{qi+1}/(qi+1)个
有1个pi因子的因数也有PI{qi+1}/(qi+1)个
...
有qi个pi因子的因数也有PI{qi+1}/(qi+1)个
这qi+1组PI{qi+1}/(qi+1)个数的集合,如果分别去除pi因子,则刚好是完全相同的集合。
这个集合就是n去除了因子pi后的数字 n / pi^qi 的因子集合。
于是有 g(n)=(pi^0+pi^1+...+pi^qi)*g(n / pi^qi)
也就是g(n)=PI{pi^0+pi^1+...+pi^qi}
posted @ 2007-02-26 00:26 kaikai 阅读(385) | 评论 (0)编辑
 
Copyright © kaikai Powered by: 博客园 模板提供:沪江博客