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

  首先说下运算。鄙人窃以为运算的本质乃是转换,将输入通过约定的方法转换为输出。所以说函数(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: | |

文章分类

朋友群