VB6.0 用MSchart作动态曲线显示时总是多了一条过原点的直线,请问是什么原因?
本来是个正弦函数不断往前走的曲线,结果最前面的那个点和原点间一直有一条直线。程序如下:Dimi,x_max,y_maxAsInteger'坐标最大值限定值DimMyDat...
本来是个正弦函数不断往前走的曲线,结果最前面的那个点和原点间一直有一条直线。
程序如下:
Dim i, x_max, y_max As Integer ' 坐标最大值限定值Dim MyData_x(5000), MyData_y(5000), MyData(5000, 1) As Integer
Private Sub Command1_Click() ' 通过增加最大值1倍缩小曲线 x方向 x方向If x_max >= 10000 Then x_max = 10000x_max = x_max * 2End SubPrivate Sub Command2_Click() ' 通过减小最大值一半放大曲线 x方向x_max = Int(x_max / 2)End Sub
Private Sub Command3_Click() ' 通过增加1倍最大值限定值缩小曲线 y方向If y_max >= 10000 Then y_max = 10000y_max = y_max * 2End SubPrivate Sub Command4_Click() ' 通过减小一半最大值放大曲线 y方向y_max = Int(y_max / 2)End SubPrivate Sub Command5_Click() ' 通过增加1倍最大值限定值缩小曲线If x_max >= 10000 Then x_max = 10000If y_max >= 10000 Then y_max = 10000x_max = x_max * 2y_max = y_max * 2End SubPrivate Sub Command6_Click() '通过减小一半最大值放大曲线x_max = x_max / 2y_max = y_max / 2End SubPrivate Sub Form_Load()x_max = 10000y_max = 10000Timer1.Interval = 1000 '更新数据用Timer2.Interval = 100 '调整曲线显示大小用With MSChart1.TitleText = "测试"'设置图线的外观.Plot.SeriesCollection(1).Pen.Width = 3 '线宽
'设置XY轴.Plot.Axis(VtChAxisIdX).ValueScale.Auto = False.Plot.Axis(VtChAxisIdY).ValueScale.Auto = False
.Plot.Axis(VtChAxisIdY).ValueScale.Minimum = 0.Plot.Axis(VtChAxisIdX).ValueScale.Minimum = 0'//.Plot.Axis(VtChAxisIdX).ValueScale.MajorDivision = 10 'X轴主要网格数量.Plot.Axis(VtChAxisIdY).ValueScale.MajorDivision = 10 'Y轴主要网格数量.Plot.Axis(VtChAxisIdX).ValueScale.MinorDivision = 2 'X轴次要网格数量.Plot.Axis(VtChAxisIdY).ValueScale.MinorDivision = 2 'Y轴次要网格数量.Plot.Axis(VtChAxisIdX).AxisGrid.MajorPen.Style = VtPenStyleDotted.Plot.Axis(VtChAxisIdY).AxisGrid.MajorPen.Style = VtPenStyleDottedMSChart1.Plot.AutoLayout = FalseMSChart1.Plot.UniformAxis = FalseMSChart1.chartType = VtChChartType2dXY '设置图形为二维散点图End WithEnd Sub
Private Sub Timer1_Timer()MyData_x(i) = i '时间作为x轴MyData_y(i) = 500 * Sin(i / 10) + 1000 '时间的正弦函数值MyData(i, 0) = MyData_x(i) 'x轴数据,时间MyData(i, 1) = MyData_y(i) 'y轴数据,函数值
If x_max >= 10000 Then x_max = 10000If y_max >= 10000 Then y_max = 10000If MyData(i, 0) >= x_max Then x_max = x_max * 2If MyData(i, 1) >= y_max Then y_max = y_max * 2'防止数据溢出
MSChart1.ChartData = MyData '数据获取i = i + 1End Sub
Private Sub Timer2_Timer()With MSChart1.Plot.Axis(VtChAxisIdX).ValueScale.Maximum = x_max '设置横轴标注最大值.Plot.Axis(VtChAxisIdY).ValueScale.Maximum = y_max '设置纵轴标注最大值End WithEnd Sub 展开
程序如下:
Dim i, x_max, y_max As Integer ' 坐标最大值限定值Dim MyData_x(5000), MyData_y(5000), MyData(5000, 1) As Integer
Private Sub Command1_Click() ' 通过增加最大值1倍缩小曲线 x方向 x方向If x_max >= 10000 Then x_max = 10000x_max = x_max * 2End SubPrivate Sub Command2_Click() ' 通过减小最大值一半放大曲线 x方向x_max = Int(x_max / 2)End Sub
Private Sub Command3_Click() ' 通过增加1倍最大值限定值缩小曲线 y方向If y_max >= 10000 Then y_max = 10000y_max = y_max * 2End SubPrivate Sub Command4_Click() ' 通过减小一半最大值放大曲线 y方向y_max = Int(y_max / 2)End SubPrivate Sub Command5_Click() ' 通过增加1倍最大值限定值缩小曲线If x_max >= 10000 Then x_max = 10000If y_max >= 10000 Then y_max = 10000x_max = x_max * 2y_max = y_max * 2End SubPrivate Sub Command6_Click() '通过减小一半最大值放大曲线x_max = x_max / 2y_max = y_max / 2End SubPrivate Sub Form_Load()x_max = 10000y_max = 10000Timer1.Interval = 1000 '更新数据用Timer2.Interval = 100 '调整曲线显示大小用With MSChart1.TitleText = "测试"'设置图线的外观.Plot.SeriesCollection(1).Pen.Width = 3 '线宽
'设置XY轴.Plot.Axis(VtChAxisIdX).ValueScale.Auto = False.Plot.Axis(VtChAxisIdY).ValueScale.Auto = False
.Plot.Axis(VtChAxisIdY).ValueScale.Minimum = 0.Plot.Axis(VtChAxisIdX).ValueScale.Minimum = 0'//.Plot.Axis(VtChAxisIdX).ValueScale.MajorDivision = 10 'X轴主要网格数量.Plot.Axis(VtChAxisIdY).ValueScale.MajorDivision = 10 'Y轴主要网格数量.Plot.Axis(VtChAxisIdX).ValueScale.MinorDivision = 2 'X轴次要网格数量.Plot.Axis(VtChAxisIdY).ValueScale.MinorDivision = 2 'Y轴次要网格数量.Plot.Axis(VtChAxisIdX).AxisGrid.MajorPen.Style = VtPenStyleDotted.Plot.Axis(VtChAxisIdY).AxisGrid.MajorPen.Style = VtPenStyleDottedMSChart1.Plot.AutoLayout = FalseMSChart1.Plot.UniformAxis = FalseMSChart1.chartType = VtChChartType2dXY '设置图形为二维散点图End WithEnd Sub
Private Sub Timer1_Timer()MyData_x(i) = i '时间作为x轴MyData_y(i) = 500 * Sin(i / 10) + 1000 '时间的正弦函数值MyData(i, 0) = MyData_x(i) 'x轴数据,时间MyData(i, 1) = MyData_y(i) 'y轴数据,函数值
If x_max >= 10000 Then x_max = 10000If y_max >= 10000 Then y_max = 10000If MyData(i, 0) >= x_max Then x_max = x_max * 2If MyData(i, 1) >= y_max Then y_max = y_max * 2'防止数据溢出
MSChart1.ChartData = MyData '数据获取i = i + 1End Sub
Private Sub Timer2_Timer()With MSChart1.Plot.Axis(VtChAxisIdX).ValueScale.Maximum = x_max '设置横轴标注最大值.Plot.Axis(VtChAxisIdY).ValueScale.Maximum = y_max '设置纵轴标注最大值End WithEnd Sub 展开
1个回答
展开全部
这个问题比较复杂。我研究了2小时(老实说,我在此之间还没有使用过MSChart控件),现在答复如下:
问题根源在于下面这一句:
MSChart1.ChartData = MyData '数据获取
这里把二维数组MyData赋给MSChart1.ChartData,而数组MyData是一个固定大小(0~5000,0~1)的数组,在Timer1中,这个数组的前面部分(第一个下标为0~i,0~1)被赋予了值:
MyData(i, 0) = MyData_x(i) 'x轴数据,时间
MyData(i, 1) = MyData_y(i) 'y轴数据,函数值
而后面部分(第一个下标为i+1~5000,0~1)未被赋值,故仍为0,也就是说,后面的点实际上就是原点,这就是导致所画线条总是与坐标原点相连的原因。
那么怎么改进呢?在执行下句:
MSChart1.ChartData = MyData
之前, MyData里的数据只能包含前面0~i个点的数据,而不能是所有5000个点!这就要用到动态数组。但如果直接把MyData定义为二维动态数组,而它的第一维是可变的,但第二维是不变的,不能使用Preserve保留字保存已有数据(只有最后一维是可变时才可使用Preserve保留字)!
把两个下标交换位置,不行!不符合MSChart1.ChartData 对数据的要求!
只好另外定义一个二维动态数组MyData2,在Timer1_Timer事件中动态定义,并把MyData中的前面的数据复制到MyData2中,再把MyData2赋给MSChart1.ChartData 。
操作如下:
(1)在窗体的通用段中增加如下定义:
Dim MyData2() As Integer
(2)略加修改Timer1_Timer事件代码如下:
Private Sub Timer1_Timer()
Dim m
ReDim MyData2(i, 1)
MyData_x(i) = i '时间作为x轴
MyData_y(i) = 500 * Sin(i / 10) + 1000 '时间的正弦函数值
MyData(i, 0) = MyData_x(i) 'x轴数据,时间
MyData(i, 1) = MyData_y(i) 'y轴数据,函数值
If x_max >= 10000 Then x_max = 10000
If y_max >= 10000 Then y_max = 10000
If MyData(i, 0) >= x_max Then x_max = x_max * 2 '防止数据溢出
If MyData(i, 1) >= y_max Then y_max = y_max * 2
For m = 0 To i
MyData2(m, 0) = MyData(m, 0)
MyData2(m, 1) = MyData(m, 1)
Next
MSChart1.ChartData = MyData2 '数据获取
i = i + 1
End Sub
其他代码均不变。运行程序,大功告成!
问题根源在于下面这一句:
MSChart1.ChartData = MyData '数据获取
这里把二维数组MyData赋给MSChart1.ChartData,而数组MyData是一个固定大小(0~5000,0~1)的数组,在Timer1中,这个数组的前面部分(第一个下标为0~i,0~1)被赋予了值:
MyData(i, 0) = MyData_x(i) 'x轴数据,时间
MyData(i, 1) = MyData_y(i) 'y轴数据,函数值
而后面部分(第一个下标为i+1~5000,0~1)未被赋值,故仍为0,也就是说,后面的点实际上就是原点,这就是导致所画线条总是与坐标原点相连的原因。
那么怎么改进呢?在执行下句:
MSChart1.ChartData = MyData
之前, MyData里的数据只能包含前面0~i个点的数据,而不能是所有5000个点!这就要用到动态数组。但如果直接把MyData定义为二维动态数组,而它的第一维是可变的,但第二维是不变的,不能使用Preserve保留字保存已有数据(只有最后一维是可变时才可使用Preserve保留字)!
把两个下标交换位置,不行!不符合MSChart1.ChartData 对数据的要求!
只好另外定义一个二维动态数组MyData2,在Timer1_Timer事件中动态定义,并把MyData中的前面的数据复制到MyData2中,再把MyData2赋给MSChart1.ChartData 。
操作如下:
(1)在窗体的通用段中增加如下定义:
Dim MyData2() As Integer
(2)略加修改Timer1_Timer事件代码如下:
Private Sub Timer1_Timer()
Dim m
ReDim MyData2(i, 1)
MyData_x(i) = i '时间作为x轴
MyData_y(i) = 500 * Sin(i / 10) + 1000 '时间的正弦函数值
MyData(i, 0) = MyData_x(i) 'x轴数据,时间
MyData(i, 1) = MyData_y(i) 'y轴数据,函数值
If x_max >= 10000 Then x_max = 10000
If y_max >= 10000 Then y_max = 10000
If MyData(i, 0) >= x_max Then x_max = x_max * 2 '防止数据溢出
If MyData(i, 1) >= y_max Then y_max = y_max * 2
For m = 0 To i
MyData2(m, 0) = MyData(m, 0)
MyData2(m, 1) = MyData(m, 1)
Next
MSChart1.ChartData = MyData2 '数据获取
i = i + 1
End Sub
其他代码均不变。运行程序,大功告成!
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询