30 May 2011

NURBS



degree (度)

linear = 1
quadratic = 2
cubic = 3
quintic = 5
连续性和度数是有关系的。一个度数为3的等式能产生C2连续性曲线

order (阶)

degree表示的是曲线的数学方程的度数,而order则是曲线的阶数,两者相差1
order表示对曲线上的任意一点,有几个控制点会影响它

每order个相邻的控制点形成一个span,所以span可以由控制点数和order来定义: span = cv - order + 1

control points (控制点)

控制点数量应该>=order,所以对于一条直线,至少有两个控制点
每个控制点可以有权重(weight),所有控制点权重相同(1)称为非有理(non-rational)
Nurbs中r表示rational,即可以有理,而不是一定有理。实际中,大多数curve都是非有理的,只有少数如circle,ellipse是有理的。(cricle的控制点权重不同)
一个控制点可以同时控制order个个数的曲线段

knots vector(节点向量)

节点向量是一组个数为(degree+num_of_control_point-1)的
节点向量需要符合两个条件
数字需升序排列
相同的数字重复次数不超过degree
相同数字的重复的次数称为multiplicity,multiplicity为1的knot value成为simple knot;multiplicity为degree的knot value称为full-multiplicity knot.
如一个degree为3的curve的节点可能为:(0, 0, 0, 1, 2, 2, 2, 7, 7, 9, 9)
度为3,有7个控制点,knot vector为(0,0,0,1,2,3,4,4,4),此处该knot vector是uniform的(均匀的)
首尾是full multiplicity knot
中间是simple knot
knot value是平均分布的

Nurbs中的Nu是指Non-Uniform,就是Nurbs允许非均匀的节点向量。

均匀与非均匀的主要区别在于节点向量的值。如果适当设定节点向量,可以生成一种开放均匀样条,它是均匀与非均匀的交叉部分。开放样条在两端的节点值会重复d次,其节点间距是均匀的。

中间的multiplicity knot会使曲线不平滑
控制点与节点向量是成组配对的:每 2 * degree个knots与degree+1个控制点对应
knot span: The range of parameter values between two successive knots in a spline.

Fit Point (插值点)

曲线上的点,点之间由插值计算而来

basis function

Nurbs中的bs表示basis function
Nurbs可以看做一个函数:(x, y, z) = bs_degree_knots_control_points(t),输入一个参数,输出一个点

样条

样条通常是指分段定义的多项式参数曲线
B-样条是样条曲线一种特殊的表示形式,使用basis function为其样条函数
样条插值通常比多项式插值好用, 用低阶的样条插值能产生和高阶的多项式插值类似的效果
B-spline frequently refers to a spline curve parametrized by spline functions that are expressed as linear combinations of B-splines (in the mathematical sense above)

Questions

什么是样条
什么是B样条
B样条和样条有什么区别

References
http://www.pinxue.net/OpenGL/nurbs/NURBS.htm
http://en.wikipedia.org/wiki/Non-uniform_rational_B-spline
http://www.rhino3d.com/nurbs.htm
http://ibiblio.org/e-notes/Splines/Intro.htm
http://zh.wikipedia.org/zh/%E6%A0%B7%E6%9D%A1%E5%87%BD%E6%95%B0
http://zh.wikipedia.org/zh/B%E6%A0%B7%E6%9D%A1
http://www.opengl.org/sdk/docs/man/xhtml/gluNurbsCurve.xml
http://docs.google.com/viewer?url=http://www.cs.duke.edu/courses/fall05/cps124/notes/10_curves/opengl_nurbs.pdf

27 May 2011

python的vim IDE环境搭建



python的vim IDE环境搭建
VIM安装,配色,插件...讲解文章遍地都是,就不写了,随便放狗一搜就行.
简单记录下针对python的几个东东

1.自动完成

虽然full vim已经自带了Python的omnifunction了,但是实在是单薄了点。这时就需要pydiction这个神器了。这家伙有3个组成部分。一个是插件本身python_pydiction.vim,另外一个是生成diction文件的python脚本pydiction.py,最后是一个自带的complete-dict文件

如果你是windows,就把python_pydiction.vim放在vim runtimepath路径下的ftplugin目录下,然后在vimrc中加入“filetype plugin on”,最后,设定一个全局变量指向需要的字典文件
let g:pydiction_location = ‘C:/vim/vimfiles/ftplugin/pydiction/complete-dict’

如果你发现你要的python模块没有加入到字典文件中,比方说web.py就没有加入,那就跑到放complete-dict的目录下,执行
python pydiction.py web

2.F5自动运行

只要在vimrc里写上
au BufRead *.py map <buffer> <f5> :w<cr>:!python % <cr>
这句话很简单,就是在Buffer Read的时候,如果是python文件,就把F5键映射为先保存,然后用Python运行本Buffer的文件.

3.函数帮助

