计算机图形学--编程生成“三次贝塞尔”曲线
- 格式:doc
- 大小:37.50 KB
- 文档页数:7
淮阴工学院计算机科学系实验报告书课程名:《计算机图形学》题目:实验4 BEZIER曲线或B样条曲线的绘制班级:学号:姓名:评语:成绩:指导教师:批阅时间:年月日1、实验内容或题目编程实现三次BEZIER或B样条曲线的绘制。
2、实验目的与要求(1) 通过实验,进一步理解和掌握生成BEZIER或B样条曲线的算法;(2) 掌握BEZIER或B样条曲线的基本生成过程;(3) 通过编程,会在TC环境下编程实现三次BEZIER或B样条曲线的绘制。
3、实验步骤与源程序错误!未找到引用源。
实验步骤1、算法、原理清晰,有详细的设计步骤;2、依据算法、步骤或程序流程图,用C语言编写源程序;3、编辑源程序并进行调试;4、进行特殊模式的运行测试,并结合情况进行调整;5、对运行结果进行保存与分析;6、打印源程序或把源程序以文件的形式提交;7、按格式书写实验报告。
错误!未找到引用源。
源代码#include "graphics.h"float px[4]={ 50,80,120,140 };float py[4]={100,230,230,160};void Bezier(){float a0,a1,a2,a3,b0,b1,b2,b3;int k,x,y;float i,t,n=4;setcolor(15);for(k=0;k<3;k++){moveto(px[k],py[k]);lineto(px[k+1],py[k+1]);}setcolor(4);a0=px[0];a1=-3*px[0]+3*px[1];a2=3*px[0]-6*px[1]+3*px[2];a3=-px[0]+3*px[1]-3*px[2]+px[3];b0=py[0];b1=-3*py[0]+3*py[1];b2=3*py[0]-6*py[1]+3*py[2];b3=-py[0]+3*py[1]-3*py[k+2]+py[3];for(i=0;i<n;i+=0.001){t=i;x=a0+a1*t+a2*t*t+a3*t*t*t;y=b0+b1*t+b2*t*t+b3*t*t*t;if(i==0)moveto(x,y);lineto(x,y);}}void main(){int driver,mode;driver=DETECT;initgraph(&driver,&mode,"..\\bgi");Bezier();}4、测试数据与实验结果5、结果分析与实验体会通过这次实验,我初步熟悉了turboc 的运行环境。
三阶贝塞尔曲线js算法实现贝塞尔曲线是计算机图形学中的一种重要工具,常用于绘制光滑的曲线。
一个n阶贝塞尔曲线由n+1个控制点P0, P1, ..., Pn定义。
对于三阶贝塞尔曲线,我们有4个控制点P0, P1, P2, P3。
以下是一个使用JavaScript实现三阶贝塞尔曲线的简单示例:javascriptfunction bezier(t, p0, p1, p2, p3) {var one_minus_t = 1.0 - t;var be = new Array(4);be[0] = Math.pow(one_minus_t, 3); be[0] *= p0;be[1] = 3 * Math.pow(one_minus_t, 2) * t * p1;be[2] = 3 * one_minus_t * Math.pow(t, 2) * p2;be[3] = Math.pow(t, 3) * p3;return be;}var p0 = [0, 0]; // 控制点P0var p1 = [1, 2]; // 控制点P1var p2 = [2, 0]; // 控制点P2var p3 = [3, 0]; // 控制点P3for (var t = 0; t <= 1; t += 0.1) {var point = bezier(t, p0, p1, p2, p3);console.log(point); // 输出当前t值对应的曲线上的点}在这个示例中,bezier函数接受一个参数t(在0和1之间)和四个控制点的数组,然后返回一个表示曲线上的点的数组。
然后,我们用一个循环来遍历t的值,并打印出每个t值对应的曲线上的点。
C语言实现生成贝塞尔曲线(代码)贝塞尔曲线是一种数学曲线,经常用于计算机图形学中。
他们有许多应用,从简单2D 图形到高级3D建模,甚至包括游戏引擎和动画。
在这篇文章中,我们将介绍如何用C语言实现贝塞尔曲线的生成算法。
贝塞尔曲线是通过将一系列点连接起来形成的曲线。
在这些点之间,我们添加了一些称为控制点的点。
这些控制点决定了曲线的形状和弯曲程度。
在绘制贝塞尔曲线之前,我们需要先实现一个计算两个点之间距离的函数。
这个函数非常简单,可以使用勾股定理计算两个点之间的距离。
double distance(int x1, int y1, int x2, int y2) {return sqrt(pow((x2 - x1), 2) + pow((y2 - y1), 2));}接下来,我们需要实现一个贝塞尔曲线点的函数。
给出起点、终点和控制点,则该函数返回根据这些点计算的贝塞尔曲线上的点。
为了简单起见,我们将实现三次贝塞尔曲线。
需要注意的是,我们需要将弧上的点插入到数组中以便最终绘制曲线。
void bezier(int x1, int y1, int x2, int y2, int cx1, int cy1, int cx2, int cy2, Point* points, int& n) {for (double t = 0; t <= 1; t += 0.01) {double xt = pow(1 - t, 3) * x1 + 3 * t * pow(1 - t, 2) * cx1 + 3 * pow(t, 2) * (1 - t) * cx2 + pow(t, 3) * x2;double yt = pow(1 - t, 3) * y1 + 3 * t * pow(1 - t, 2) * cy1 + 3 * pow(t, 2) * (1 - t) * cy2 + pow(t, 3) * y2;points[n].x = round(xt);points[n].y = round(yt);n++;}points[n].x = x2;points[n].y = y2;n++;}在上面的代码中,我们使用了一个for循环来遍历弧上的点。
贝塞尔曲线c++贝塞尔曲线是一种数学上的曲线,可以用于制作矢量图形和动画。
在C++中,可以通过以下步骤绘制二次和三次贝塞尔曲线:1. 定义控制点:贝塞尔曲线通常由几个关键点组成,称为控制点。
对于二次贝塞尔曲线,需要三个控制点(起点、终点和控制点),对于三次贝塞尔曲线,需要四个控制点。
2. 计算曲线点:使用以下公式计算曲线上的任意点:二次贝塞尔曲线:P(t) = (1-t)²*P0 + 2t(1-t)*P1 +t²*P2三次贝塞尔曲线:P(t) = (1-t)³*P0 + 3t(1-t)²*P1 +3t²(1-t)*P2 + t³*P3其中,P0、P1、P2和P3分别是控制点,t是取值范围在0到1之间的参数,P(t)是曲线上的点。
3. 绘制曲线:使用绘图库例如OpenGL或者QT绘图库,将计算出的点连接起来绘制出曲线。
以下是C++代码示例,用于绘制二次和三次贝塞尔曲线:```c++#include <iostream>#include <vector>#include <cmath>#include <GL/glut.h>using namespace std;// 二次贝塞尔曲线void drawQuadraticBezierCurve(float p0x, float p0y, float p1x, float p1y, float p2x, float p2y) {float t = 0.0;float step = 0.01;glColor3f(1.0, 0.0, 0.0); // 设置曲线颜色glBegin(GL_LINE_STRIP);while (t <= 1.0) {float x = (1 - t) * (1 - t) * p0x + 2 * (1 - t) * t * p1x + t * t * p2x;float y = (1 - t) * (1 - t) * p0y + 2 * (1 - t) * t * p1y + t * t * p2y;glVertex2f(x, y);t += step;}glEnd();glFlush();}// 三次贝塞尔曲线void drawCubicBezierCurve(float p0x, float p0y, float p1x, float p1y, float p2x, float p2y, float p3x, float p3y) {float t = 0.0;float step = 0.01;glColor3f(0.0, 1.0, 0.0); // 设置曲线颜色glBegin(GL_LINE_STRIP);while (t <= 1.0) {float x = pow(1 - t, 3) * p0x + 3 * pow(1 - t, 2) * t * p1x + 3 * (1 - t) * pow(t, 2) * p2x + pow(t, 3) * p3x;float y = pow(1 - t, 3) * p0y + 3 * pow(1 - t, 2) * t * p1y + 3 * (1 - t) * pow(t, 2) * p2y + pow(t, 3) * p3y;glVertex2f(x, y);t += step;}glEnd();glFlush();}// 初始化OpenGLvoid init() {glClearColor(1.0, 1.0, 1.0, 0.0);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0, 600, 0, 600);glMatrixMode(GL_MODELVIEW);}// 绘制函数void display() {glClear(GL_COLOR_BUFFER_BIT);// 绘制二次贝塞尔曲线drawQuadraticBezierCurve(100, 100, 200, 300, 400, 400); // 绘制三次贝塞尔曲线drawCubicBezierCurve(100, 200, 200, 400, 400, 100, 500, 500);glFlush();}// 主函数int main(int argc, char** argv){glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowSize(600, 600);glutInitWindowPosition(0, 0);glutCreateWindow("Bezier Curve");glutDisplayFunc(display);init();glutMainLoop();return 0;}```注意,代码中使用了OpenGL库和glut库,需要提前安装和配置。
JS 三次方贝塞尔曲线什么是贝塞尔曲线?贝塞尔曲线是一种数学曲线,由法国数学家皮埃尔·贝塞尔在1962年提出。
它可以用于描述平滑曲线的路径,在计算机图形学中被广泛应用。
贝塞尔曲线的特点是可以通过控制点来调整曲线的形状。
通过改变控制点的位置和数量,我们可以创建出各种不同形状的曲线,包括直线、曲线和复杂的曲线路径。
贝塞尔曲线被广泛应用于计算机图形学、动画和用户界面设计等领域。
三次方贝塞尔曲线三次方贝塞尔曲线是一种由四个控制点定义的贝塞尔曲线。
它被称为三次方是因为它的方程式中包含三次方的项。
三次方贝塞尔曲线的方程式如下:B(t) = (1 - t)^3 * P0 + 3 * (1 - t)^2 * t * P1 + 3 * (1 - t) * t^2 * P2 + t^3 * P3其中,t是一个介于 0 和 1 之间的参数,P0、P1、P2和P3分别是四个控制点的坐标。
这个方程式可以解释为:曲线上的每个点都是由控制点通过一定的权重和参数t 来计算得出的。
如何绘制三次方贝塞尔曲线在 JavaScript 中,我们可以使用 Canvas API 来绘制三次方贝塞尔曲线。
下面是一个简单的示例代码:const canvas = document.getElementById('canvas');const ctx = canvas.getContext('2d');// 设置控制点坐标const P0 = { x: 50, y: 100 };const P1 = { x: 150, y: 50 };const P2 = { x: 250, y: 150 };const P3 = { x: 350, y: 100 };// 绘制贝塞尔曲线ctx.beginPath();ctx.moveTo(P0.x, P0.y);ctx.bezierCurveTo(P1.x, P1.y, P2.x, P2.y, P3.x, P3.y);ctx.stroke();在上面的代码中,我们首先获取了一个canvas元素,并通过getContext方法获取了一个 2D 绘图上下文对象ctx。
题目:深度探讨Java三次贝塞尔曲线坐标在计算机图形学中,贝塞尔曲线是一种平滑曲线,它使用一系列控制点来定义曲线的形状。
贝塞尔曲线可以分为一次、二次和三次贝塞尔曲线,其中三次贝塞尔曲线由四个控制点定义。
在Java编程中,我们经常会遇到需要使用三次贝塞尔曲线的情况,比如绘制复杂的图形或动画。
对于三次贝塞尔曲线的坐标计算十分重要。
在本文中,我将对Java三次贝塞尔曲线的坐标进行深入探讨,以帮助你更好地理解和应用这一概念。
1. 三次贝塞尔曲线简介三次贝塞尔曲线由四个控制点P0、P1、P2和P3定义,起点为P0,终点为P3,而P1和P2分别为起点和终点之间的两个控制点。
曲线上的点由参数t决定,参数t的取值范围通常是[0, 1],而曲线上的点则可以由下式计算得出:B(t) = (1-t)^3 * P0 + 3*(1-t)^2 * t * P1 +3*(1-t) * t^2 * P2 + t^3 * P3其中B(t)为曲线上的点,P0、P1、P2、P3为控制点。
在实际应用中,我们需要计算曲线上的点来绘制曲线或进行其他操作,因此掌握如何计算三次贝塞尔曲线的坐标是非常重要的。
2. 计算三次贝塞尔曲线坐标要计算三次贝塞尔曲线上的点,可以使用上面的B(t)公式来进行计算。
通常情况下,我们需要以一定的步长逐步计算曲线上的点,以便绘制出完整的曲线。
具体来讲,可以使用以下的伪代码来计算三次贝塞尔曲线上的点:```for t in range(0, 1, step):x = (1-t)^3 * P0.x + 3*(1-t)^2 * t * P1.x +3*(1-t) * t^2 * P2.x + t^3 * P3.xy = (1-t)^3 * P0.y + 3*(1-t)^2 * t * P1.y +3*(1-t) * t^2 * P2.y + t^3 * P3.y// 使用(x, y)绘制点或进行其他操作```在上面的伪代码中,我们使用了一个循环来遍历参数t的取值范围,并通过B(t)公式来计算曲线上的点的坐标。
作业三:三次Bezier曲线1. 设计要求:1.在程序窗口中建立坐标系2.输入控制点,绘制出三次Bezier曲线3.四个控制点间依次用细线连接4.在程序窗口显示四个控制点的位置并标出2. 设计思路:先在草稿纸上算出三次Bezier曲线的函数表达式: (0≤u≤1)=a×+b×+c×u+d其中a、b、c、d的值为:a=(-) + 3 × - 3 × +b=3× - 6 × + 3 ×c=(-3) × + 3 ×d=将、、、中的(x,y)坐标值分别代入a、b、c、d中得到、、、和、、、则:=×+×+×u+ (1)=×+×+×u+ (2)根据以上结果(1)和(2)编程求得当u取不同值时所得到的点P(u)。
再将各点用线连接起来即可拟合三次Bezier曲。
3. 设计过程:以下是用VB编三次Bezier曲线时的源代码:其中显示四个控制点的思路是将控制点在x和y方向的坐标值都增大1,然后再与控制点用粗实线连接起来。
这样一来在窗口中显示的即为一个较大的实点。
Function drawcs() '此模块为建立坐标系Dim k As IntegerPictDraw.DrawWidth = 1: PictDraw.FontSize = 9 '设置线宽和字体 PictDraw.Line (-400, 0)-(400, 0), RGB(100, 100, 100)PictDraw.Line (0, -300)-(0, 300), RGB(100, 100, 100)For k = (-360) To 360 Step 40PictDraw.Line (k, -5)-(k, 0): PictDraw.CurrentX = k - 20: PictDraw.CurrentY = 5: PictDraw.Print kNext kFor k = (-280) To -40 Step 40PictDraw.Line (5, k)-(0, k): PictDraw.CurrentX = -40: PictDraw.CurrentY = k - 10: PictDraw.Print (-1) * kNext kFor k = (40) To 280 Step 40PictDraw.Line (5, k)-(0, k): PictDraw.CurrentX = -40: PictDraw.CurrentY = k - 10: PictDraw.Print (-1) * kNext kEnd FunctionPrivate Sub Form_Load()PictDraw.AutoRedraw = TruePictDraw.ScaleWidth = 800PictDraw.ScaleHeight = 600Text1.Text = -300: Text2.Text = -250: Text3.Text = 300: Text4.Text = -250Text5.Text = -300: Text6.Text = 250: Text7.Text = 300: Text8.Text = 250 '作为初始值,便于测试drawcsEnd SubPrivate Sub cmdCancle_Click()PictDraw.Clsdrawcs '清除屏幕后,重建坐标系End SubPrivate Sub delet_Click() '此模块为清除输入框中的值 Text1.Text = ""Text2.Text = ""Text3.Text = ""Text4.Text = ""Text5.Text = ""Text6.Text = ""Text7.Text = ""Text8.Text = ""End SubPrivate Sub cmdDraw_Click() '此模块为画三次Bezier曲线Dim px(4) As Double '定义控制点的x坐标的数组Dim py(4) As Double '定义控制点的y坐标的数组Dim a1, b1, c1, d1 As Double '定义x系数Dim a2, b2, c2, d2 As Double '定义y系数Dim x, y, u As Double '定义曲线中的自变量u和变量x,y Dim i As IntegerIf (Not IsNumeric(Text1) Or Not IsNumeric(Text2) Or Not IsNumeric(Text3) Or Not IsNumeric(Text4) _Or Not IsNumeric(Text5) Or Not IsNumeric(Text6) Or Not IsNumeric(Text7) Or Not IsNumeric(Text8)) ThenText1.Text = "": Text2.Text = ""Text3.Text = "": Text4.Text = ""Text5.Text = "": Text6.Text = ""Text7.Text = "": Text8.Text = ""Text1.SetFocus '判断输入框中的字符是否为数字,如果为数字执行else开始画图Elsepx(0) = Text1.Text: py(0) = Text2.Textpx(1) = Text3.Text: py(1) = Text4.Textpx(2) = Text5.Text: py(2) = Text6.Textpx(3) = Text7.Text: py(3) = Text8.TextPictDraw.FontSize = 18 '设置字体,为显示输入的四个点设置字体大小PictDraw.CurrentX = px(0): PictDraw.CurrentY = (-1) * py(0): PictDraw.Print "P"; 0For i = 0 To 2PictDraw.DrawWidth = 1PictDraw.Line (px(i), (-1) * py(i))-(px(i + 1), (-1) * py(i + 1)), RGB(0, 0, 255): PictDraw.Print "P"; i + 1Next iFor i = 0 To 3PictDraw.DrawWidth = 7PictDraw.Line (px(i), (-1) * py(i))-(px(i) + 1, (-1) * py(i) - 1)Next ia1 = -px(0) + 3 * px(1) - 3 * px(2) + px(3) '计算x和y的参数 b1 = 3 * px(0) - 6 * px(1) + 3 * px(2)c1 = -3 * px(0) + 3 * px(1)d1 = px(0)a2 = -py(0) + 3 * py(1) - 3 * py(2) + py(3)b2 = 3 * py(0) - 6 * py(1) + 3 * py(2)c2 = -3 * py(0) + 3 * py(1)d2 = py(0)For u = 0 To 1 Step 0.001 '每当u增加0.001求一次x和y x = a1 * u * u * u + b1 * u * u + c1 * u + d1 '求x的值y = (-1) * (a2 * u * u * u + b2 * u * u + c2 * u + d2) '求y的值 If u = 0 ThenPictDraw.CurrentX = x '设置画线起点PictDraw.CurrentY = yElsePictDraw.DrawWidth = 2PictDraw.Line -(x, y), RGB(255, 0, 0) '连点成线End IfNext uEnd IfEnd SubPrivate Sub cmdEnd_Click() '退出窗口程序EndEnd Sub4. 设计截图:图四.三次Bezier曲线截图。
C++⽣成三次贝塞尔曲线// 三次贝塞尔.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include <stdio.h>#include <iostream>#include <vector>#define NUM_STEPS 30 //越⼤,曲线越密,越逼近using namespace std;class CvPoint{public:float x;float y;CvPoint(){x=0.0;y=0.0;}CvPoint(float a,float b){x=a;y=b;}};void curve4(vector<CvPoint> &p,double x1, double y1, //Anchor1double x2, double y2, //Control1double x3, double y3, //Control2double x4, double y4) //Anchor2{CvPoint tmp0(x1,y1);p.push_back(tmp0);double dx1 = x2 - x1;double dy1 = y2 - y1;double dx2 = x3 - x2;double dy2 = y3 - y2;double dx3 = x4 - x3;double dy3 = y4 - y3;double subdiv_step = 1.0 / (NUM_STEPS + 1);double subdiv_step2 = subdiv_step*subdiv_step;double subdiv_step3 = subdiv_step*subdiv_step*subdiv_step;double pre1 = 3.0 * subdiv_step;double pre2 = 3.0 * subdiv_step2;double pre4 = 6.0 * subdiv_step2;double pre5 = 6.0 * subdiv_step3;double tmp1x = x1 - x2 * 2.0 + x3;double tmp1y = y1 - y2 * 2.0 + y3;double tmp2x = (x2 - x3)*3.0 - x1 + x4;double tmp2y = (y2 - y3)*3.0 - y1 + y4;double fx = x1;double fy = y1;double dfx = (x2 - x1)*pre1 + tmp1x*pre2 + tmp2x*subdiv_step3;double dfy = (y2 - y1)*pre1 + tmp1y*pre2 + tmp2y*subdiv_step3;double ddfx = tmp1x*pre4 + tmp2x*pre5;double ddfy = tmp1y*pre4 + tmp2y*pre5;double dddfx = tmp2x*pre5;double dddfy = tmp2y*pre5;int step = NUM_STEPS;while(step--){fx += dfx;fy += dfy;dfx += ddfx;dfy += ddfy;ddfx += dddfx;ddfy += dddfy;CvPoint tmp1(fx,fy);p.push_back(tmp1);}CvPoint tmp2(x4,y4);p.push_back(tmp2);}int _tmain(int argc, _TCHAR* argv[]){CvPoint point[4];point[0].x=1.0;point[0].y=4.0;point[1].x=2.2;point[1].y=5.0;point[2].x=6;point[2].y=3;point[3].x=8;point[3].y=9;vector<CvPoint> curvePoint;curve4(curvePoint,point[0].x,point[0].y,point[1].x,point[1].y,point[2].x,point[2].y,point[3].x,point[3].y);int i=0;for(;i<curvePoint.size();i++){cout<<"("<<curvePoint[i].x<<","<<curvePoint[i].y<<")"; if((i+1)%2==0)cout<<endl;}cout<<endl<<"点的个数:"<<i<<endl;system("pause");return 0;}。
Bezier曲线原理及实现代码(c++)一、原理:贝塞尔曲线于1962年,由法国工程师皮埃尔·贝塞尔(Pierre Bézier)所广泛发表,他运用贝塞尔曲线来为汽车的主体进行设计。
贝塞尔曲线最初由Paul de Casteljau于1959年运用de Casteljau 算法开发,以稳定数值的方法求出贝塞尔曲线。
线性贝塞尔曲线给定点P0、P1,线性贝塞尔曲线只是一条两点之间的直线。
这条线由下式给出:且其等同于线性插值。
二次方贝塞尔曲线的路径由给定点P0、P1、P2的函数B(t) 追踪:。
TrueType字型就运用了以贝塞尔样条组成的二次贝塞尔曲线。
P0、P1、P2、P3四个点在平面或在三维空间中定义了三次方贝塞尔曲线。
曲线起始于P0走向P1,并从P2的方向来到P3。
一般不会经过P1或P2;这两个点只是在那里提供方向资讯。
P0和P1之间的间距,决定了曲线在转而趋进P3之前,走向P2方向的“长度有多长”。
曲线的参数形式为:。
现代的成象系统,如PostScript、Asymptote和Metafont,运用了以贝塞尔样条组成的三次贝塞尔曲线,用来描绘曲线轮廓。
一般化P0、P1、…、P n,其贝塞尔曲线即。
例如:。
如上公式可如下递归表达:用表示由点P0、P1、…、P n所决定的贝塞尔曲线。
则用平常话来说,阶贝塞尔曲线之间的插值。
一些关于参数曲线的术语,有即多项式又称作n阶的伯恩斯坦基底多项式,定义00 = 1。
点P i称作贝塞尔曲线的控制点。
多边形以带有线的贝塞尔点连接而成,起始于P0并以P n终止,称作贝塞尔多边形(或控制多边形)。
贝塞尔多边形的凸包(convex hull)包含有贝塞尔曲线。
线性贝塞尔曲线函数中的 t 会经过由 P 0 至P 1 的 B(t ) 所描述的曲线。
例如当 t=0.25 时,B(t ) 即一条由点 P 0 至 P 1 路径的四分之一处。
就像由 0 至 1 的连续 t ,B(t ) 描述一条由 P 0 至 P 1 的直线。
集美大学
计算机工程学院实验报告
课程名称计算机图形学教程
实验名称实验五、编程生成“三次贝塞尔”
曲线
实验类型设计型姓名学号
日期12月12日地点
成绩教师
一、实验目的:
一方面,让学生对自由曲线的生成算法有更深入的理解,特别是对于曲线的逼近,能够通过实验编程来验证书上所提供的算法思想:另一方面,在图形程序设计方法(如设计各种各样的图形)、绘图函数的使用以及C和C++语言编程环境、程序的调试和测试方面受到比较系统和严格的训练。
二、实验内容:
运用所学的三次贝塞尔曲线生成的算法,根据以下数据点[x, y]:[50, 100] [80, 230] [100, 270] [140, 160] [180, 50] [240, 65] [270, 120] [330, 230] [380, 230] [430, 150]计算出结果,并实现三段贝塞尔在屏幕上显示的功能
三、实验要求:
(1)3段三次贝塞尔曲线在衔接点上要连续,曲线整体效果要光滑。
(2)整个图形轮廓要清晰,色彩要分明
四、实验环境:
1.PC,CPU:P4 2.0GHz以上,内存:512M,硬盘:40GB以上;
2.操作系统:Microsoft Windows 2000 /2003/XP;
3.软件:VC或JAVA等。
五、实验内容及完成情况:
#include "graphics.h"
#include "conio.h"
#include "stdio.h"
typedef struct
{
double x,y;
} DPOINT; //定义结构体
class Bezier //定义Bezier类
{
private:
DPOINT* bP;
int m_maxIndex;
void drawFrame();
void drawCurve();
void drawCurve(int p0,int p1,int p2,int p3);
public:
Bezier(DPOINT* p,int len); //定义构造函数
void draw();
};
Bezier::Bezier(DPOINT* p,int len) //构造函数的实现{
this ->bP=p;
m_maxIndex=len-1;
}
void Bezier::draw() //通过公有函数调用私有函数
{
drawFrame();
drawCurve();
}
void Bezier::drawFrame() //其功能是绘制出多边形和各个端点
{
setcolor(12);
for(int i=0;i<m_maxIndex;i++)
{
line( bP[i].x, bP[i].y, bP[i+1].x, bP[i+1].y ); //绘制多边形
circle(bP[i].x, bP[i].y,5); //绘制各个端点}
circle(bP[m_maxIndex].x,bP[m_maxIndex].y,5);
}
void Bezier::drawCurve() //实现多段Bezier曲线绘制的功能
{
for(int i=0;i<=m_maxIndex-3;i+=3)
{
drawCurve(i,i+1,i+2,i+3);
}
}
void Bezier::drawCurve(int p0,int p1,int p2,int p3) //实现绘制某一段Bezier曲线的功能
{
double tmpx=0.0;
double tmpy=0.0;
double t=0.0;
for(;t<=1.0;t+=0.001)
{
tmpx=(-bP[p0].x+3*bP[p1].x-3*bP[p2].x+bP[p3].x)*t*t* t+(3*bP[p0].x-6*bP[p1].x+3*bP[p2].x)*t*t+(-3*bP[p0].x+ 3*bP[p1].x)*t+bP[p0].x;
tmpy=(-bP[p0].y+3*bP[p1].y-3*bP[p2].y+bP[p3].y)*t*t* t+(3*bP[p0].y-6*bP[p1].y+3*bP[p2].y)*t*t+(-3*bP[p0].y+ 3*bP[p1].y)*t+bP[p0].y;
putpixel(tmpx,tmpy,3);
}
}
void main() //主函数的实现
{
int graphdriver=DETECT,graphmode;
initgraph(&graphdriver,&graphmode,"E:\\tc3\\bgi");
setbkcolor(0);
outtextxy(10,20,"n\n\n\n\n\n\ jisuan1013 2010810070 chengaowei");
DPOINT* p;
p=new DPOINT[10];
p[0].x=50.0;
p[0].y=100.0;
p[1].x=80.0;
p[1].y=230.0;
p[2].x=100.0;
p[2].y=270.0;
p[3].x=140.0;
p[3].y=160.0;
p[4].x=180.0;
p[4].y=50.0;
p[5].x=240.0;
p[5].y=65.0;
p[6].x=270.0;
p[6].y=120.0;
p[7].x=330.0;
p[7].y=230.0;
p[8].x=380.0;
p[8].y=230.0;
p[9].x=430.0;
p[9].y=150.0;
Bezier bzr(p,10);
bzr.draw();
delete p;
getch();
closegraph();
}
运行结果:
六、实验总结:
通过这次实验,让我对自由曲线的生成算法有更深入的理解,特别是对于曲线的逼近,能够通过实验编程来验证书上所提供的算法思想,在图形程序设计方法(如设计各种各样的图形)、绘图函数的使用以及C和C++语言编程环境、程序的调试和测试方面受到比较系统和严格的训练。