请问用MATLAB怎么绘制bezier曲线

请问用MATLAB怎么绘制bezier曲线,第1张

function

[x,y]=bezier(x,y)

%用法:

%bezier(x,y)

%

生成n-1次贝塞尔曲线,其中x和y是n个点的坐标

%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 )

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12029029.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存