27 个解决方案
#1
很多方法可以实现,比较简单的一种是采用
Y = aX^6 + bX^5 + ... + fX + c 合成。
要更光滑的,不同弧度的可以采用其它方法。
具体实现应该不难吧?
Y = aX^6 + bX^5 + ... + fX + c 合成。
要更光滑的,不同弧度的可以采用其它方法。
具体实现应该不难吧?
#2
楼上的,六个点,一个五次函数就好了吧
y=ax^5 + bx^4 + cx^3 + dx^2 + ex + f
把这六点代入,然后解这个六元一次方程组就好了
y=ax^5 + bx^4 + cx^3 + dx^2 + ex + f
把这六点代入,然后解这个六元一次方程组就好了
#3
采用贝塞尔曲线拟合
好象Windows有API
好象Windows有API
#4
如果已经得到了方程式,如何把这个方程式编程显示出来呢?
#5
如果不用得到具体的方程式的话,用PolyBezier函数吧,不过它需要4n-1个点,你是6个点的话,把第一个点同时算成第7个点好了.
#6
大虾,本人对数学理论所知甚少,希望给出导完的公式,因为六个点是随机的。编码如何实现???谢了
#7
这六个点在曲线上,不是控制点。
#8
5次方程组?有没有搞错。现在我还不知道谁会3次以上的公式呢。a^4-b^4,谁会?
#9
你已经把袋鼠忘光了吧?
#10
徐士良《C常用算法程序集》插值与拟和
#11
嘿嘿
我好像有这本书,回去查查看,有代码的话贴给你。
我觉得我上面那个思路是对的,六元一次方程组很容易解吧
至于画吗,找些点setpixel就成
我好像有这本书,回去查查看,有代码的话贴给你。
我觉得我上面那个思路是对的,六元一次方程组很容易解吧
至于画吗,找些点setpixel就成
#12
其实好象还有一种办法就是自己再插入几个点,用导数的方法解决!我以前就是这么写的!!
#13
其实好象还有一种办法就是自己再插入几个点,用导数的方法解决!我以前就是这么写的!!
#14
上铺的弟兄,后插入的几个点是如何算出来的??望告知
to adone(阿不)候君佳音
to adone(阿不)候君佳音
#15
上铺的弟兄,后插入的几个点是如何算出来的??望告知
to adone(阿不)候君佳音
to adone(阿不)候君佳音
#16
akima
#17
到开发中心,我以前贴过一个有源代码的
或者到我网站http://breath.onchina.net上去看,在VC专题中有算法的例子
或者到我网站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自带了贝塞尔曲线拟合.
最小二乘法误差很大, 况且你事先并不知道这些点就一定满足某个
有人在csdn上贴的最小二乘法曲线拟合算法有错,http://www.csdn.net/develop/read_article.asp?id=2369.
只是要光滑的话贝塞尔曲线拟合很好.
如果你用delphi这根本不是问题.Tchart自带了贝塞尔曲线拟合.
#24
建议找本《数值分析基础》的书读读,同济那本写的言简意赅,不难的
作者:同几大学计算数学教研室 黄自萍等,15。00元
作者:同几大学计算数学教研室 黄自萍等,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]);
}
#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 合成。
要更光滑的,不同弧度的可以采用其它方法。
具体实现应该不难吧?
Y = aX^6 + bX^5 + ... + fX + c 合成。
要更光滑的,不同弧度的可以采用其它方法。
具体实现应该不难吧?
#2
楼上的,六个点,一个五次函数就好了吧
y=ax^5 + bx^4 + cx^3 + dx^2 + ex + f
把这六点代入,然后解这个六元一次方程组就好了
y=ax^5 + bx^4 + cx^3 + dx^2 + ex + f
把这六点代入,然后解这个六元一次方程组就好了
#3
采用贝塞尔曲线拟合
好象Windows有API
好象Windows有API
#4
如果已经得到了方程式,如何把这个方程式编程显示出来呢?
#5
如果不用得到具体的方程式的话,用PolyBezier函数吧,不过它需要4n-1个点,你是6个点的话,把第一个点同时算成第7个点好了.
#6
大虾,本人对数学理论所知甚少,希望给出导完的公式,因为六个点是随机的。编码如何实现???谢了
#7
这六个点在曲线上,不是控制点。
#8
5次方程组?有没有搞错。现在我还不知道谁会3次以上的公式呢。a^4-b^4,谁会?
#9
你已经把袋鼠忘光了吧?
#10
徐士良《C常用算法程序集》插值与拟和
#11
嘿嘿
我好像有这本书,回去查查看,有代码的话贴给你。
我觉得我上面那个思路是对的,六元一次方程组很容易解吧
至于画吗,找些点setpixel就成
我好像有这本书,回去查查看,有代码的话贴给你。
我觉得我上面那个思路是对的,六元一次方程组很容易解吧
至于画吗,找些点setpixel就成
#12
其实好象还有一种办法就是自己再插入几个点,用导数的方法解决!我以前就是这么写的!!
#13
其实好象还有一种办法就是自己再插入几个点,用导数的方法解决!我以前就是这么写的!!
#14
上铺的弟兄,后插入的几个点是如何算出来的??望告知
to adone(阿不)候君佳音
to adone(阿不)候君佳音
#15
上铺的弟兄,后插入的几个点是如何算出来的??望告知
to adone(阿不)候君佳音
to adone(阿不)候君佳音
#16
akima
#17
到开发中心,我以前贴过一个有源代码的
或者到我网站http://breath.onchina.net上去看,在VC专题中有算法的例子
或者到我网站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自带了贝塞尔曲线拟合.
最小二乘法误差很大, 况且你事先并不知道这些点就一定满足某个
有人在csdn上贴的最小二乘法曲线拟合算法有错,http://www.csdn.net/develop/read_article.asp?id=2369.
只是要光滑的话贝塞尔曲线拟合很好.
如果你用delphi这根本不是问题.Tchart自带了贝塞尔曲线拟合.
#24
建议找本《数值分析基础》的书读读,同济那本写的言简意赅,不难的
作者:同几大学计算数学教研室 黄自萍等,15。00元
作者:同几大学计算数学教研室 黄自萍等,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]);
}
#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
二次曲线生成