程序课程设计报告2012年7月11日Bezier方法与吉祥物图案设计专业:信息与计算科学班级:信10-1吉祥物文洛克的设计题目:Bezier方法与吉祥物图案设计组长:石玮lun组员:张益、李天宇指导教师:张彩霞时间:19周——21周摘要:本文对Bezier曲线及其性质进行研究,利用Matlab软件对吉祥物——文洛克进行Sobel算子边缘提取工作,之后进行找点,通过Matlab描点绘制吉祥物——文洛克的边缘。在众多的课题中,我们一眼就挑中了这个课题,因为我们觉得这项课题可能非常有意思,经过我们深入的研究,发现贝赛尔曲线很适合用来在电脑上绘制图形,用起来非常方便。贝塞尔曲线是计算机图形图像造型的基本工具,是图形造型运用得最多的基本线条之一。阐述了Bezier方法在绘图上的应用,Bezier曲线具有良好的几何性质,能简洁、完美地描述和表达曲面。Abstract:Inthispaper,theBeziercurveandthenatureofthestudy,useofMatlabsoftwareontherock-mascotSobeloperatoredgeextractionwork,afterfindsome,throughtheMatlabdrawsomedrawtheedgeofrock-themascot.Inmanyofthetopic,weimmediatelysingledoutonthesubject,becausewefeelthatthesubjectmaybeveryinteresting,throughourin-depthresearch,foundbeisaiercurveisusedtodrawonthegraphicsonacomputer,useriseveryconvenient.Beziercomputergraphicsimageisthebasictoolmodelling,isusingthemostgraphicmodellingisoneofthebasicline.DescribesthemethodofdrawinginBezierapplication,Beziercurvehasgoodgeometricalproperties,canconcise,perfecttodescribeandexpresssurface.关键词:Bezier曲线造型边缘提取曲面Sobel算子Keywords:BeziercurvemodelingEdgeextractioncurvedsurfaceSobeloperator1.引言曲线的表示是计算机图形学的重要内容,它是描述物体的外形,建立所画对象的数学模型的有力工具。1962年,法国雷诺汽车公司的工程师P.E.Bezier构造了一种以逼近为基础的参数曲线和曲面设计方法,以这种方法为主完成了一个称为UNISURE的曲线和曲面设计系统,并1972年在公司投入使用。Bezier方法将函数逼近同几何表示结合起来,使得设计师在工程设计中能比较直观地意识到所给条件与设计出的曲线之间的关系,能方便地通过控制输入参数来改变曲线的形状。本文首先Bezier曲线的造型问题做进一步研究,接下来对吉祥物——文洛克进行边缘提取,利用坐标纸描点,生成一系列的点集{Pi},再用Matlab画出每一条逼近曲线。Bezier曲线具有良好的几何性质,能简洁、完美地描述和表达自由曲线曲面,在CADPCAM技术中得到广泛的应用。本课题研究的是Bezier方法与吉祥物图案设计,本课题研究的意义是为了论证Bezier曲线具有良好的几何性质,能简洁、完美地描述和表达曲面。本课题研究的整体框架是基于Matlab软件与Bezier算法得以画出图像的边缘。对图像实际问题做简单处理。贝塞尔曲线是计算机图形图像造型的基本工具,是图形造型运用得最多的基本线条之一。它通过控制曲线上的四个点(起始点、终止点以及两个相互分离的中间点)来创造、编辑图形。其中起重要作用的是位于曲线中央的控制线。这条线是虚拟的,中间与贝塞尔曲线交叉,两端是控制端点。移动两端的端点时贝塞尔曲线改变曲线的曲率(弯曲的程度);移动中间点(也就是移动虚拟的控制线)时,贝塞尔曲线在起始点和终止点锁定的情况下做均匀移动。曲线是由锚点来控制的,锚点的类型有1.平滑点:有两个相关联的控制手柄,改变一个手柄的角度另一个也会变化,改变一个手柄的长度不影响另一个。这样我们就可以通过把一个平滑点的一个手柄的长度拖动为0,就是把手柄的端点拖到锚点上使其重合,来创建一个组合角点。平滑点的作用是沿路径引导路径,不会严重或突然改变路径。可以在需要比较平滑的曲线处加平滑点然后拖动平滑点的控制手柄来进一步控制曲线走向。2.直角点:两条直线的交点,它不存在控制手柄,只能通过改变它的位置来调整直线的一些走向。3.曲线角点:两条不同的曲线段在一个角交汇处的锚点。这样的锚点也是有两个控制手柄,但是之间没有任何联系,它们分别控制曲线角点两边的不同的两条曲线。注意:可能有人会觉得画不出两条曲线连在一起,更不要说产生控制两条曲线的曲线角点了。我们可以在一条曲线中间加一个锚点,这是产生的是一个平滑点,然后拖动其中一个手柄时按住alt键或者用转锚点类型的工具,打破两个手柄的联系,这样你就成功的创建了一个曲线角点。4.组合角点:是曲线和直线的焦点,只有一条控制曲的手柄。组合角点是如何创建的在上面已经讲过了。2.课题中涉及的算法的基本思想或基本原理(1)一次贝济埃曲线曲线形状仅与特征多边形各顶点P1有关。当n=1时,方程式为:P(t)=(1-t)P0+tP1(0=t=1)表示一条连接P0和P1的直线段。(2)二次贝济埃曲线当n=2时,P(t)=(1-t)2P0+2t(1-t)P1+t2P2可整理为:02121-211-220100PPtttPP二次贝济埃曲线为抛物线。(3)三次贝济埃曲线当n=3时,P(t)=(1-t)3P0+3t(1-t)2P1+3t2(1-t)P2+t3P3可整理为:01322313313630()133001000PPPttttPP点Pi称作被赛尔曲线的控制点。多边形以带有线的贝塞尔点连接而成,起始于P0并以Pn终止,称作贝塞尔多边形(或控制多边形)。贝塞尔多边形的convexhull包含有贝塞尔曲线。线性贝塞尔曲线函数中的t会经过由P0至P1的B(t)所描述的曲线。例如当t=0.25时,B(t)即一条由点P0至P1路径的四分之一处。就像由0至1的连续t,B(t)描述一条由P0至P1的直线。为建构二次贝塞尔曲线,可以中介点Q0和Q1作为由0至1的t:由P0至P1的连续点Q0,描述一条线性贝塞尔曲线。由P1至P2的连续点Q1,描述一条线性贝塞尔曲线。由Q0至Q1的连续点B(t),描述一条二次贝塞尔曲线。为建构高阶曲线,便需要相应更多的中介点。对于三次曲线,可由线性贝塞尔曲线描述的中介点Q0、Q1、Q2,和由二次曲线描述的点R0、R1所建构:3.算法实现步骤及真实图像实验结果(1)边缘提取:首先我们先对原图进行边缘提取,我们利用Sobel算子边缘提取法(代码见附录),对原图像(图1)进行加工处理,这时我们可以得到一张轮廓分明的图像(图2)。以下是原图和边缘提取之后的图像对比,我们可以看到原图的轮廓被检测出来。图1图2(2)图像坐标化:我们将进行过边缘提取之后的图像拓印到纸上,并且建立坐标系,把它分解成为无数的曲线,并对每一条曲线做切线,用尺子量出各条曲线的切点以及各切线的交点,并对它们做详细的记录,把点描在纸上,这时我们可以得到一张样图(图3)。图3(3)Matlab实现接下来我们要进行至关重要的一步了,由于我们已经有了各点详细的坐标了,所以我们要利用Matlab绘制图形了。我们在Matlab中输入代码(代码见附录),并且执行代码,便可得到我们想要的吉祥物——文洛克的图像了(图4)。图44.结论:本课题研究了如何用贝塞尔曲线绘制图形,贝赛尔曲线的基本原理和算法实现。画师若想在电脑上绘制图形,必须用鼠标绘制,与手绘图形有巨大的区别,无法精确地绘制图形,而且鼠标绘制很难以掌握。利用贝赛尔曲线,可以精确绘制图像,画出的图像接近原图。贝赛尔曲线简单且实用,只利用四个点便可以绘制出图形,通过编辑四点坐标便可以改变图形曲线。只要将原图画在坐标纸上,量出各切点以及各切线交叉点,便可画出各个曲线从而画出图像。通过学习了贝赛尔曲线的基本原理和算法实现,以及用matlab实现贝赛尔曲线的绘制,我们掌握了大量的关于贝赛尔曲线算法、原理及实现的知识,提高了我们自己独立研究和解决问题的水平,我们的实际动手能力及大家的团队协作能力均有很大的加强。5.参考文献:[1]孙立镌,计算机图形学,哈尔滨工业大学出版社[2]李兰友山鹰,计算机绘图与图像处理基础,机械工业出版社[3]杨杰黄朝,兵数字图象处理及Matlab实现,电子工业出版社[4]Coons,S.A.,Surfaceforcomputer-aideddesignofspacefigures,AD663504,1967[5]DavidMcMahon,郑碧波译,Matlab揭秘[6]冈萨雷斯,《数字图像处理》(第二版),电子工业出版社[7]吕风军,《数字图象处理编程入门》,清华大学出版社6.附录:Sobel算子%边缘提取I=imread('C:\DocumentsandSettings\ncutcyj\桌面\吉祥物.jpg');K=rgb2gray(I);BW1=[-1,-2,-1;0,0,0;1,2,1];BW2=[-1,0,1;-2,0,2;-1,0,1];J1=filter2(BW1,K);J2=filter2(BW2,K);K1=double(J1);K2=double(J2);M=(abs(K1)+abs(K2));figure,imshow(uint8(M))二次Bezier曲线代码:functionbezier2(p0,p1,p2)t=0:0.001:1;x=(p2(1)-2*p1(1)+p0(1))*t.^2+2*(p1(1)-p0(1))*t+p0(1);y=(p2(2)-2*p1(2)+p0(2))*t.^2+2*(p1(2)-p0(2))*t+p0(2);plot([p0(1)p1(1)p2(1)],[p0(2)p1(2)p2(2)],'b'),holdonplot(x,y,'r');执行:bezier2([4.1,10.9],[4.3,10.5],[4.6,10.9])holdon,bezier2([2.7,7],[2.7,10.8],[4.1,10.9])holdon,bezier2([4.6,10.9],[5,11.2],[5.2,10.5])holdon,bezier2([5.2,10.5],[5.2,10.3],[5.7,10.4])holdon,bezier2([5.7,10.4],[6.3,8.5],[4.9,7.1])holdon,bezier2([4.9,7.1],[3.7,6.5],[4.6,5.8])holdon,bezier2([4.6,5.8],[4.6,5.8],[6,3.6])holdon,bezier2([6,3.6],[6.4,1.4],[5,1.7])holdon,bezier2([5,1.7],[5,0.2],[4.1,0.4])holdon,bezier2([4.1,0.4],[3.1,0.7],[2.4,1.65])holdon,bezier2([2.4,1.65],[2,2.3],[2.2,3.9])holdon,bezier2([2.2,3.9],[2.6,5.7],[1.7,6.6])holdon,bezier2([1.7,6.6],[0.8,7.5],[0.8,9.1])holdon,bezier2([0.8,9.1],[0.8,