[急求]给定几个散点连成一条平滑的曲线

时间:2022-11-02 03:48:36
用picturebox实现给定几个点,在坐标系中将这些点连成一条平滑的曲线,现在坐标系已经画好了,只是给出的这些点无法连成平滑的曲线:给定的点如下:(3,0.28),(5,1.22),(6,1.98),(7,2.85),(9,6.55),(11,20.45),(13,67.88)

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---第四个点的坐标
……

#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---第四个点的坐标
……

#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---第四个点的坐标
……

#6


学习了。贝塞尔曲线的绘制函数。
不过,楼主的问题该怎么解决?

MSChart控件倒是可以绘制平滑曲线。

#7


问题到底该怎么解决啊

#8


这个必须用插值的方法来解决了,如果要得到平滑的曲线,就必须采用二次以上的多项式进行插值。

最好是利用样条插值(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');

#11


http://files.codes-sources.com/fichier.aspx?id=18366&f=Splines.frm

这个链接里有个可以免费下载的VB做插值的例子,但好像是意大利人做的,注释不是很好懂。

#12


只有插值才能解决了,不过插值的算法与次数要把握一个度,不然会偏离原来的趋势

#13


直接采用逼近的算法就可以了。把两个点分成N个来进行计算。速度也很快。以前我就这么做的。曲线非常平滑

#14


虽然很感谢楼上各位,但是这些算法我根本是云里雾里。所说的差值算法我没学过,采用逼近点是不确定的,要看用户输入多少。非常希望能有人给段代码,如果太麻烦就算了,谢谢各位了!

#15


郁闷 听都听不懂

#16


这个就是你要的东西了,用法参考历程,非常简单
http://download.csdn.net/source/1256623

#17


引用 9 楼 laviewpbt 的回复:
我已闭关,不然很想回答这个问题。

很想知道你的答案!

#18


引用 17 楼 qiu5208 的回复:
引用 9 楼 laviewpbt 的回复:
我已闭关,不然很想回答这个问题。

很想知道你的答案!

我也是,不过在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点,不适合曲线拟合

#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---第四个点的坐标
……

#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---第四个点的坐标
……

#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---第四个点的坐标
……

#6


学习了。贝塞尔曲线的绘制函数。
不过,楼主的问题该怎么解决?

MSChart控件倒是可以绘制平滑曲线。

#7


问题到底该怎么解决啊

#8


这个必须用插值的方法来解决了,如果要得到平滑的曲线,就必须采用二次以上的多项式进行插值。

最好是利用样条插值(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');

#11


http://files.codes-sources.com/fichier.aspx?id=18366&f=Splines.frm

这个链接里有个可以免费下载的VB做插值的例子,但好像是意大利人做的,注释不是很好懂。

#12


只有插值才能解决了,不过插值的算法与次数要把握一个度,不然会偏离原来的趋势

#13


直接采用逼近的算法就可以了。把两个点分成N个来进行计算。速度也很快。以前我就这么做的。曲线非常平滑

#14


虽然很感谢楼上各位,但是这些算法我根本是云里雾里。所说的差值算法我没学过,采用逼近点是不确定的,要看用户输入多少。非常希望能有人给段代码,如果太麻烦就算了,谢谢各位了!

#15


郁闷 听都听不懂

#16


这个就是你要的东西了,用法参考历程,非常简单
http://download.csdn.net/source/1256623

#17


引用 9 楼 laviewpbt 的回复:
我已闭关,不然很想回答这个问题。

很想知道你的答案!

#18


引用 17 楼 qiu5208 的回复:
引用 9 楼 laviewpbt 的回复:
我已闭关,不然很想回答这个问题。

很想知道你的答案!

我也是,不过在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