VB中mschart控件能画平滑线散点图吗

weixin_42083711 2019-05-11 11:42:30
现在有一些点,比如(0,4)、(1,1)、(2,0)、(3,1)、(4,4) ,二维散点图已经画出来了,但不是平滑曲线,想实现Excel中平滑线散点图那样,请问该如何写代码啊
...全文
175 5 打赏 收藏 举报
写回复
5 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
脆皮大雪糕 2019-05-12
http://www.vbgood.com/api-polybezier.html 有现成API
  • 打赏
  • 举报
回复
脆皮大雪糕 2019-05-12
有特殊的需求就不能用现成的MSChart了。 用贝塞尔曲线连接散点,具体的去百度吧,vb的代码肯定也搜得到。
  • 打赏
  • 举报
回复
milaoshu1020 2019-05-12
得知道f(x)才行;
f(0) = 4;
f(1) = 1;
f(2) = 0;
f(3) = 1;
f(4) = 4;
求这个函数;
  • 打赏
  • 举报
回复
weixin_42083711 2019-05-12
谢谢了,很有用
  • 打赏
  • 举报
回复
脆皮大雪糕 2019-05-12
好人做到底,空闲的时候写一段给你。 新建一个窗体, 放一个picturebox随便大小,代码是自适应的 放一个按钮 粘贴下面代码

Option Explicit

Private Type POINTAPI
        x As Long
        y As Long
End Type

Private Declare Function PolyBezier& Lib "gdi32" (ByVal hdc As Long, lppt As POINTAPI, ByVal cPoints As Long)

Private Sub Command1_Click()
    Dim hdc As Long
    Dim n As Long
    Dim i As Long
    Dim colP As New Collection
    Dim aryPoint() As POINTAPI
    '随机产生n个点,这里取n=8,生成Y坐标,X坐标按picture宽度平均
    For n = 1 To 8
        colP.Add Picture1.ScaleHeight * Rnd * 0.9
    Next
    Picture1.Cls
    
    
    Picture1.CurrentX = 0
    Picture1.CurrentY = Picture1.ScaleHeight - colP(1)
    
    '画根红色的折线图作为比较
    For i = 1 To colP.Count
        Picture1.Line -(Picture1.ScaleWidth / 7 * (i - 1), Picture1.ScaleHeight - colP(i)), vbRed
    Next
    
    '画贝塞尔曲线
    'API传入的点 为第一个点是起点,接下来三个一组,包括两个控件点和一个终点
    ReDim aryPoint((colP.Count - 1) * 3)
    
    '设置第一个点
    aryPoint(0).x = 0
    aryPoint(0).y = Picture1.ScaleHeight - colP(1)
    '设置后续点
    For i = 1 To colP.Count - 1

        '控制点 两个控制点的X坐标都是两个数据点的中间,Y坐标分别与数据点相同。这是我的方案哈,你也可以自己调整控制点
        aryPoint((i - 1) * 3 + 1).x = Picture1.ScaleWidth / 7 * (i - 0.5)
        aryPoint((i - 1) * 3 + 1).y = Picture1.ScaleHeight - colP(i)
        
        aryPoint((i - 1) * 3 + 2).x = Picture1.ScaleWidth / 7 * (i - 0.5)
        aryPoint((i - 1) * 3 + 2).y = Picture1.ScaleHeight - colP(i + 1)
        
        '数据点
        aryPoint((i - 1) * 3 + 3).x = Picture1.ScaleWidth / 7 * i
        aryPoint((i - 1) * 3 + 3).y = Picture1.ScaleHeight - colP(i + 1)

    Next
    '画线
    PolyBezier Picture1.hdc, aryPoint(0), UBound(aryPoint) + 1
End Sub

Private Sub Form_Load()
    Me.ScaleMode = 3
    Me.Picture1.ScaleMode = 3
End Sub

结果如下图,红色部分为数据折线图 黑色部分为平滑处理的贝塞尔曲线。
  • 打赏
  • 举报
回复
发帖
控件

1436

社区成员

VB 控件
社区管理员
  • 控件
加入社区
帖子事件
创建了帖子
2019-05-11 11:42
社区公告
暂无公告