正确的Bezier曲线的绘制

article/2025/11/9 18:11:59

原文地址:http://blog.csdn.net/mylovestart/article/details/8434310

Bezier曲线是参数多项式曲线,它由一组控制多边形折线(控制多边形)的顶点唯一定义,在控制多边形的各顶点中,只有第一个和最后一个顶点在曲线上,其他的顶点则用以定义曲线的导数,阶次和形状

Bezier曲线的数学基础是能够在第一个和最后一个顶点之间进行插值的一个多项式混合函数,对于有n+1个控制点的Bezier曲线段用参数方程表示如下:


式中pk(xk,yk,zk),k=0,1,2…..n是控制多边形的n+1个顶点,BENk,n(t)是Bernstein基函数


下面由键盘输入任意个控制(特征)点,绘制出对应的控制(特征)多边形及Bezier曲线。

先呈上原作者的代码,但是我发现这个代码红色部分写错了,然后我修改了一下,修改后的代码在下面。

    #include<stdio.h>  #include<string.h>  #include<conio.h>  #include<windows.h>  #include<graphics.h>   #include<math.h>  #define N 1000  int n;//控制点的个数  struct point  //控制点的坐标  {  double x;  double y;  }point[N];  void init()  //输入控制点的坐标  {  int i;  printf("please input the number of the points: ");  scanf("%d",&n);  printf("please input the location of the points\n");  for(i=0;i<n;i++)  scanf("%lf %lf",&point[i].x,&point[i].y);  }  void sol1()  //绘制控制多边形的轮廓  {  int i;  setcolor(RED);  for(i=0;i<n-1;i++)  line((int)point[i].x,(int)point[i].y,(int)point[i+1].x,(int)point[i+1].y);  }  
    double sol2(int nn,int k)  //计算多项式的系数C(nn,k)  {  int i;  double sum=1;  for(i=1;i<=nn;i++)  sum*=i;  for(i=1;i<=k;i++)  sum/=i;  for(i=1;i<=nn-k;i++)  sum/=i;  return sum;  }  void sol3(double t)  //计算Bezier曲线上点的坐标  {  double x=0,y=0,Ber;  int k;  for(k=0;k<n;k++)  {  Ber=sol2(n-1,k)*pow(t,k)*pow(1-t,n-1-k);  x+=point[k].x*Ber;  y+=point[k].y*Ber;  }  putpixel((int)x,(int)y,GREEN);  }  void sol4()  //根据控制点,求曲线上的m个点  {  int m=500,i;  for(i=0;i<=m;i++)  sol3((double)i/(double)m);  }  int main()  {  init();  initgraph(640, 480);   sol1();  sol4();  getch();  closegraph();  return 0;  }  

#include <stdio.h>
#include <graphics.h>
#include <conio.h>
#include <windows.h>
#include <math.h>
#include <string.h>
#define N 1000
int n;//控制点的个数
struct point//控制点的坐标
{double x;double y;
}point[N];
void init()//输入控制点的坐标、
{int i;printf("请输入点的个数:\n");scanf("%d",&n);printf("请输入控制点的坐标:\n");for(i = 0; i < n; i++){scanf("%lf %lf",&point[i].x,&point[i].y);}
}
void sol1()//绘制控制多边形的轮廓
{int i;setcolor(RED);for(i = 0; i < n - 1; i++){line((int)point[i].x,(int)point[i].y,(int)point[i+1].x,(int)point[i+1].y);}
}
double sol2(int nn,int k)//计算多项式的系数C(nn,k)
{int i;double sum = 1;for(i = nn; i >= k+1; i--){sum *= i;}for(i = nn - k; i >=2; i--){sum /= i;}return sum;
}
void sol3(double t)//计算Bezier曲线上点的坐标
{double x = 0;double y = 0;double Ber;int k;for(k = 0; k< n; k++){Ber = sol2(n-1,k) * pow(t,k) * pow(1-t,n-1-k);x  += point[k].x * Ber;y  += point[k].y * Ber;}putpixel((int)x,(int)y,GREEN);
}
void sol4()//根据控制点,求曲线上的m个点
{int i;int m = 5000;for(i = 0; i <= m; i++){sol3((double)i / (double)m);}
}
int main()
{init();initgraph(1640,1480);sol1();sol4();getch();closegraph();return 0;
}