如果你用VIM编写过C语言,就会知道可以通过Shift+K(就是大写的K啦),来调用man命令来查询光标下的函数的解释,这个真是非常方便。Python编程也可以这样就爽了。其实这并非难事,只要这个插件:pydoc.vim

4.debug功能
目前还未找到好用的

csdn签名插件



CSDN论坛的签名插件, 原作者Tim(q107770540).
使用方法:
去下面地址下载,然后用记事本修改内容后,上传到你自己的空间,csdn加载一下就行了.http://my-own-blog-file.googlecode.com/files/CsdnPersonalSignaturePicEdited.js

23 May 2011

.NET使多行文本框滚动到最后一行

.NET使多行文本框滚动到最后一行 在 .Net Full Framework中,要想使多行文本框滚动到最新插入的那一行,非常简单, txt->AppendText("Last line");
txt->ScrollToCaret();

21 May 2011

查看OpenGL版本号


如何查看系统当期OpenGL版本号?
OpenGL 版本:
char *Version = (char *)glGetString(GL_VERSION);
取得字串,此字串便是版本号。

OpenGL extension 版本可如下获取
char *Extension = (char *)glGetString(GL_EXTENSIONS); 

gluPerspective和glFrustum的转换



gluPerspective使用右手坐标系,跟opengl一样.(x/y/z分别是右/上/屏幕往外);glFrustum使用eye coordinate system(相机坐标系,或者眼睛坐标系),x/y与gluPerspective相同,但是z轴反向,是顺着视线方向的(x/y/z分别是右/上屏幕往里),所以转换时需要注意zFar的值(zFar是最后2个参数中比较大的那个.如果原来zFar是负值,则需要反向).

下图2个坐标系分别是gluPerspective使用的坐标系和glFrustum使用的坐标系.


这2个函数的参数转换原理如下图:

下面是个转换函数:(仅限于显示区域对称的情况)
测试用参数: fovy = 45.0, zNear = 50.0, zFar = -1000.0;
void Perspective2Frustum(double fovy, double fAspect, double zNear, double zFar)
{
const double DEG2RAD = 3.1415926/180;
double ymin, ymax, xmin, xmax, tangent;

tangent = tan(fovy/2 * DEG2RAD);
ymax = zNear * tangent;
xmax = ymax * fAspect;

ymin = -ymax;
xmin = -xmax;

glFrustum(xmin,xmax,ymin,ymax,zNear,-zFar);
}


对于显示区域不对称的情况,gluPerspective就无能为力了,必须分别指定glFrustum的各个参数来实现透视投影变换.还有一种情况是使用多个显示器来显示时,对于每个显示区域可以分别指定glFrustum的参数来拼接场景.

参考资料:http://www.songho.ca/opengl/gl_transform.html

特征值与特征向量


特征值和特征向量是一种数据的处理方法,可以简化数据。
矩阵乘特征向量就是在其方向的投影。这点类似于向量点积既是投影。

通过求特征值和向量,把矩阵数据投影在一个正交的空间,而投影的大小就是特征值。这样就直观体现了数据的基本特征。
最大特征值并不是说数据在所有方向的投影的最大值,而仅限于正交空间的某一方向(属于那个特征向量的方向)。
一般矩阵,满足满秩,只有一个这样的正交空间。
或许有更好的空间来体现数据的特征,但一般来说,正交空间就很好,不排除特殊应用需要非正交的空间,可能会更好。

至于为什么正交矩阵属于不同特征值的特征向量一定正交,可以证明如下:

约定:
a)复数λ的共轭复数记为λ′。
b)矩阵(包括向量)A的共轭转置矩阵(向量)记为A*

A是正交矩阵,A*=A^(-1),

设λ1,λ2是A的两个不同特征值,则λ1λ2′≠1
(如果λ2′=1/λ2.如果λ1λ2′=1,则λ1=λ2)

λ1X1=AX.
λ2X2=AX2.λ2′X2*=X2*A*

λ1λ2′X2*X1=X2*A*AX1=X2*X1.
(λ1λ2′-1)X2*X1=0

λ1λ2′≠1,
∴X2*X1=0,X2与X1正交.

18 May 2011

CMD命令中空格的解决办法


有的时候产品容易被默认安装到c:\Program Files\这样包含空格的路径下,那么在命令行中输入一个带空格的file path作为参数往往会出错。所以大家都流传着这样一种说法:产品安装的时候选择的目录千万不要包含空格。

但是,一个那么大的产品装好了,使用命令行配置的时候发现path带空格命令过不去,而卸载重装太恐怖了,怎么办?

现在有两个办法来解决这个问题



