各位高手,已知六个点,求一条平滑曲线,将这六个点连在曲线上。(六点拟合成)

时间:2022-06-25 13:59:41
能给出具体的公式或代码最好了,急用,请帮帮我。

27 个解决方案

#1


很多方法可以实现,比较简单的一种是采用
Y = aX^6 + bX^5 + ... + fX + c 合成。
要更光滑的,不同弧度的可以采用其它方法。

具体实现应该不难吧?

#2


楼上的,六个点,一个五次函数就好了吧
y=ax^5 + bx^4 + cx^3 + dx^2 + ex + f
把这六点代入,然后解这个六元一次方程组就好了

#3


采用贝塞尔曲线拟合
好象Windows有API

#4


如果已经得到了方程式,如何把这个方程式编程显示出来呢?

#5


如果不用得到具体的方程式的话,用PolyBezier函数吧,不过它需要4n-1个点,你是6个点的话,把第一个点同时算成第7个点好了.

#6


大虾,本人对数学理论所知甚少,希望给出导完的公式,因为六个点是随机的。编码如何实现???谢了

#7


这六个点在曲线上,不是控制点。

#8


5次方程组?有没有搞错。现在我还不知道谁会3次以上的公式呢。a^4-b^4,谁会?

#9


你已经把袋鼠忘光了吧?

#10


徐士良《C常用算法程序集》插值与拟和

#11


嘿嘿
我好像有这本书,回去查查看,有代码的话贴给你。
我觉得我上面那个思路是对的,六元一次方程组很容易解吧
至于画吗,找些点setpixel就成

#12


其实好象还有一种办法就是自己再插入几个点,用导数的方法解决!我以前就是这么写的!!

#13


其实好象还有一种办法就是自己再插入几个点,用导数的方法解决!我以前就是这么写的!!

#14


上铺的弟兄,后插入的几个点是如何算出来的??望告知
to adone(阿不)候君佳音

#15


上铺的弟兄,后插入的几个点是如何算出来的??望告知
to adone(阿不)候君佳音

#16


akima

#17


到开发中心,我以前贴过一个有源代码的
或者到我网站http://breath.onchina.net上去看,在VC专题中有算法的例子

#18


在曲线拟合方面,用B样条可能更合适。如果你给出的点都必须在曲线上,那么将它们都作为三重节点好了。同时,对于首尾两个节点,还可以指定一阶导数/二阶导数的值以求两段曲线间的光滑拟合。

#19


用牛顿插值

#20


我建议用B样条曲线,有关曲线拟合的书上都有的。

#21


用最小二乘法

#22


用最小二乘法,具体代码我有,和我联系吧

#23


什么叫六元一次方程组?!有没有搞错!应该叫一元n次多项式.
最小二乘法误差很大, 况且你事先并不知道这些点就一定满足某个
有人在csdn上贴的最小二乘法曲线拟合算法有错,http://www.csdn.net/develop/read_article.asp?id=2369.
只是要光滑的话贝塞尔曲线拟合很好.
如果你用delphi这根本不是问题.Tchart自带了贝塞尔曲线拟合.

#24


建议找本《数值分析基础》的书读读,同济那本写的言简意赅,不难的
作者:同几大学计算数学教研室 黄自萍等,15。00元

#25


找数学系的教授

#26


#include<graphics.h>
#include<conio.h>
void calc(int*,int*,int);
void main()
{
  const int n=6;
  int x[n+2]={0,20,80,300,500,400,100},y[n+2]={0,120,80,20,250,300,100};
  int gd=DETECT,gm,i;
  registerbgidriver(EGAVGA_driver);//这里注意可以改改
  initgraph(&gd,&gm,"");
  for(i=1;i<=n;i++)circle(x[i],y[i],2);
  calc(x,y,n);
  getch();
  closegraph();
}

void calc(int *x,int *y,int n)
{
    const int k=100;//调整这个可以调整精度
    register int i,j;
    double t1,t2,t3,t,a,b,c,d,tx,ty;
    x[0]=x[1];y[0]=y[1];
    x[n+1]=x[n];y[n+1]=y[n];
    t=0.5/k;
    moveto(x[1],y[1]);
    i=0;
    for(i=0;i<n-1;i++)
for(j=1;j<k;j++){
    t1=j*t;
    t2=t1*t1;
    t3=t2*t1;
    a=4*t2-t1-4*t3;
    b=1-10*t2+12*t3;
    c=t1+8*t2-12*t3;
    d=4*t3-2*t2;
    tx=a*x[i]+b*x[i+1]+c*x[i+2]+d*x[i+3]+.5;
    ty=a*y[i]+b*y[i+1]+c*y[i+2]+d*y[i+3]+.5;
    lineto(tx,ty);
}
    lineto(x[i+2],y[i+2]);
}

