近日写东西时发现数学有些生疏,便回去温习,看了几天的书,感觉对数学的一些基本概念又有了新的认识,然而其正确性,有待商榷,怕要等高人指点了。

  首先说下运算。鄙人窃以为运算的本质乃是转换,将输入通过约定的方法转换为输出。所以说函数(Function)、映射(Mapping)和转换(Transformation)指的都是同一个意思,将一个集合与另一个集合相关联的方法(《计算机图形学几何工具算法详解》中提到过这样的话)。因此我们学习数学最重要的是要学习数学解决问题的方法。

  再次说一下"数学空间"。数学中所说的"空间"不同于我们日常认知的空间,我们日常所谓的空间一般是指数学中的几何空间,是我们眼睛所能感受到的。数学空间是指一种具有特殊性质及一些额外结构的集合(取自维基百科),而通过一些数学空间的观察,定义中所谓的"额外结构"通常是"特殊性质"的诱因,如同数据结构中的结构常常决定性质,因此此处定义中"性质"和"结构"到底谁应该是主体还有待学习。

  上述定义中说的明白,数学空间是一种集合,那么此处拿我们3D中的线性空间来说,线性空间中定义了向量这种结构,用来表示具有多重性质的量(我想说物理量,但是不知道是否准确),而向量这种结构一方面又决定了线性空间的性质。但是向量是什么样子的,我们还是不知道,因为缺乏一种直观的描述,而直到人们拿解析几何来描述线性空间,我们才最终模拟出向量(此处是假设说法,本人对线性代数的发展也不甚了解)。然后通过对线性空间的补充,衍生出其子空间欧几里得空间,采用笛卡尔坐标系的欧几里得空间是我们图形学中最长用到的。然而,事实上,欧几里得空间并非是单纯的线性空间,线性空间没有定义点的存在,仿射空间才是描述点的空间,而二者中的任何一个都不能单独的解决一些我们图形学中的问题,所以将二者结合起来,构成欧几里得空间来完成这种使命,因此,可以说欧几里得空间是线性空间和仿射空间的重叠(Wiki中说是向量空间作用于仿射空间,我不知道哪种说法更为精准)。

  本人水平有限,再说下去怕要倒得满腹空空了,就此罢笔。文中遗漏错误之处有幸落入哪位高人法眼,烦请指正。

Read More
发帖者 Lain on 星期二, 十二月 09, 2008
1 评论
categories: | |

申请下MythLain这个域名,然后好不容易找到了这个比较满意的模板,
最终停顿下来,想,我应该定一个怎样的名字.......

昨天看到一款WII游戏,LostWinds----"迷失的风",对"迷失"二字突生
感想。

最近半年一直生活在矛盾中,一边尽量的克制着自己努力的学习游戏开
发,一方面又时不时的自问开发游戏是否有悖于信仰,违背了自己的信念。
业力推动着轮回流转,我辈挣脱不得,从佛修行,即是希求减轻业力,脱离
轮回之苦。而我所从事的,或者我欲要从事的,游戏,是否导致了无数人迷
失于虚幻的世界?我有时坚信、有时怀疑,面对内心考问,我从容不来。
最近一次谈论,是和大哥的电话中,我说,我其实最想去做PC的单机游
戏,可惜国内环境没有单机厂商的生存空间。

原来我也迷失于自己的世界,时而此、时而彼,不知对错的方向。虽我
不过一区区书生、小小程序,如沧海一粟、恒河一沙,除了我自己无人在乎
我的对错。然而因果循环、报应不爽,我辈岂敢不惧今日做因明日食果。

我迷失于这个世界
沙砾堆砌出彼此的边界
哪里是对
哪里是错
哪粒是你
哪粒是我
风
怒吼着问我
霎时
左右易位
彼此相合
我抬头看他
风也困惑

Read More
发帖者 Lain on 星期二, 十二月 02, 2008
1 评论
categories: | |

  今日写向量类,不想对const的使用又有了些生疏,竟然有些 地方判断错误,于是又重新整理了一下const的要点,如下。

  1.修饰常量:const int val = 100.
  const常量和#define定义的宏常量的区别在于:const常量用数据类型,因此编译器会对其进行类型安全检查,而宏常量没有类型,当然不会进行检查,所以相比之下,const常量更为安全一些。

  2.修饰指针:
  <1> const type *var 或者 type const *var
  此种类型const限定的是指针指向的对象:"指向const对象的 指针"。
  eg:
/*****
  测试const 与指针的用法
  测试const type * var
  *****/
  #include<iostream>
  using namespace std;
  int main()
  {
  int a=0,b=1;
  const int *p=&a;
  a=2;
  p=&b;
  //*p=3;error: assignment of read-only location
  cout << "a=" << a << endl;
  cout << "*p=" << *p << endl;
  }
  /*****
  测试结果:
  通过const type * var_name或者type const * var_name
  声明的指针具有以下特点:
  1.可以修改指针指向的对象
  2.不可以通过指针修改它指向的对象
  3.指针指向的对象也可以被修改
  ****/

  <2> type * const var:
  此类是const指针:const指针所指的地址不能改变,即指针的 指不能变。
  eg:
  /*****
  测试const 与指针的用法
  测试type * const var
  *****/
  #include<iostream>
  using namespace std;
  int main()
  {
  int a=0,b=1;
  int * const p=&a;
  a=2;
  //p=&b;error:assignment of read-only location
  *p=3;
  cout << "a=" << a << endl;
  cout << "*p=" << *p << endl;
  }
  /*****
  测试结果:
  const声明的是指针,所以指针指向的对象唯一确定,不能改变
  但是对象值是可以改变的。
  *****/

  <3>const type *const var:
  指向const变量的const指针。

  3.const修饰类的数据成员:
  类声明中不能初始化const数据成员,const数据成员只能在构造函数的初始化列表中进行初始化。

  4.const修饰函数返回值:
  const修饰函数返回值,如果返回值是某个对象时,此时多用于操作符的重载。除此之外,最好不要用 修饰返回值为对象类型或者对象引用的情况。
  <1>函数返回const指针,只能将指针赋值给const修饰的同类型指针变量
  <2>函数返回值为值传递时,函数会把返回值赋值给外部的临时变量,此时用const没有任何意义。
  <3>引用返回,很少用到,要保证返回值为一个全局变量。一般只出现在类的赋值函数中,以达到实现链式表达的目的。

  5.const修饰成员函数:
  f( ) const:用来保证数据成员在函数中不会被更改,但是用关键字mutable可以突破这种限制。

  总结:
  1.任何可能的情况下都应该使用const
  2.注意const赋值操作容易出现的错误
  3.不要轻易将函数返回值定义为const,除非必要
  4.非const引用必须有精确匹配的左值,而const引用不必
  5.const在类成员函数中的灵活用法

Read More
发帖者 Lain on
2 评论
categories: | |

文章分类

朋友群