给定某一函数,如y=kcos(x)+1,请问应该如何在界面上绘制出连续的函数图形曲线?谢谢

解决方案 »

  1.   

    能否详细一些
    例如给出y=sin(x)的代码阿,我好学习学习,谢谢
      

  2.   

    用PSet画点
    以前有人贴过的例子,厚颜代为展示Const pi = 3.14159Dim a As SinglePrivate Sub Command1_Click()
        
        Picture1.Cls
        Picture1.ScaleMode = 3
        
        Picture1.Scale (-10, 10)-(10, -10)
        
        Picture1.DrawWidth = 1
        
        
        Picture1.Line (-10, 0)-(10, 0), vbBlue
        Picture1.Line (9, 0.5)-(10, 0), vbBlue
        Picture1.Line -(9, -0.5), vbBlue
        Picture1.ForeColor = vbBlue
        Picture1.Print "X"
        
        Picture1.Line (0, 10)-(0, -10), vbBlue
        Picture1.Line (0.5, 9)-(0, 10), vbBlue
        Picture1.Line -(-0.5, 9), vbBlue
        Picture1.Print "Y"
        
        Picture1.CurrentX = 0.5
        Picture1.CurrentY = -0.5
        Picture1.Print "O"
        
        Picture1.DrawWidth = 2
        
        For a = -2 * pi To 2 * pi Step pi / 6000
            Picture1.PSet (a, Cos(a) * 5), vbRed
        Next
            
        Picture1.CurrentX = pi / 2
        Picture1.CurrentY = -7
        Picture1.ForeColor = vbBlack
        Picture1.Print "余弦曲线示意"
    End Sub
      

  3.   

    我也厚颜一次 -_-||
    自己动手做一个数学函数作图器
     出处:电脑爱好者
    责任编辑:zwg
     
    [02-3-25 16:33]  作者:陈新新  自己动手做一个数学函数作图器  学习中我们经常会遇到一些要求作图的题目,数学就是一个很好的例子,君不见,哪一个学生不是整天拿着一根尺子几只笔在画啊画的?要是能有一个作图的软件该有多好啊!虽然拿来主义是我们一向的作风,可是只顾拿来而从不动一下脑筋又有点儿说不过去,所以,今天的课题就是——用VB做一个数学函数作图器!  我们先来了解一下VB的坐标系统,VB的坐标系统可分为“窗体的坐标系统”和“对象的坐标系统”两种,但是这两种坐标系统均是以屏幕的左上角为原点(0,0),这和我们平时所选取的以中心为原点显然很不相符,而且使用起来也很不方便。所以,我们要用VB提供的Scale来自定义坐标系,格式如: Picture1.Scale(-10,10)-(10,-10),意思就是把整个Picture1控件定义为一个20×20的区域用于绘图,以Picture1的中心为原点(0,0)。
    有了上面的基础,我们就可以用Pset(画点)、Line(画线)等,轻轻松松地来画函数的图像了。  启动VB,建立一标准EXE工程,再在窗口上如图所示地布置5个Command Button控件和1个PictureBox控件,输入以下的代码就OK了。
    Const Pi = 3.1415926535 '定义圆周率
    Dim a, wor
    '定义用于在Picture1上的一个位置打印字符函数
    Private Function PrintWord(X, Y, Word As String)
    With Picture1
    .CurrentX = X
    .CurrentY = Y
    .ForeColor = RGB(0, 0, 255)
    End With
    Picture1.Print Word
    End Function
    '定义画点函数
    Private Function DrawDot(Px, Py, Color)
    Picture1.PSet (Px, Py), Color
    End Function
    Sub XY() '建立直角坐标系
    Picture1.DrawWidth = 1 '设置线条宽度
    Picture1.Cls
    '设定用户坐标系,坐标原点在Picture1中心
    Picture1.Scale (-10, 10)-(10, -10)
    Picture1.Line (-10, 0)-(10, 0), RGB(0, 0, 255)
    Picture1.Line -(9.5, 0.5), RGB(0, 0, 255)
    Picture1.Line (10, 0)-(9.5, -0.5), RGB(0, 0, 255)
    Picture1.ForeColor = RGB(0, 0, 255)
    Picture1.Print "X"
    '画 X 轴
    Picture1.Line (0, -10)-(0, 10), RGB(0, 0, 255)
    Picture1.Line -(0.5, 9.5), RGB(0, 0, 255)
    Picture1.Line (0, 10)-(-0.5, 9.5), RGB(0, 0, 255)
    Picture1.Print "Y"
    '画 Y 轴
    For lin = -9 To 9
    Picture1.Line (lin, 0)-(lin, 0.25)
    wor = PrintWord(lin - 0.5, -0.5, Str(lin))
    Picture1.Line (0, lin)-(-0.25, lin)
    If lin <> 0 Then
    wor = PrintWord(-0.9, lin, Str(lin))
    End If
    Next lin
    Picture1.DrawWidth = 2
    nd Sub
    Private Sub Command1_Click() '画正弦曲线
    '用For循环绘点,使其按正弦规律变化。
    '步长小,使曲线比较平滑,还能形成动画效果
    For a = -2 * Pi To 2 * Pi Step Pi / 6000
    Dot = DrawDot(a, Sin(a) * 5, RGB(0, 255, 0))
    Next a
    wor = PrintWord(3, -6, "正弦曲线 y=Sinx")
    End Sub
    Private Sub Command2_Click()
    For a = -2 * Pi To 2 * Pi Step Pi / 6000
    Dot = DrawDot(a, Cos(a) * 5, RGB(255, 0, 0))
    Next a
    wor = PrintWord(4, 6, "余弦曲线 y=Cosx")
    End Sub
    Private Sub Command3_Click()
    For a = -3 To 3 Step Pi / 6000
    Dot = DrawDot(a, a ^ 2, RGB(0, 0, 0))
    Next a
    wor = PrintWord(4, 9, "二次曲线 y=x^2")
    End Sub
    Private Sub Command4_Click()
    For a = -8 To 8 Step Pi / 6000
    If a = 0 Then GoTo err0 '除数不能为0
    Dot = DrawDot(a, 1 / a, RGB(255, 0, 255))
    err0:
    Next a
    wor = PrintWord(6, 2, "双曲线 y=1/x")
    End Sub
    Private Sub Command5_Click() '清空屏幕
    XY
    End SubPrivate Sub Form_Load()
    Me.Caption = "数学函数作图?quot;
    Me.Show
    Me.AutoRedraw = True
    Picture1.BackColor = vbWhite
    Command1.Caption = "正弦曲线"
    Command2.Caption = "余弦曲线"
    Command3.Caption = "二次曲线"
    Command4.Caption = "双曲线"
    Command5.Caption = "清空"
    XY
    End SubPrivate Sub Form_Resize()
    Picture1.Width = Me.Width * 0.94
    End Sub
    怎么样,是不是很容易就把函数图像画出来了?比起“取点、描点、画图像”的步骤简单多了,而且还是动画效果的呢!
    程序在Windows98/XP+VB6.0下编译通过。
     
      

  4.   

    直接用API不是很好吗,搞那么多名唐
      

  5.   

    直接用API不是很好吗,搞那么多名唐===================================
    api有直接画二次曲线,余弦曲线的函数?
    我只知道有贝塞尔曲线能用api画
      

  6.   

    呵呵,楼上的,你认为vb的方法用起来能画出来的什么...什么...什么"曲线"
    用API就画不出来,还很麻烦很慢吗?呵呵,我败给你了。
      

  7.   

    Private Sub Form_Load()
        Me.ScaleMode = vbPixels
    End SubPrivate Sub Form_Paint()
        Dim x As Long
        Dim sy As Long
        Dim sx As Double
        
        sx = 3.14159265358979 * 2 / ScaleWidth
        sy = ScaleHeight \ 2
        
        Cls
        CurrentY = sy
        For x = 1 To ScaleWidth
            Line Step(0, 0)-(x, sy - sy * Sin(x * sx))
        Next
    End Sub
      

  8.   

    To SupermanKing(人类) :
    请看明白我的意思,我是说用api直接画的曲线只有Bezier(PolyBezier, PolyBezierTo两个api),后来被封到.net中了。
    如果用setpixel,当然什么都能画了,vb自己的pset不过是setpixel的包装,后来在.net里又变回了setpixel
    另外,再请教一下,有直接画正弦函数的api吗?如果有,我就真的败了。。
      

  9.   

    to DooDu
    =================
    不知你把楼上几位的代码用VB测试过吗,我看了一下:
    漂亮到是廷漂亮的,但是速度都很慢,在AutoRedraw属性都是False的时候,
    还会有些动画效果,但在AutoRedraw属性都是True的时候那个速度就...但是,用PolyBezier实现这样的效果肯定是可以的,而且速度很快,不是吗?
    既然你知道PolyBezier这个函数,相信你也知道他怎么用了吧。
    其实我认为完全可以以运算点坐标的方式套入算法算出PolyBezier所需要的
    点坐标信息,然后用PolyBezier函数来绘制曲线,这样一来绘图的操作只有
    一步,而主要代码是在于运算。这一点对于绘图程序的效率是很重要的。就
    像游戏中所有的图形处理都是在内存处理,最后才一步打印到屏幕一样。但是,我看了楼上几位的代码,绘图操作比较多,而且运算也比较频繁,虽
    然运算的过程不是很复杂,但是因为绘图和运算过于频繁,所以相对效率也
    就不高了。我之所以说:“直接用API不是很好吗”,指的就是用PolyBezier函数,之所
    以说:“搞那么多名唐”,就是指绘图和运算过于频繁。你问我:“有直接画正弦函数的api吗?”,这个我不敢说,但据我所知是没
    有的,不过既然PolyBezier加上运算可以实现,而且效果很好,像这种函数
    自己总可以写出来吧。还有用API写出来的效率总会比VB本身的强一点吧。
      

  10.   

    我之所以说:“直接用API不是很好吗”,指的就是用PolyBezier函数
    ==============================
    那你的开始的意思是:“直接用“PolyBezier”不是很好吗?”
    狂汗楼主要画cos函数,碍Bezier什么事?有直接画正弦函数的api吗?现在我可以肯定的告诉你,没有。你所说的
    “还有用API写出来的效率总会比VB本身的强一点吧”
    我当然理解,但最终还是用setpixel啊
    抱歉,PolyBezier我没仔细研究过,它的原理也不过是 计算 然后 画点
    我之所以指出你的问题,是为了说明:“搞那么多名唐”是必要的,楼上的代码也没走弯路,只是pset可以换成setpixel也许更快点。
      

  11.   

    这个是Bezier,用setpixel也能做,但计算麻烦的很
    http://www.lnnu.edu.cn/xdjyjx/tuxing/Chapter3/CG_Txt_3_014.htm
      

  12.   

    to DooDu
    =================================
    “有直接画正弦函数的api吗?现在我可以肯定的告诉你,没有。”我还用你来告诉我呀,我说点谦虚的话你还真以为你了不起了。给你
    三分颜色你就开染坊,真是不知所谓。再说了,Microsoft系统里到底
    有多少东西你能全知道?最起码我就知道了好几个未公开的API,如果
    存在也没什么奇怪的呀。为人处事不要吧话说得太死。“你所说的”
    ““还有用API写出来的效率总会比VB本身的强一点吧””
    “我当然理解,但最终还是用setpixel啊”看来你还真是不懂,呵呵
    还是你认为PolyBezier画不出setpixel所能画的线?
    或是你认为用API如果不用setpixel就做不出来?
    或是你认为使用PolyBezier画线的速度和setpixel的速度差不多?你就别逗我笑了,呵呵。“抱歉,PolyBezier我没仔细研究过,它的原理也不过是 计算 然后 画点”呵呵,那Access和SQL原理都是已二进制数据存储在硬盘上的,为什么碰到大
    过1G的数据库的时候速度还有那么大的差别?难道也可以按这种原理估计他们
    差不多?““搞那么多名唐”是必要的,楼上的代码也没走弯路”我也没说楼上的代码走弯路路了,反而我认为太简单了应该多写点呢。所以才
    建议用PolyBezier的呀。呵呵,这样也敢跑出来说大话。现在到我告诉你了,用PolyBezier同样可以画点,就是用单个点的速度要慢
    一点,但是说道曲线,setpixel是没法和PolyBezier相提并论的。我测试过,
    在赛扬600Hz/128Mb的电脑上得出来的结果。用setpixel画满640*480的图,
    最快的是811毫秒,而用PolyBezier只用了30毫秒。而且我用PolyBezier是以
    直线的方式绘制,这不是PolyBezier的长项。用PolyBezier画点的方式绘制,
    PolyBezier用了2754毫秒,这就不如setpixel了。但是,这可以看出setpixel
    在绘制线段时和PolyBezier的差距足有几十倍。虽然PolyBezier用起来比
    setpixel麻烦一点,但是用PolyBezier实现曲线的绘制从GDI的角度来说是很
    适合的,因为目前的系统还是基于GDI,所以什么DX或Mygame也就不说了。
    此贴我也就不再关心了,自己好自为之吧。
      

  13.   

    我说“api有直接画二次曲线,余弦曲线的函数?
    我只知道有贝塞尔曲线能用api画”然后你说:呵呵,楼上的,你认为vb的方法用起来能画出来的什么...什么...什么"曲线"
    用API就画不出来,还很麻烦很慢吗?呵呵,我败给你了。
    ==========================================
    从这里看我就知道你当时还不知道什么是画贝塞尔的曲线,而后你又改口了:我之所以说:“直接用API不是很好吗”,指的就是用PolyBezier函数,之所
    以说:“搞那么多名唐”,就是指绘图和运算过于频繁。你的话很矛盾。说明在我提出之后你仔细研究了PolyBezier,不错!呵呵当然完全不用setpixel
    其实用SetBitmapBits更快,我也测试了
    api是有没公开的,你知道又什么样,难道还有画cos这个api你也知道?所以,不要见什么都觉的不可以,要谦虚点(也在说我自己)!从此不在回复此贴!