最后附上截图



http://chatgpt.dhexx.cn/article/VqFcU7qk.shtml

相关文章

根据Bezier曲线的定义公式实现Bezier曲线的绘制

Bezier曲线的定义公式 Pi是曲线上点的坐标&#xff08;x,y,(z0)&#xff09;&#xff0c; Bi,n(t)伯恩斯坦公式&#xff0c;绘制Bezier曲线的第一种方法是根据这个公式来绘制。首先看看绘制的效果&#xff1a; &#xff08;1&#xff09;计算定义中多项式的值 首先要求伯恩斯…

Bezier曲线描述

Bezier曲线 1.Bezier曲线的定义 当用曲线段拟合曲线f(x)时&#xff0c;可以把曲线表示为许多小线段φi(x)之和&#xff0c;其中φi(x)称为基&#xff08;混合&#xff09;函数。 这些基&#xff08;混合&#xff09;函数是要用于计算和显示的。因此&#xff0c;经常选择多项式…

Bezier曲线的绘制

Bezier曲线是参数多项式曲线,它由一组控制多边形折线(控制多边形)的顶点唯一定义,在控制多边形的各顶点中,只有第一个和最后一个顶点在曲线上,其他的顶点则用以定义曲线的导数,阶次和形状 Bezier曲线的数学基础是能够在第一个和最后一个顶点之间进行插值的一个多项式混合函数,…

Bezier曲线的生成算法

Bezier曲线的生成方法 生成一条Bezier曲线实际上就是要求出曲线上的点。 1.根据定义直接生成Bezier曲线 定义&#xff1a; 其中 那么生成步骤为&#xff1a; ①首先给出 的递归计算式&#xff1a; ②&#xff1a;将表示成分量形式 由于的计算量大&#xff0c;算法效率不高…

bezier曲线解析与代码(c++)

前言&#xff1a; 作为rhino重度用户&#xff0c;我对于nurbs建模早有耳闻&#xff0c;但对于何为nurbs却不得其解。最近借上《计算机辅助设计》课程的机会&#xff0c;对此作了一些深入的学习&#xff0c;于是在此记录一下一些课程笔记和课后思考。了解nurbs&#xff0c;主要对…

Bezier曲线构造

Bezier曲线构造 曲线公式 曲 线 &#xff1a; C ( u ) ∑ i 0 n B n , i ( u ) P i 基 函 数 &#xff1a; B n , i n ! i ! ( n − i ) ! u i ( 1 − u ) n − i 曲线&#xff1a;C(u) \sum^n_{i0}B_{n,i}(u)P_i\\ 基函数&#xff1a;B_{n,i}\frac{n!}{i!(n-i)!}u^i(1-u)…

java版 贝塞尔曲线算法