1)用缩写。比如c:\Program Files缩写为c:\Progra~1
再来刨根问底查查这个命名是否有规则,于是找到:
文件夹(sub-directry)名称,以前是不允许带空白的,后来允许带空白,但由于有了空白,许多命令出现二义性,于是采用双引号括起来的办法。例如:
cd Documents and Settings
按老定义 等于 CD Documents, CD 命令找不到名叫Documents 的 directry
于是采用双引号:
cd “Documents and Settings“
但用到 set PATH 时很麻烦,名字太长,双引号时常括错。于是采用8个字符缩写,即写头六个字母(略去空白),另加波浪号和1。例如:
"Documents and Settings“ -- DOCUME~1
"Local Settings" -- LOCALS~1 (注意略去空白,用了第二个词的字母,凑成六个,再加波浪号和1)。
于是,这种方法成了规定。
再来个十万个为什么的下一个,如果多个文件前6字符一样怎么办?为什么最后是1而不是0或者其他数字呢?看看这个例子
假设下面是你的C盘根目录中的文件夹:
Program Files
Progra file
Progra zhang
则三个目录分别表示为:C:\Progra~1; C:\Progra~2; C:\Progra~3;
2)绕过去,创建一个镜像。例如在cmd中输入 subst w: "C:\Documents and Settings\hopeshared"。然后就可以直接用w:\替代C:\Documents and Settings\hopeshared了

17 May 2011

Euler Project5 欧拉工程5



2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any remainder.

What is the smallest positive number that is evenly divisible by all of the numbers from 1 to 20?

找到可以整除1-20的最小正整数. 分析过程:

% 整除1-20,其实就是1-20的最小公倍数,计算时可以精简:
% 1-20只需要求[2,3,4,5,6,7,11,13,17,19]的最小公倍数即可
% 其余的
% 1不用计算
% 8 = 2*4
% 9 = 3*3(第二个3来自6=2*3)
% 10 = 2*5
% 12 = 3*4
% 14 = 2*7
% 16 = 2*8
% 18 = 2*9 = 2*3*3(第二个3来自6=2*3)
% 20 = 2*10 = 2*5*2(第二个2来自4=2*2)

==============
代码:
function result = euler5()
tic;
result = prod([2,3,4,5,6,7,11,13,17,19]); % => 8,9(3*3),10,12,14,15,16(2*4*2),18,20
toc;
end

运行时间及结果:
% Elapsed time is 0.000012 seconds.
% ans =
% 232792560

16 May 2011

Euler Project4 欧拉工程4



如果一个数字正写和反写结果一样,就称为回文数,请找到可以表示为2个三位数乘积的最大回文数.
%% 3 digital number which remains same from both direction, like 9009
% == from small to big
% Elapsed time is 43.379476 seconds.
% ans =
% 906609
% == from big to small
% Elapsed time is 5.504064 seconds.
% ans =
% 906609
function result = euler4()
tic;
result = 0;
for i=999*999:-1:100*100 % ends with 0, jump over
if mod(i,10)==0
continue;
end
n = num2str(i);
if strcmp(n,n(end:-1:1))
flag = 0;
for j=999:-1:900 % max, so from 999 to 900, try
if i/j<=999 && i==fix(i/j)*j % i/j must be smaller than 999, and i/j must be integer flag = j; break; end end if flag~=0 result = i; break; end end end [j,result/j] toc; end

结果
% Elapsed time is 5.504064 seconds.
% ans =
% 906609

14 May 2011

Euler Project3 欧拉工程3



求600851475143的最大质因数
%% 600851475143's biggest prime factor
% Elapsed time is 55.277722 seconds.
% ans =
% 6857
function result = euler3()
tic;
result = 0;
n = 600851475143;
for i=fix(sqrt(n)):-1:3
if isprime(i)==1 && mod(n,i)==0
result = i;
break;
end
end
toc;
end

13 May 2011

Euler Project2 欧拉工程2



Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be:

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

By considering the terms in the Fibonacci sequence whose values do not exceed four million, find the sum of the even-valued terms.

求斐波那契数列中小于4,000,000的值中的偶数项之和.
%% sum of even value elements from fibonacci list smaller than 4,000,000
% Elapsed time is 0.000011 seconds.
% ans =
% 4613732
function result = euler2()
tic;
a = 1;
b = 2;
result = 2;
while (a<4000000 && b<4000000) a = a+b; if mod(a,2)==0 result = result+a; end b = a+b; if mod(b,2)==0 result = result+b; end end toc; end

10 May 2011

Euler Project1 欧拉工程1



欧拉工程是一个用编程来解决一连串数学问题的项目。发现它对训练数学及编程挺有作用的。网上也有许多人做上面的题目并发布自己的算法。

上面共有337题,分几个等级,一级比一级难。完成它绝对是时间及精力及耐力及智力的较量。

解决问题的代码贴在这里.主要用matlab,偶尔python,很少c/c++.有时会matlab调python解决,只为快速解决问题. Question 1:
If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.

Find the sum of all the multiples of 3 or 5 below 1000.
解决
%% sum of number below 1000 and can be divided by 3 or 5
% Elapsed time is 0.002665 seconds.
% ans =
% 233168
function result = euler1()
tic
result = sum(unique([3:3:1000,5:5:999]))
toc;
end