#27


二次曲线生成

#1


很多方法可以实现,比较简单的一种是采用
Y = aX^6 + bX^5 + ... + fX + c 合成。
要更光滑的,不同弧度的可以采用其它方法。

具体实现应该不难吧?

#2


楼上的,六个点,一个五次函数就好了吧
y=ax^5 + bx^4 + cx^3 + dx^2 + ex + f
把这六点代入,然后解这个六元一次方程组就好了

#3


采用贝塞尔曲线拟合
好象Windows有API

#4


如果已经得到了方程式,如何把这个方程式编程显示出来呢?

#5


如果不用得到具体的方程式的话,用PolyBezier函数吧,不过它需要4n-1个点,你是6个点的话,把第一个点同时算成第7个点好了.

#6


大虾,本人对数学理论所知甚少,希望给出导完的公式,因为六个点是随机的。编码如何实现???谢了

#7


这六个点在曲线上,不是控制点。

#8


5次方程组?有没有搞错。现在我还不知道谁会3次以上的公式呢。a^4-b^4,谁会?

#9


你已经把袋鼠忘光了吧?

#10


徐士良《C常用算法程序集》插值与拟和

#11


嘿嘿
我好像有这本书,回去查查看,有代码的话贴给你。
我觉得我上面那个思路是对的,六元一次方程组很容易解吧
至于画吗,找些点setpixel就成

#12


其实好象还有一种办法就是自己再插入几个点,用导数的方法解决!我以前就是这么写的!!

#13


其实好象还有一种办法就是自己再插入几个点,用导数的方法解决!我以前就是这么写的!!

#14


上铺的弟兄,后插入的几个点是如何算出来的??望告知
to adone(阿不)候君佳音

#15


上铺的弟兄,后插入的几个点是如何算出来的??望告知
to adone(阿不)候君佳音

#16


akima

#17


到开发中心,我以前贴过一个有源代码的
或者到我网站http://breath.onchina.net上去看,在VC专题中有算法的例子

#18


在曲线拟合方面,用B样条可能更合适。如果你给出的点都必须在曲线上,那么将它们都作为三重节点好了。同时,对于首尾两个节点,还可以指定一阶导数/二阶导数的值以求两段曲线间的光滑拟合。

#19


用牛顿插值

#20


我建议用B样条曲线,有关曲线拟合的书上都有的。

#21


用最小二乘法

#22


用最小二乘法,具体代码我有,和我联系吧

#23


什么叫六元一次方程组?!有没有搞错!应该叫一元n次多项式.
最小二乘法误差很大, 况且你事先并不知道这些点就一定满足某个
有人在csdn上贴的最小二乘法曲线拟合算法有错,http://www.csdn.net/develop/read_article.asp?id=2369.
只是要光滑的话贝塞尔曲线拟合很好.
如果你用delphi这根本不是问题.Tchart自带了贝塞尔曲线拟合.

#24


建议找本《数值分析基础》的书读读,同济那本写的言简意赅,不难的
作者:同几大学计算数学教研室 黄自萍等,15。00元

#25


找数学系的教授

#26


#include<graphics.h>
#include<conio.h>
void calc(int*,int*,int);
void main()
{
  const int n=6;
  int x[n+2]={0,20,80,300,500,400,100},y[n+2]={0,120,80,20,250,300,100};
  int gd=DETECT,gm,i;
  registerbgidriver(EGAVGA_driver);//这里注意可以改改
  initgraph(&gd,&gm,"");
  for(i=1;i<=n;i++)circle(x[i],y[i],2);
  calc(x,y,n);
  getch();
  closegraph();
}

void calc(int *x,int *y,int n)
{
    const int k=100;//调整这个可以调整精度
    register int i,j;
    double t1,t2,t3,t,a,b,c,d,tx,ty;
    x[0]=x[1];y[0]=y[1];
    x[n+1]=x[n];y[n+1]=y[n];
    t=0.5/k;
    moveto(x[1],y[1]);
    i=0;
    for(i=0;i<n-1;i++)
for(j=1;j<k;j++){
    t1=j*t;
    t2=t1*t1;
    t3=t2*t1;
    a=4*t2-t1-4*t3;
    b=1-10*t2+12*t3;
    c=t1+8*t2-12*t3;
    d=4*t3-2*t2;
    tx=a*x[i]+b*x[i+1]+c*x[i+2]+d*x[i+3]+.5;
    ty=a*y[i]+b*y[i+1]+c*y[i+2]+d*y[i+3]+.5;
    lineto(tx,ty);
}
    lineto(x[i+2],y[i+2]);
}

#27


二次曲线生成