[x,y]=bezier(x,y)
%用法:
%bezier(x,y)
%
%h=bezier(x,y)
%
生成n-1次贝塞尔曲线并返回曲线句柄
%[x,y]=bezier(x,y)
%
返回n-1次贝塞尔曲线的坐标
%例子:
%bezier([5,6,10,12],[0
5
-5
-2])
n=length(x)
t=linspace(0,1)
xx=0yy=0
for
k=0:n-1
tmp=nchoosek(n-1,k)*t.^k.*(1-t).^(n-1-k)
xx=xx+tmp*x(k+1)
yy=yy+tmp*y(k+1)
end
if
nargout==2
x=xxy=yy
end
h=plot(xx,yy)
if
nargout==1
x=h
end
使用matlab画指定三个点控制的贝赛尔曲线,就像在画图中点曲线功能,然后依次选择三个点以画曲线一样,需要用到kron函数以计算参数曲线。
指定三个点,(5,-10), (18,18), (45,15),绘制贝塞尔曲线的代码效果:
用到的代码如下(注意end后面不能加分号):
pt1 = [ 5-10]
pt2 = [1818]
pt3 = [4515]
cla
placelabel(pt1,'pt_1')
placelabel(pt2,'pt_2')
placelabel(pt3,'pt_3')
xlim([0 50])
axis equal
t = linspace(0,1,101)
pts = kron((1-t).^2,pt1) + kron(2*(1-t).*t,pt2) + kron(t.^2,pt3)
hold on
plot(pts(1,:),pts(2,:))
hold off
function placelabel(pt,str)
x = pt(1)
y = pt(2)
h = line(x,y)
h.Marker = '.'
h = text(x,y,str)
h.HorizontalAlignment = 'center'
h.VerticalAlignment = 'bottom'
end
1
2
/*产生三次方贝塞尔曲线的程序码
*/
typedef struct
{
float x
float y
}
Point2D
/*
cp 在此是四个元素的阵列:
cp[0] 为起始点,或上图中的 P0
cp[1] 为第一个控制点,或上图中的 P1
cp[2] 为第二个控制点,或上图中的 P2
cp[3] 为结束点,或上图中的 P3
t 为参数值,0 <= t <= 1
*/
Point2D PointOnCubicBezier( Point2D* cp, float t )
{
float ax, bx, cx
float ay, by, cy
float tSquared, tCubed
Point2D result
/* 计算多项式系数 */
cx = 3.0 * (cp[1].x - cp[0].x)
bx = 3.0 * (cp[2].x - cp[1].x) - cx
ax = cp[3].x - cp[0].x - cx - bx
cy = 3.0 * (cp[1].y - cp[0].y)
by = 3.0 * (cp[2].y - cp[1].y) - cy
ay = cp[3].y - cp[0].y - cy - by
/* 计算位于参数值 t 的曲线点 */
tSquared = t * t
tCubed = tSquared * t
result.x = (ax * tCubed) + (bx * tSquared) + (cx * t) + cp[0].x
result.y = (ay * tCubed) + (by * tSquared) + (cy * t) + cp[0].y
return result
}
/*
ComputeBezier 以控制点 cp 所产生的曲线点,填入 Point2D 结构的阵列。
呼叫者必须分配足够的内存以供输出结果,其为 <sizeof(Point2D) numberOfPoints>
*/
void ComputeBezier( Point2D* cp, int numberOfPoints, Point2D* curve )
{
float dt
int i
dt = 1.0 / ( numberOfPoints - 1 )
for( i = 0i <numberOfPointsi++)
curve[i] = PointOnCubicBezier( cp, i*dt )
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)