| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3004 人关注过本帖
标题:请教:曲线图局部放大
只看楼主 加入收藏
sagittast83
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2007-9-9
收藏
 问题点数:0 回复次数:9 
请教:曲线图局部放大
各位高手:
    我在做一个数据分析的题目,对已有的曲线图,通过鼠标电击拖动,选中矩形框选局部放大曲线图.这种情况如何实现?
    期待高人指点指点,谢谢!
搜索更多相关主题的帖子: 曲线图 局部 
2008-01-06 17:11
dawn4640576
Rank: 1
等 级:新手上路
帖 子:1079
专家分:0
注 册:2007-9-19
收藏
得分:0 
对图片框中的有效区域进行放大,放大的过程应该包括:
  1.MouseDown
  2.MouseMove
  3.MouseUP   
  4.图形的重画
  具体的操作过程如下:
  在图片框控件中你想放大的区域起始位置按下鼠标的左键:
  按住鼠标的左键不放,在图片框上沿水平的方向拖动鼠标,直到你要放大区域的结束位置,
  然后松开鼠标的左键。

放大过程的程序代码:
(1)MouseDown:要放大图形,首先要按下鼠标的左键来确定放大区域的起始点,这个动作的鼠标事件就是MouseDown.
Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
      Picture1.CurrentX = X
      Picture1.CurrentY = Y
      firstpx = Picture1.CurrentX
      firstpy = Picture1.CurrentY
      Picture1.PSet (Picture1.CurrentX, Picture1.CurrentX), QBColor(9)
End Sub
在这个程序中,要做的是,记录下由左键按下的所确定的点的坐标.所以用CurrentX,Currenty函数来记录这个点的坐标,然后将这个坐标存入firstpx,firstpy这两个参数中,然后画—个点作为标记。

(2)下一个动作是拖动鼠标选中要放大的信号区域。反应这个动作的事件是MouseMove.
Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
     nowx = X
     nowy = Y
End Sub
  在MouseMove这个事件中,随着鼠标的不断移动,VB也不断地把鼠标的新坐标放入X,Y这两个参数中去。我们为了要保证记录下最新的民林坐标,就需要不断地将X,Y的值传递给变量nowx,nowy.

(3)紧接着的动作是MouseUp.当松开鼠标的左链时,我们要确定放大区域的终止坐标,同时还要调用绘图的子程序来重新绘制放大区域的图形。
    Private Sub Picture1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Picture1.DrawStyle = 2
    Picture1.Line (firstpx, firstpy)-(firstpx, nowy), QBColor(2)
    Picture1.Line (firstpx, nowy)-(nowx, nowy)
    Picture1.Line (nowx, nowy)-(nowx, firstpy)
    Picture1.Line (nowx, firstpy)-(firstpx, firstpy)
    widthindots = Picture1.Width
    a% = setzoomscale((firstpx), (nowx), widthindots)
    Call axisnumberz
    Picture1.MousePointer = 2
    For i = Int(firstpx) To Int(nowx)
        xpoint = i
        ypoint = Filedata(i)
        If xpoint = Int(First) Then
            xold = xpoint
            yold = ypoint
        End If
     Picture1.Line (xpoint, ypoint)-(xold, yold), QBColor(10)
     xold = xpoint
     yold = ypoint
     Next
     Call gridon
End Sub
    前四行Picture1.line的语句实际上是做了一个短形框,用米显示被选中的
放大区域.下面的循环语句是用来在图片框中重新绘制放大区域的图形。所有的图形数据都在Filedata()这个数组中,只要不停地调用就可以了。
    在for语句中,看到的Int(nowx)和Int(firstpx)这两个函数。这是两个求整的函数。因为nowx和firstpx是鼠标的坐标,它的值是实数型的,然而在图形中的每一个信号对应在x轴上的值都是整型的,所以,要利用Int()函数将位坐标的值变为整型,然后用循环来不停地读入X轴的坐标.
Setzoomscale()子函数的程序如下:
Pvivate Function setzoomscale(xstart as double,xend as double,hsteps as integer)
Xincrement = (xend - xstart) / hsteps
Datalen = len(test)
Dataidnum = FreeFile

Ymin = 0 ‘判断图形中的最大最小
Ymax = ymin
For I = int(xstart) to int(xend)
        Ynew = filedata(i)
        If jmin > ynew then ymin = ynew
        If ymax < ynew then ymax = ynew
