精华内容
下载资源
问答
  • Bezier曲线绘制

    2014-05-21 17:10:31
    Berzier曲线,使用Win32 Application,代码简单易懂,适合初学者
  • 简单的Bezier曲线绘制

    2013-01-21 10:58:12
    简单的Bezier曲线绘制,在vs2010环境下采用C#编程,利用控制点绘制Bezier曲线,体验Bezier曲线的基本思想
  • Bezier曲线绘制小程序

    2009-11-18 14:51:00
    Bezier曲线绘制小程序 Bezier曲线绘制小程序
  • Bezier曲线绘制及拼接

    2020-12-23 16:34:18
    MFC单文档程序,左键点击绘制控制点,右键点击绘制Bezier曲线。 可绘制多段Bezier曲线并拼接,达到一阶几何连续,可清屏重绘 计算机图形学实验作业
  • bezier曲线绘制程序

    2010-05-23 13:13:02
    用vc6.0编写的bezier曲线绘制程序,压缩包能包含详细的操作说明
  • MFC有理二次Bezier曲线绘制 非有理Bezier曲线曲线无法精确表示所有的二次曲线和二次曲面,引入了有理Bezier曲线曲面,来精确表示。如图,通过控制权重,可以获取不同的二次有理Bezier曲线(蓝色线条),虚线为非...

    MFC有理二次Bezier曲线绘制


    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    非有理Bezier曲线曲线无法精确表示所有的二次曲线和二次曲面,引入了有理Bezier曲线曲面,来精确表示。如图,通过控制权重,可以获取不同的二次有理Bezier曲线(蓝色线条),虚线为非有理Bezier曲线,作为对照。
    理论与算法参考《计算几何算法与实现》–孔令德
    代码实现如下:

    #pragma once
    #include"P2.h"
    #include"math.h"
    
    #define ROUND(h) int(h+0.5)
    class RationalQuadraticBezier
    {
    public:
    	RationalQuadraticBezier(void);
    	~RationalQuadraticBezier(void);
    
    	void ReadPoint(void);//赋值控制点
    	CP2 point[3];//控制点数组
    	void DrawCurve(CDC*pDC);//绘制曲线
    	void DrawControlPoint(CDC*pDC);//绘制控制点
    	void RationalCurve(CDC*pDC);
    };
    
    #include "StdAfx.h"
    #include "RationalQuadraticBezier.h"
    
    
    RationalQuadraticBezier::RationalQuadraticBezier(void)
    {
    	ReadPoint();
    }
    
    
    RationalQuadraticBezier::~RationalQuadraticBezier(void)
    {
    }
    
    void RationalQuadraticBezier::ReadPoint(void)
    {
    	point[0].x=-200,point[0].y=-100;
    	point[1].x=0,point[1].y=100;
    	point[2].x=200,point[2].y=-100;
    }
    
    
    void RationalQuadraticBezier::DrawCurve(CDC*pDC)
    {
    	DrawControlPoint(pDC);//绘制控制点
    	RationalCurve(pDC);//绘制有理二次Bezier样条
    }
    
    
    void RationalQuadraticBezier::DrawControlPoint(CDC*pDC)
    {
    	CPen NewPen,*pOldPen;//画笔
    	NewPen.CreatePen(PS_SOLID,3,RGB(0,0,0));
    	pOldPen=pDC->SelectObject(&NewPen);
    
    	CBrush NewBrush,*pOldBrush;
    	pOldBrush=(CBrush*)pDC->SelectStockObject(BLACK_BRUSH);//画刷
    	pDC->MoveTo(ROUND(point[0].x),ROUND(point[0].y));
    	for(int i=0;i<3;i++)
    	{
    		pDC->LineTo(ROUND(point[i].x),ROUND(point[i].y));
    		pDC->Ellipse(ROUND(point[i].x)-5,ROUND(point[i].y)-5,ROUND(point[i].x)+5,ROUND(point[i].y)+5);
    	}
    	pDC->SelectObject(pOldBrush);
    	pDC->SelectObject(pOldPen);
    }
    
    
    void RationalQuadraticBezier::RationalCurve(CDC*pDC)
    {
    	CPen NewPen,*pOldPen;
    	NewPen.CreatePen(PS_SOLID,1,RGB(0,0,255));
    	pOldPen=pDC->SelectObject(&NewPen);
    	double Bern02,Bern12,Bern22;//定义伯恩斯坦基函数
    	double weight0=1.0,weight2=1.0,weight1=-0.5;//权因子赋值
    	double tStep=0.01;//绘制步长
    	pDC->MoveTo(ROUND(point[0].x),ROUND(point[0].y));
    	for(double t=0;t<=1.0;t=t+tStep)
    	{
    		Bern02=(1-t)*(1-t);//伯恩斯坦基函数值
    		Bern12=2*t*(1-t);
    		Bern22=t*t;
    		CP2 tempPoint(0,0);//计算插值点
    		double denominator=Bern02*weight0+Bern12*weight1+Bern22*weight2;//分母
    		tempPoint.x=(Bern02*weight0*point[0].x+Bern12*weight1*point[1].x+Bern22*weight2*point[2].x)/denominator;//分子/分母
    		tempPoint.y=(Bern02*weight0*point[0].y+Bern12*weight1*point[1].y+Bern22*weight2*point[2].y)/denominator;
    		pDC->LineTo(ROUND(tempPoint.x),ROUND(tempPoint.y));
    	}
    	pDC->SelectObject(pOldPen);
    }
    
    
    
    
    展开全文
  • 开发环境MFC 计算机图形学 Bezier曲线绘制!源代码,已测试!
  • ezier曲线是计算机图形学中最基本、最重要...为使用户直观地了解其几何特性,介绍了在VisualC++6.0环境下开发Bezier曲线绘制程序的思路和方法, 探讨了程序开发中的关键技术,实现了Bezier曲线及其特征多边形的动态绘制。
  • 利用OpenGl进行Bezier曲线绘制 #include <windows.h> #include <math.h> #include <gl/GL.h> #include <gl/glut.h> int SCREEN_HEIGHT = 480; int NUMPOINTS = 0; //定义点对象数组 ...

    利用OpenGl进行Bezier曲线绘制

    #include <windows.h>  
    #include <math.h>  
    #include <gl/GL.h>  
    #include <gl/glut.h>  
    int SCREEN_HEIGHT = 480;
    int NUMPOINTS = 0;
    //定义点对象数组
    class Point
    {
    public:
    	float x, y;
    	void setxy(float x2, float y2)
    	{
    		x = x2;
    		y = y2;
    	}
    	Point  operator&(const Point& rPoint)
    	{
    		x = rPoint.x;
    		y = rPoint.y;
    		return *this;
    	}
    };
    Point poi[4];
    void myInit()
    {
    	glClearColor(0.0, 0.0, 0.0, 0.0);
    	glColor3f(1.0f, 0.0, 0.0);
    	glPointSize(4.0);
    	glMatrixMode(GL_PROJECTION);
    	glLoadIdentity();
    	//定义左下角为原点
    	gluOrtho2D(0.0, 640, 0.0, 480.0);
    }
    void drawDot(Point p)
    {
    	glPointSize(10);
    	glBegin(GL_POINTS);
    	glVertex2f(p.x, p.y);
    	glEnd();
    	glFlush();
    }
    void drawLine(Point p1, Point p2)
    {
    	glLineWidth(2);
    	glBegin(GL_LINES);
    	glVertex2f(p1.x, p1.y);
    	glVertex2f(p2.x, p2.y);
    	glEnd();
    	glFlush();
    }
    //Bezier曲线
    Point drawBezier(Point A, Point B, Point C, Point D, double t)
    {
    	Point P;
    	double a1 = pow((1 - t), 3);
    	double a2 = pow((1 - t), 2) * 3 * t;
    	double a3 = 3 * t * t * (1 - t);
    	double a4 = t * t * t;
    	P.x = a1 * A.x + a2 * B.x + a3 * C.x + a4 * D.x;
    	P.y = a1 * A.y + a2 * B.y + a3 * C.y + a4 * D.y;
    	return P;
    }
    void myMouse(int button, int state, int x, int y)
    {
    	if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)		//鼠标左键按下
    	{
    		poi[NUMPOINTS].setxy((float)x, (float)(SCREEN_HEIGHT - y));
    		NUMPOINTS++;			//点数量+1
    		if (NUMPOINTS == 4)
    		{
    			glColor3f(1.0, 0.0, 1.0);
    			drawDot(poi[0]);
    			drawDot(poi[1]);
    			drawDot(poi[2]);
    			drawDot(poi[3]);
    			glColor3f(1.0, 1.0, 1.0);
    			drawLine(poi[0], poi[1]);
    			drawLine(poi[1], poi[2]);
    			drawLine(poi[2], poi[3]);
    			glColor3f(0.0, 1.0, 1.0);
    			Point POld = poi[0];
    			for (double t = 0.0; t <= 1.0; t += 0.1)
    			{
    				Point P = drawBezier(poi[0], poi[1], poi[2], poi[3], t);
    				drawLine(POld, P);
    				POld = P;
    			}
    			glColor3f(1.0, 0.0, 0.0);
    			NUMPOINTS = 0;
    		}
    	}
    }
    
    //按下f键可以清空屏幕
    void myKeyboard(unsigned char key, int x, int y)
    {
    	if (key == 'f')
    	{
    		glClear(GL_COLOR_BUFFER_BIT);
    		glFlush();
    	}
    }
    
    
    void myDisplay()
    {
    	glClear(GL_COLOR_BUFFER_BIT);
    	glFlush();
    }
    
    
    int main(int argc, char* agrv[])
    {
    	glutInit(&argc, agrv);
    	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    	//窗口大小640*480
    	glutInitWindowSize(640, 480);
    	glutInitWindowPosition(100, 150);
    	glutCreateWindow("Bezier曲线绘制");
    	glutMouseFunc(myMouse);
    	glutKeyboardFunc(myKeyboard);//键盘
    	glutDisplayFunc(myDisplay);
    	myInit();
    	glutMainLoop();
    	return 0;
    }
    
    
    展开全文
  • vc++实现的bezier曲线绘制和分割程序
  • B样条和Bezier曲线的动态绘制,采用opengl绘制曲线,实现曲线的交互绘制
  • Bezier曲线绘制源码

    2013-07-27 01:05:54
    如果您还在为如何绘制贝塞尔曲线儿烦恼, 那么恭喜您,找对资源了!
  • 先在窗口内,选取四个点,然后点击“绘制bezier曲线”即可得到Bezier曲线。右键点击窗口内任意处,会抓住距离此点最近的控制点,再点击左键,可将此控制点移动至左击的位置。此文件包含了程序的源程序及实现。
  • Bezier曲线绘制算法与字母参数

    千次阅读 2018-09-17 14:59:34
    //3次Bezier曲线的循环实现算法 double coor[8]; int main() { HDC hdc = GetHdc(); for (int i = 0; i &lt; N; i++) { for (int j = 0; j &lt; 8; j++) { coor[j] = coordinate[i][j]; ...

    绘制算法

    //3次Bezier曲线的循环实现算法
    double coor[8];
    int main() {
        HDC hdc = GetHdc();
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < 8; j++) {
                coor[j] = coordinate[i][j];
            }
            double t = 0.0;
            while (t <= 1.0) {
                getInterPoint(4, t);
                t = t + 0.0001;
                SetPixel(hdc, ((coor[0]+0.6)/5+200), 200-coor[1]/5, RGB(255, 255, 255));
            }
        }
        system("PAUSE");
    }
    
    void getInterPoint(int n,double t) {
        if (n > 1) {
            for (int i = 0; i < n - 1; i++) {
                double x1 = coor[i*2 + 0];
                double y1 = coor[i*2 + 1];
                double x2 = coor[i*2 + 2];
                double y2 = coor[i*2 + 3];
                coor[i*2] = x1 + (x2 - x1)*t;
                coor[i*2 + 1] = y1 + (y2 - y1)*t;
            }
            n--;
            getInterPoint(n, t);
        }
    }

    参数

    • 字母T
    double coordinate[16][8] = {
        //T: x1,y1,x2,y2,x3,y3,x4,y4 
        237,620,237,620,237,120,237,120, //1
        237,120,237, 35,226, 24,143, 19, //2
        143, 19,143, 19,143,  0,143,  0, //3
        143,  0,143,  0,435,  0,435,  0, //4
        435,  0,435,  0,435, 19,435, 19, //5
        435, 19,353, 23,339, 36,339,109, //6
        339,109,339,108,339,620,339,620, //7
        339,620,339,620,393,620,393,620, //8
        393,620,507,620,529,602,552,492, //9
        552,492,552,492,576,492,576,492, //10
        576,492,576,492,570,662,570,662, //11
        570,662,570,662,  6,662,  6,662, //12
          6,662,  6,662,  0,492,  0,492, //13
          0,492,  0,492, 24,492, 24,492, //14
         24,492, 48,602, 71,620,183,620, //15
        183,620,183,620,237,620,237,620  //16
    };
    int N = 16;

    这里写图片描述

    • 字母f
    double coordinate[21][8] = {
    //F: x1,y1,x2,y2,x3,y3,x4,y4 
    289,452,289,452,166,452,166,452, //1
    166,452,166,452,166,568,166,568, //2
    166,568,166,627,185,657,223,657, //3
    223,657,245,657,258,647,276,618, //4
    276,618,292,589,304,580,321,580, //5
    321,580,345,580,363,598,363,621, //6
    363,621,363,657,319,683,259,683, //7
    259,683,196,683,144,656,118,611, //8
    118,611, 92,566, 84,530, 83,450, //9
     83,450, 83,450,  1,450,  1,450, //10
      1,450,  1,450,  1,418,  1,418, //11
      1,418,  1,418, 83,418, 83,418, //12
     83,418, 83,418, 83,104, 83,104, //13
     83,104, 83, 31, 72, 19,  0, 15, //14
      0, 15,  0, 15,  0,  0,  0,  0, //15
      0,  0,  0,  0,260,  0,260,  0, //16
    260,  0,260,  0,260, 15,260, 15, //17
    260, 15,178, 18,167, 29,167,418, //18
    167,104,167,104,167,418,167,418, //19
    167,418,167,418,289,418,289,418, //20
    289,418,289,418,289,452,289,452  //21
    };
    int N = 21;

    这里写图片描述

    • 数字5
    double coordinate[21][8] = {
        //5: x1,y1,x2,y2,x3,y3,x4,y4 
        149,597,149,597,149,597,345,597, //1
        345,597,361,597,365,599,368,606, //2
        368,606,406,695,358,606,406,695, //3
        406,695,397,702,406,695,397,702, //4
        397,702,382,681,372,676,351,676, //5
        351,676,351,676,351,676,142,676, //6
        142,676, 33,439,142,676, 33,439, //7
         33,439, 32,438, 32,436, 32,434, //8
         32,434, 32,438, 35,426, 44,426, //9
         44,426, 74,426,109,420,149,408, //10
        149,408,269,372,324,310,324,208, //11
        324,208,324,112,264, 37,185, 37, //12
        185, 37,165, 37,149, 44,119, 66, //13
        119, 66, 86, 90, 65, 99, 42, 99, //14
         42, 99, 14, 99,  0, 87,  0, 62, //15
          0, 62,  0, 24, 46,  0,121,  0, //16
        121,  0,205,  0,282, 27,333, 78, //17
        333, 78,378,123,399,180,399,256, //18
        399,256,399,327,381,372,333,422, //19
        333,422,288,468,232,491,112,512, //20
        112,512,112,512,149,597,149,597  //21
    };
    int N = 21;

    这里写图片描述

    展开全文
  • M文件实现,其中bezier函数调用另一个函数来绘制,文件开头均有详细的说明个变量含义。
  • Bezier曲线绘制方法

    千次阅读 2015-10-21 19:28:37
    而如果是绘制一条曲线的话,如果要用m个等间距的点来逼近这条曲线的话,复杂度是O(m*n^2),有乘法。 感觉不应该用这个方法,太慢了。 比如用高阶差分的方法,同样用m个等间距的点来逼近曲线的值,复杂度只要O(m*n)...




    de Casteljau算法能简单快速地求出某个t值的曲线值,复杂度是O(n^2)的乘法与加法。

    这里平方级的计算感觉比较慢,如果应用秦九韶算法来求该多项式值的话,复杂度降低到了O(n)。  (难度是因为数值稳定性的原因?)


    而如果是绘制一条曲线的话,如果要用m个等间距的点来逼近这条曲线的话,复杂度是O(m*n^2),有乘法。

    感觉不应该用这个方法,太慢了。


    比如用高阶差分的方法,同样用m个等间距的点来逼近曲线的值,复杂度只要O(m*n),而且只有加减法。(差了一个n,实际n取比较小,不过再小也是肉,n=3时,耗时减小3倍)

    例子  求x^2的等间距值方法如下:

    这里第n行就是n阶向前差分的值。


    具体做法就是,首先先要有n+1个初始值,然后,求出n个一阶差分,n-1个二阶差分。最后一行为1个n阶差分值,然后最后一行向后扩展m个值(常数),然后在反向向上求值。



    似乎 de Casteljau算法优点只在求不等间距的点时候或者具体某个t值的时候才体现出来。





    展开全文
  • matlab平台,2次输入3个控制点,3次输入4个控制点,即可做出图像,包含m文件。
  • /*输入点的个数是可以手动改动的,此程序中输入点的最大值设置为. *同时,程序实现了键盘的交互,用来控制程序运行过程中的退出、重画等 */ ... //贝赛尔曲线的幂次 GLfloat Bfunc[15]={0.0...
  • android上Bezier曲线绘制

    千次阅读 2013-07-27 01:17:17
    今天重点写贝塞尔二阶、三阶曲线 。 贝塞尔曲线具体原理请参考:http://baike.baidu.com/view/60154.htm?fromId=2228603  废话不说, 以下是二阶曲线曲线上点的计算公式:    对给定的起始点(startPoint), ...
  • 计算机图形学:3次Bezier曲线绘制

    千次阅读 2020-06-06 20:01:18
    改变窗口形状,所绘制的物体不变形,而只是大小发生变化 void reshape (int w, int h) { glviewport (0, 0, (glsizei) w, (glsizei) h); glmatrixmode (gl_projection); glloadidentity (); if (w <= h) gluortho...
  • 原文地址:http://blog.csdn.net/pizi0475/article/details/8506564 发信人: william@cis_nctu (何陋居主), 信区: programming 标 题: [转载] Hermite 与 Bezier 曲线绘制 发信站: 交大资科_BBS (May 25...
  • 二次Bezier曲线 三次Bezier曲线 n次Bezier曲线 的函数 double B(int n,int i,float t){ int sum=1; if(i==n||i==0) return pow(t,i)*pow(1-t,n-i); int j; for(j=n-i+1;j<=n;j++) sum*=j;...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,137
精华内容 2,054
关键字:

bezier曲线绘制