19 个解决方案
#1
可以用贝塞尔函数,示例:
Private Declare Function PolyBezier Lib "gdi32" (ByVal hdc As Long, lppt As POINTAPI, ByVal cPoints As Long) As Long
Private Type POINTAPI
X As Long
Y As Long
End Type
Private Sub Command3_Click()
Dim p(3) As POINTAPI
p(0).X = 20: p(0).Y = 20
p(1).X = 50: p(1).Y = 40
p(2).X = 90: p(2).Y = 80
p(3).X = 120: p(3).Y = 120
PolyBezier Picture1.hdc, p(0), 4
End Sub
#2
你能再说的详细点么,我的那些点怎么对应你的这个函数。
#3
PolyBezier-----API函数;
POINTAPI----一种固定结构
PolyBezier与POINTAPI都可以来自API浏览器;POINTAPI代表一个点;
Dim p(3) As POINTAPI-----四个点的数组;
p(0).X = 20: p(0).Y = 20-----第1个点的坐标
……
p(3).X = 120: p(3).Y = 120---第四个点的坐标
……
POINTAPI----一种固定结构
PolyBezier与POINTAPI都可以来自API浏览器;POINTAPI代表一个点;
Dim p(3) As POINTAPI-----四个点的数组;
p(0).X = 20: p(0).Y = 20-----第1个点的坐标
……
p(3).X = 120: p(3).Y = 120---第四个点的坐标
……
#4
PolyBezier-----API函数;
POINTAPI----一种固定结构
PolyBezier与POINTAPI都可以来自API浏览器;POINTAPI代表一个点;
Dim p(3) As POINTAPI-----四个点的数组;
p(0).X = 20: p(0).Y = 20-----第1个点的坐标
……
p(3).X = 120: p(3).Y = 120---第四个点的坐标
……
POINTAPI----一种固定结构
PolyBezier与POINTAPI都可以来自API浏览器;POINTAPI代表一个点;
Dim p(3) As POINTAPI-----四个点的数组;
p(0).X = 20: p(0).Y = 20-----第1个点的坐标
……
p(3).X = 120: p(3).Y = 120---第四个点的坐标
……
#5
PolyBezier-----API函数;
POINTAPI----一种固定结构
PolyBezier与POINTAPI都可以来自API浏览器;POINTAPI代表一个点;
Dim p(3) As POINTAPI-----四个点的数组;
p(0).X = 20: p(0).Y = 20-----第1个点的坐标
……
p(3).X = 120: p(3).Y = 120---第四个点的坐标
……
POINTAPI----一种固定结构
PolyBezier与POINTAPI都可以来自API浏览器;POINTAPI代表一个点;
Dim p(3) As POINTAPI-----四个点的数组;
p(0).X = 20: p(0).Y = 20-----第1个点的坐标
……
p(3).X = 120: p(3).Y = 120---第四个点的坐标
……
#6
学习了。贝塞尔曲线的绘制函数。
不过,楼主的问题该怎么解决?
MSChart控件倒是可以绘制平滑曲线。
不过,楼主的问题该怎么解决?
MSChart控件倒是可以绘制平滑曲线。
#7
问题到底该怎么解决啊
#8
这个必须用插值的方法来解决了,如果要得到平滑的曲线,就必须采用二次以上的多项式进行插值。
最好是利用样条插值(Spline)。如果楼主能用MATLAB,里面有工具可以帮楼主实现这些功能。
好像是在命令提示符后面输入cftool,因为是一维插值,命令可以用interp1,
在MATLAB下看看帮助文件,应该很容易搞定。
我推荐的方法就是,在matlab里面完成插值,然后再把数据导出来就可以了。
最好是利用样条插值(Spline)。如果楼主能用MATLAB,里面有工具可以帮楼主实现这些功能。
好像是在命令提示符后面输入cftool,因为是一维插值,命令可以用interp1,
在MATLAB下看看帮助文件,应该很容易搞定。
我推荐的方法就是,在matlab里面完成插值,然后再把数据导出来就可以了。
#9
我已闭关,不然很想回答这个问题。
#10
>>t=[3 5 6 7 9 11 13];
>>x=[0.28 1.22 1.98 2.85 6.55 20.45 67.88];
>>ti=3:0.25:13;
>>y=interp1(t,x,ti,spline);
>> plot(t,x); hold on;
>> plot(ti,y,'r');
>>x=[0.28 1.22 1.98 2.85 6.55 20.45 67.88];
>>ti=3:0.25:13;
>>y=interp1(t,x,ti,spline);
>> plot(t,x); hold on;
>> plot(ti,y,'r');
#11
http://files.codes-sources.com/fichier.aspx?id=18366&f=Splines.frm
这个链接里有个可以免费下载的VB做插值的例子,但好像是意大利人做的,注释不是很好懂。
这个链接里有个可以免费下载的VB做插值的例子,但好像是意大利人做的,注释不是很好懂。
#12
只有插值才能解决了,不过插值的算法与次数要把握一个度,不然会偏离原来的趋势
#13
直接采用逼近的算法就可以了。把两个点分成N个来进行计算。速度也很快。以前我就这么做的。曲线非常平滑
#14
虽然很感谢楼上各位,但是这些算法我根本是云里雾里。所说的差值算法我没学过,采用逼近点是不确定的,要看用户输入多少。非常希望能有人给段代码,如果太麻烦就算了,谢谢各位了!
#15
郁闷 听都听不懂
#16
这个就是你要的东西了,用法参考历程,非常简单
http://download.csdn.net/source/1256623
http://download.csdn.net/source/1256623
#17
很想知道你的答案!
#18
我也是,不过在picturebox里用PolyBezier hdc, BPoints(0), PointCount这个函数怎么不画线呢,
前面画点从数据库里取出的点
BPoints(PointNum).x = rst.fields(0)
BPoints(PointNum).y = rst.fields(1)
DrawWidth = 3
PSet (x, y)
#19
贝塞尔函数,只能取3*n+1点,不适合曲线拟合
#20
#1
可以用贝塞尔函数,示例:
Private Declare Function PolyBezier Lib "gdi32" (ByVal hdc As Long, lppt As POINTAPI, ByVal cPoints As Long) As Long
Private Type POINTAPI
X As Long
Y As Long
End Type
Private Sub Command3_Click()
Dim p(3) As POINTAPI
p(0).X = 20: p(0).Y = 20
p(1).X = 50: p(1).Y = 40
p(2).X = 90: p(2).Y = 80
p(3).X = 120: p(3).Y = 120
PolyBezier Picture1.hdc, p(0), 4
End Sub
#2
你能再说的详细点么,我的那些点怎么对应你的这个函数。
#3
PolyBezier-----API函数;
POINTAPI----一种固定结构
PolyBezier与POINTAPI都可以来自API浏览器;POINTAPI代表一个点;
Dim p(3) As POINTAPI-----四个点的数组;
p(0).X = 20: p(0).Y = 20-----第1个点的坐标
……
p(3).X = 120: p(3).Y = 120---第四个点的坐标
……
POINTAPI----一种固定结构
PolyBezier与POINTAPI都可以来自API浏览器;POINTAPI代表一个点;
Dim p(3) As POINTAPI-----四个点的数组;
p(0).X = 20: p(0).Y = 20-----第1个点的坐标
……
p(3).X = 120: p(3).Y = 120---第四个点的坐标
……
#4
PolyBezier-----API函数;
POINTAPI----一种固定结构
PolyBezier与POINTAPI都可以来自API浏览器;POINTAPI代表一个点;
Dim p(3) As POINTAPI-----四个点的数组;
p(0).X = 20: p(0).Y = 20-----第1个点的坐标
……
p(3).X = 120: p(3).Y = 120---第四个点的坐标
……
POINTAPI----一种固定结构
PolyBezier与POINTAPI都可以来自API浏览器;POINTAPI代表一个点;
Dim p(3) As POINTAPI-----四个点的数组;
p(0).X = 20: p(0).Y = 20-----第1个点的坐标
……
p(3).X = 120: p(3).Y = 120---第四个点的坐标
……
#5
PolyBezier-----API函数;
POINTAPI----一种固定结构
PolyBezier与POINTAPI都可以来自API浏览器;POINTAPI代表一个点;
Dim p(3) As POINTAPI-----四个点的数组;
p(0).X = 20: p(0).Y = 20-----第1个点的坐标
……
p(3).X = 120: p(3).Y = 120---第四个点的坐标
……
POINTAPI----一种固定结构
PolyBezier与POINTAPI都可以来自API浏览器;POINTAPI代表一个点;
Dim p(3) As POINTAPI-----四个点的数组;
p(0).X = 20: p(0).Y = 20-----第1个点的坐标
……
p(3).X = 120: p(3).Y = 120---第四个点的坐标
……
#6
学习了。贝塞尔曲线的绘制函数。
不过,楼主的问题该怎么解决?
MSChart控件倒是可以绘制平滑曲线。
不过,楼主的问题该怎么解决?
MSChart控件倒是可以绘制平滑曲线。
#7
问题到底该怎么解决啊
#8
这个必须用插值的方法来解决了,如果要得到平滑的曲线,就必须采用二次以上的多项式进行插值。
最好是利用样条插值(Spline)。如果楼主能用MATLAB,里面有工具可以帮楼主实现这些功能。
好像是在命令提示符后面输入cftool,因为是一维插值,命令可以用interp1,
在MATLAB下看看帮助文件,应该很容易搞定。
我推荐的方法就是,在matlab里面完成插值,然后再把数据导出来就可以了。
最好是利用样条插值(Spline)。如果楼主能用MATLAB,里面有工具可以帮楼主实现这些功能。
好像是在命令提示符后面输入cftool,因为是一维插值,命令可以用interp1,
在MATLAB下看看帮助文件,应该很容易搞定。
我推荐的方法就是,在matlab里面完成插值,然后再把数据导出来就可以了。
#9
我已闭关,不然很想回答这个问题。
#10
>>t=[3 5 6 7 9 11 13];
>>x=[0.28 1.22 1.98 2.85 6.55 20.45 67.88];
>>ti=3:0.25:13;
>>y=interp1(t,x,ti,spline);
>> plot(t,x); hold on;
>> plot(ti,y,'r');
>>x=[0.28 1.22 1.98 2.85 6.55 20.45 67.88];
>>ti=3:0.25:13;
>>y=interp1(t,x,ti,spline);
>> plot(t,x); hold on;
>> plot(ti,y,'r');
#11
http://files.codes-sources.com/fichier.aspx?id=18366&f=Splines.frm
这个链接里有个可以免费下载的VB做插值的例子,但好像是意大利人做的,注释不是很好懂。
这个链接里有个可以免费下载的VB做插值的例子,但好像是意大利人做的,注释不是很好懂。
#12
只有插值才能解决了,不过插值的算法与次数要把握一个度,不然会偏离原来的趋势
#13
直接采用逼近的算法就可以了。把两个点分成N个来进行计算。速度也很快。以前我就这么做的。曲线非常平滑
#14
虽然很感谢楼上各位,但是这些算法我根本是云里雾里。所说的差值算法我没学过,采用逼近点是不确定的,要看用户输入多少。非常希望能有人给段代码,如果太麻烦就算了,谢谢各位了!
#15
郁闷 听都听不懂
#16
这个就是你要的东西了,用法参考历程,非常简单
http://download.csdn.net/source/1256623
http://download.csdn.net/source/1256623
#17
很想知道你的答案!
#18
我也是,不过在picturebox里用PolyBezier hdc, BPoints(0), PointCount这个函数怎么不画线呢,
前面画点从数据库里取出的点
BPoints(PointNum).x = rst.fields(0)
BPoints(PointNum).y = rst.fields(1)
DrawWidth = 3
PSet (x, y)
#19
贝塞尔函数,只能取3*n+1点,不适合曲线拟合