Next I
Picture1.scale(xstart -5,ymax +(ymax - ymin)/10)-(xend + 5,ymin – (ymax - ymin)/10)
End Function
这段函数是对选中的图形放大区地行图形的比例调整,经过对图形中信号的逐一比较.得出其中得最大和最小值.然后根据这两个值来确定图片框控件的长宽和比例值。
下面,再来看axisnumberz()的程序代码,这段程序主要是给放大后的图形的X,Y方向加上放大后的数轴.
Private Sub axinumberz()
   Xnuminc = Picture1.ScaleWidth/(htics-1)
   Ynuminc = Picture1.ScaleHeight/(vtics-1)
   Xnum1 = Picture1.ScaleLeft
   Ynum1 = picture1.ScaleTop
   Gridspacex = Picture1.Width/(htics-1)
   Gridspacey = Picture1.Height/(vtics-1)
   For ix = 0 to htics -1
      Number$ = format$(xnum1+ ix*xnuminc +Str$(fpx),”0”)
      X1 = Picture1.left + ix*gridspqcex- 0.5*TextWidth(Number$)
      Y1 = Picture1.Height + Picture1.Top + 0.5*TextHeight(“0”)
      Form1.Currentx = x1
      Form1.Currenty = y1
      Form1.Print Number$
   Next ix
   For iy = 0 to vtics -1
      Number$ = format$(xnum1+ iy*ynuminc +Str$(fpx),”0.00”)
      X1 = Picture1.left - TextWidth(Number$) – TextWidth(“.”)
      Y1 = Picture1.Top+ iy * gridspacey - 0.5*TextHeight(“0.00”)
      Form1.Currentx = x1
      Form1.Currenty = y1
      Form1.Print Number$
   Next iy
End sub
    要在划分出的网格处给图形标上对应的数字。Htics和Vtics是你选择的划分的格数,Number$将对应的网格处的坐标变成字符串.x1求出了对应Number$处的坐标,然后又加上了半个字符串的长度,使Number$显示在对应网格的中间。
如果对已经放大的图形还不够满意的话,可以审重复多次的放大图形,直到满意为止.

[[italic] 本帖最后由 dawn4640576 于 2008-1-7 10:00 编辑 [/italic]]

我看青山多妩媚料青山看我应如是
2008-01-07 09:48
sagittast83
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2007-9-9
收藏
得分:0 
谢谢啊!万分感激!
2008-01-07 17:01
sagittast83
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2007-9-9
收藏
得分:0 
dawn4640576,你好!
昨天看了你给我的程序,还有点不明白.
moveup最后的Call gridon是什么意思啊? 画网格?
还有setzoomscale函数中的
Datalen = len(test)
Dataidnum = FreeFile 是什么意思啊?

谢谢!
2008-01-08 11:31
dawn4640576
Rank: 1
等 级:新手上路
帖 子:1079
专家分:0
注 册:2007-9-19
收藏
得分:0 
去掉就行了,你用不到.

我看青山多妩媚料青山看我应如是
2008-01-08 13:00
sagittast83
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2007-9-9
收藏
得分:0 
dawn4640576,你好!
还是不太懂是怎么重绘放大的图形啊???
我原来函数曲线是通过调用自定义的函数语句画的
选好放大的框框后,画出的图形不是要放大的图形,而是重新画了张新图.

期待你的解答,谢谢!
2008-01-13 14:07
sagittast83
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2007-9-9
收藏
得分:0 
已经搞定!
2008-01-18 14:54
zylzengyulin
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2008-2-24
收藏
得分:0 
请问两位,在运行中有没有遇到这样的问题
a% = setzoomscale((firstpx), (nowx), widthindots)出现错误,显示ByRef argument type mismatch,光标在widthindots停住。因为我是新手,不懂为什么,请帮帮忙看看是哪儿出现问题了可以吗?
还有就是选中矩形框后,是如何重画选中部分的?
谢谢了!
2008-02-25 10:19
尐妖
Rank: 2
来 自:广东省
等 级:新手上路
威 望:3
帖 子:120
专家分:0
注 册:2008-2-16
收藏
得分:0 
2楼讲得很详细啦.

倣棄?.﹎徻sんì嬄種繲脫嗎╃┈
2008-02-27 14:38
快速回复:请教:曲线图局部放大
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012275 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved