B样条绘制

来源:互联网 发布:电脑接口转换器 知乎 编辑:程序博客网 时间:2024/05/16 06:07

一、简介
在数学的子学科数值分析里,B-样条是样条曲线一种特殊的表示形式。它是B-样条基曲线的线性组合。B-样条是贝兹曲线的一种一般化,可以进一步推广为非均匀有理B样条(NURBS),使得我们能给更多一般的几何体建造精确的模型。
术语 B样条是Isaac Jacob Schoenberg创造的,是基(basis)样条的缩略
B样条曲线曲面具有几何不变性、凸包性、保凸性、变差减小性、局部支撑性等许多优良性质,是目前CAD系统常用的几何表示方法,因而基于测量数据的参数化和B样条曲面重建是反求工程的研究热点和关键技术之一。
De Boor算法是一个数值上稳定的计算B样条的方法。
B一样条函数的研究最早开始于十九世纪,当时N.Lobachevsky把B一样条作为某些概率分布的卷积。在1946年,I.J.schoenberg利用B样条进行统计数据的光滑化处理,他的论文开创了样条逼近的现代理论。随后, CdeBoor,M.Cox和LMansfiekl发现了B一样条的递推关系。B一样条曲线的最初定义是基于差商,这种定义方法包含了复杂的数学公式,而且所得结果在数值上不稳定。 DeBoor与Hollig应用B一样条的递推关系作为出发点定义B一样条,这是一种完全不同于差商方法的定义公式。B一样条根据节点的不同又分为均匀B一样条基函数,周期B一样条基函数等类型。
二、详细描述


任意个控制点的三次B样条曲线绘制系统设计.pdf

http://www.docin.com/p-450752810.html

三、软件设计
1)matlab:
p=[0,1,2,3,4,5,6,7,8;0,6,0,6,0,6,0,6,0];
%Byangtiao8([4,6,3,1,7,9,15,11;0,9,11,15,15,7,15,12]);
%function Byangtiao8(p)
t=0:0.1:1;
hold on       
for i=1:6  
    x=p(1,i)*(1/6)*(-t.^3+3*t.^2-3*t+1)+p(1,i+1)*(1/6)*(3*t.^3-6*t.^2+4)...  
        +p(1,i+2)*(1/6)*(-3*t.^3+3*t.^2+3*t+1)+p(1,i+3)*(1/6)*t.^3; 
    y=p(2,i)*(1/6)*(-t.^3+3*t.^2-3*t+1)+p(2,i+1)*(1/6)*(3*t.^3-6*t.^2+4)...
        +p(2,i+2)*(1/6)*(-3*t.^3+3*t.^2+3*t+1)+p(2,i+3)*(1/6)*t.^3; 
    if (p(1,i) == i)
        a = y;
        a
        
    end
    %p(1,i)
    plot(x,y,'k');
    
end
plot([p(1,1) p(1,2) p(1,3) p(1,4) p(1,5) p(1,6) p(1,7) p(1,8) p(1,9)],[p(2,1) p(2,2) p(2,3) p(2,4) p(2,5) p(2,6) p(2,7) p(2,8) p(2,9)]);

2)C代码:
#include "stdio.h"
#include "math.h"
#define RA 7
#define XM -9000
#define YM 0
#define N 6                     /* 特征顶点个数                         */
void B3_curves(long xq[][9],int m,long lxx,long lyy)
{
int   i,j,k=10;
double  lx1,ly1;
double t0,t1,t2,t3;
/* 显示或绘之曲线                                        */
lx1=(xq[0][0]+4.0*xq[0][1]+xq[0][2])/6+lxx;
ly1=(xq[1][0]+4.0*xq[1][1]+xq[1][2])/6+lyy;
printf("i=%d,lx1 = %f, ly1 = %f\n", 0, lx1, ly1);
for (i = 1; i < m - 1; i++)
{
for (j=0; j<=k-1; j++)
{
t3=1.0*j/k;                    t0=1-t3;
t0=t0*t0*t0/6.0;               t1=((3.0*t3-6.0)*t3*t3+4.0)/6.0;
t2=(((3-3*t3)*t3+3)*t3+1)/6.0; t3=1.0-t0-t1-t2;
lx1=xq[0][i-1]*t0+xq[0][i]*t1+xq[0][i+1]*t2+xq[0][i+2]*t3+lxx;
ly1=xq[1][i-1]*t0+xq[1][i]*t1+xq[1][i+1]*t2+xq[1][i+2]*t3+lyy;
printf("i=%d,lx1 = %f, ly1 = %f\n",i, lx1, ly1);
}
}
int  main(void)
{
static long p[2][9] = { 0, 1, 2, 3, 4, 5, 6, 7,
8,0,6,0,6,0,6,0,6,0};
static long q[9][2] = { 0, 1, 2, 3, 4, 5, 6, 7,
8, 0, 6, 0, 6, 0, 6, 0, 6, 0 };
B3_curves(p , N+2, 0, 0);
    /* Return the system to text mode       */
return 0;
}
参考文献:

计算机图形学实验4-----Hermite Bezier B样条三种曲线的绘制

http://wenku.baidu.com/link?url=ZV_gHUKC1bOLjq1aXl0uB4A6lAyZXu49rSD_6wQJ3kcjnE_l4DGwyDGZ2uhhK3jeIDwTTUjY1H5pjxBsBJJBFREU42J54a95j0mcdILRhWO

用c语言编程绘制二维三次b样条曲线

http://www.docin.com/p-812882606.html

Matlab 画二次及三次Bezier曲线,8控制点的B样条曲线

http://wenku.baidu.com/view/e7cc6548767f5acfa1c7cde4.html


0 0
原创粉丝点击