public void test() {CvPoint controlPoint[] new CvPoint[4];controlPoint[0] new CvPoint(50, 60); //起点controlPoint[1] new CvPoint(130, 200); //控制点controlPoint[2] new CvPoint(300, 360); //控制点controlPoint[3] new CvPoint(400, 600); //终点int n cont…

Bezier曲线原理及实现代码(c++)

http://devres.zoomquiet.io/data/20110728232822/index.html Bezier曲线原理及实现代码&#xff08;c&#xff09; 一、原理&#xff1a; 贝塞尔曲线于1962年&#xff0c;由法国工程师皮埃尔贝塞尔&#xff08;Pierre Bzier&#xff09;所广泛发表&#xff0c;他运用贝塞尔曲线…

用Java实现可交互的贝塞尔曲线(Bezier curve)

关于贝塞尔曲线的详细数学原理及公式可参考&#xff1a; 贝塞尔曲线_百度百科 我们来谈谈贝塞尔曲线 本文给出了一种用Java实现贝塞尔曲线的方法&#xff0c;并且可以用鼠标拖动改变锚点。 效果演示图&#xff1a; 这里引用百度百科给出的公式&#xff1a; 二次方公式 三次方…

Bezier曲线简介

Bezier曲线简介 Bezier曲线&#xff0c;又有人叫贝赛尔曲线&#xff0c;贝兹曲线&#xff0c;在计算机绘图中经常被用到&#xff0c;由于前些天事件要用到这个&#xff0c;所以就研究了下。 有了参考资料&#xff0c;其实也不是很复杂。 曲线的介绍&#xff08;转自维基百科,见…

Bezier曲线原理及其代码实现

Bezier曲线原理及实现代码&#xff08;c&#xff09; 一、原理&#xff1a; 贝塞尔曲线于1962年&#xff0c;由法国工程师皮埃尔?贝塞尔&#xff08;Pierre B?zier&#xff09;所广泛发表&#xff0c;他运用贝塞尔曲线来为汽车的主体进行设计。贝塞尔曲线最初由 Paul de Cast…

Bezier曲线及其性质

本文为Bezier曲线mooc教程学习笔记。 目录 Bezier曲线与曲面[1] Bezier曲线的背景[2] Bezier曲线[3] Bezier曲线详细定义[4] Bezier曲线举例[5] Bernstein 基函数性质[6] 贝塞尔曲线的性质[7] Bezier曲线的生成[8] Bezier曲线的拼接[9] Bezier曲线的升阶与降阶 Bezier曲线与曲面…

Bezier曲线原理

一、原理&#xff1a; 贝塞尔曲线于1962年&#xff0c;由法国工程师皮埃尔贝塞尔&#xff08;Pierre Bzier&#xff09;所广泛发表&#xff0c;他运用贝塞尔曲线来为汽车的主体进行设计。贝塞尔曲线最初由Paul de Casteljau 于1959年运用de Casteljau 算法开发&#xff0c;以稳…

如何将多张图片合成一个pdf?

如何将多张图片合成一个pdf&#xff1f;平时我们都喜欢将word或者ppt文件转换成pdf后再使用&#xff0c;除此之外&#xff0c;我们还会将多张图片合并转换成pdf文件&#xff0c;大家会用什么方法将图片合并成pdf呢&#xff1f;我相信有很多小伙伴会使用这个方法&#xff0c;先将…

怎么把四个图片合成一个图片?

怎么把四个图片合成一个图片&#xff1f;关于图片的合成&#xff0c;我们一般都会用到图片处理软件来进行。但是对于一些职场新人来说&#xff0c;他根本不会用一些专业的图片处理软件&#xff0c;那么这个问题对他来说就是非常棘手的。其实遇到这样的问题&#xff0c;新人朋友…

python将多张图片合并成一张图片

文章目录 说明&#xff1a;合并图片的三个过程1、参考原博主的&#xff1a;2、优化第一个数量问题&#xff1a;3、优化俩个问题&#xff08;数量不限性状按比例变小&#xff09;4、优化黑行高度问题5、合成图片不清晰问题&#xff1a;总结下&#xff1a; 说明&#xff1a; 今天…

如何把一张图片分割成几张

把一张图片分割成几张的方法&#xff1a; 工具/原料&#xff1a;硬件&#xff1a;电脑、软件&#xff1a;Photoshop 7.0、系统&#xff1a;Windows10专业版64位操作系统。 1、打开平PS&#xff0c;进入新建文档里面&#xff0c;然后把图片直接拉到界面中。或者直接打开图片。 2…

jpg怎么合成一份_如何将多张图片合成一个文件

大家好&#xff0c;我是时间财富网智能客服时间君&#xff0c;上述问题将由我为大家进行解答。 将多张图片合成一个文件的方法是&#xff1a; 1、将所有图片拖到一个文件夹里&#xff0c;鼠标右键点击“添加压缩”。 2、点击确定&#xff0c;这样就成了一个文件。 计算机(compu…

怎样能把两张照片拼成一张图片,5种工具分享

怎样能把两张照片拼成一张图片&#xff1f;图片拼合的应用场景是很多的。比如将几张相册中的照片拼成一张合影、将多个地图截图拼合在一起形成一个更大的区域地图、将多个漫画图像合并成一本漫画册等。这项技术可以方便地将多张图片整合为一张&#xff0c;节省时间和精力。 因此…

怎么将几张照片合成一张图片,简单步骤易学

怎么将几张照片合成一张图片&#xff1f;在当代社会&#xff0c;图片已经成为了人们生活和工作中不可或缺的重要元素。无论是在网上浏览、社交媒体、电商平台、还是在企业营销、科研教育、娱乐创作等各种场合中&#xff0c;都有着广泛的应用。而将不同的图片进行合并&#xff0…