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

cherish_55 2009-07-20 02:53:11
用picturebox实现给定几个点,在坐标系中将这些点连成一条平滑的曲线,现在坐标系已经画好了,只是给出的这些点无法连成平滑的曲线:给定的点如下:(3,0.28),(5,1.22),(6,1.98),(7,2.85),(9,6.55),(11,20.45),(13,67.88)
...全文
980 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
qiu5208 2009-07-27
  • 打赏
  • 举报
回复
贝塞尔函数,只能取3*n+1点,不适合曲线拟合
qiu5208 2009-07-24
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 laviewpbt 的回复:]
我已闭关,不然很想回答这个问题。
[/Quote]
很想知道你的答案!
cherish_55 2009-07-24
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 qiu5208 的回复:]
引用 9 楼 laviewpbt 的回复:
我已闭关,不然很想回答这个问题。

很想知道你的答案!
[/Quote]
我也是,不过在picturebox里用PolyBezier hdc, BPoints(0), PointCount这个函数怎么不画线呢,
前面画点从数据库里取出的点
BPoints(PointNum).x = rst.fields(0)
BPoints(PointNum).y = rst.fields(1)
DrawWidth = 3
PSet (x, y)
e4snake 2009-07-21
  • 打赏
  • 举报
回复
直接采用逼近的算法就可以了。把两个点分成N个来进行计算。速度也很快。以前我就这么做的。曲线非常平滑
samtyty 2009-07-21
  • 打赏
  • 举报
回复
只有插值才能解决了,不过插值的算法与次数要把握一个度,不然会偏离原来的趋势
eruditezhang 2009-07-21
  • 打赏
  • 举报
回复
http://files.codes-sources.com/fichier.aspx?id=18366&f=Splines.frm

这个链接里有个可以免费下载的VB做插值的例子,但好像是意大利人做的,注释不是很好懂。
eruditezhang 2009-07-21
  • 打赏
  • 举报
回复
>>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');
laviewpbt 2009-07-21
  • 打赏
  • 举报
回复
我已闭关,不然很想回答这个问题。
eruditezhang 2009-07-21
  • 打赏
  • 举报
回复
这个必须用插值的方法来解决了,如果要得到平滑的曲线,就必须采用二次以上的多项式进行插值。

最好是利用样条插值(Spline)。如果楼主能用MATLAB,里面有工具可以帮楼主实现这些功能。

好像是在命令提示符后面输入cftool,因为是一维插值,命令可以用interp1,

在MATLAB下看看帮助文件,应该很容易搞定。

我推荐的方法就是,在matlab里面完成插值,然后再把数据导出来就可以了。
cherish_55 2009-07-21
  • 打赏
  • 举报
回复
问题到底该怎么解决啊
熊孩子开学喽 2009-07-21
  • 打赏
  • 举报
回复
这个就是你要的东西了,用法参考历程,非常简单
http://download.csdn.net/source/1256623
xredhat 2009-07-21
  • 打赏
  • 举报
回复
郁闷 听都听不懂
cherish_55 2009-07-21
  • 打赏
  • 举报
回复
虽然很感谢楼上各位,但是这些算法我根本是云里雾里。所说的差值算法我没学过,采用逼近点是不确定的,要看用户输入多少。非常希望能有人给段代码,如果太麻烦就算了,谢谢各位了!
贝隆 2009-07-20
  • 打赏
  • 举报
回复
学习了。贝塞尔曲线的绘制函数。
不过,楼主的问题该怎么解决?

MSChart控件倒是可以绘制平滑曲线。
SYSSZ 2009-07-20
  • 打赏
  • 举报
回复
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---第四个点的坐标
……
SYSSZ 2009-07-20
  • 打赏
  • 举报
回复
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---第四个点的坐标
……
SYSSZ 2009-07-20
  • 打赏
  • 举报
回复
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---第四个点的坐标
……
cherish_55 2009-07-20
  • 打赏
  • 举报
回复
你能再说的详细点么,我的那些点怎么对应你的这个函数。
VBToy 2009-07-20
  • 打赏
  • 举报
回复
可以用贝塞尔函数,示例:
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

7,789

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