完整实现过程+源码 | 只需输入二次函数系数,应用VB编程即可动态生成函数图像!

'定义X,Y坐标轴和绘图常量Private Const X_MIN As Double = -10 ' X轴最小值Private Const X_MAX As Double = 10 ' X轴最大值Private Const Y_MIN As Double = -10 ' Y轴最小值Private Const Y_MAX As Double = 10 ' Y轴最大值Private Const GRID_SPACING As Integer = 1 ' 网格间距'根据输入的系数,生成二次函数Private Function QuadraticFunc(a As Double, b As Double, c As Double, x As Double) As DoubleQuadraticFunc = a * x * x + b * x + cEnd Function' 绘制坐标系Private Sub DrawCoordinateSystem()Dim centerX As Long, centerY As LongDim i As IntegerDim pixelX As Long, pixelY As Long' 清空图片框picGraph.Cls' 设置坐标系(数学坐标系)picGraph.Scale (X_MIN, Y_MAX)-(X_MAX, Y_MIN)' 绘制坐标轴picGraph.ForeColor = vbBlackpicGraph.DrawWidth = 2' X轴picGraph.Line (X_MIN, 0)-(X_MAX, 0)' Y轴picGraph.Line (0, Y_MIN)-(0, Y_MAX)' 绘制箭头picGraph.Line (X_MAX - 0.5, 0.5)-(X_MAX, 0)picGraph.Line (X_MAX - 0.5, -0.5)-(X_MAX, 0)picGraph.Line (0.5, Y_MAX - 0.5)-(0, Y_MAX)picGraph.Line (-0.5, Y_MAX - 0.5)-(0, Y_MAX)' 绘制网格picGraph.ForeColor = &HE0E0E0picGraph.DrawWidth = 1'垂直网格线For i = Int(X_MIN) To Int(X_MAX)If i <> 0 ThenpicGraph.Line (i, Y_MIN)-(i, Y_MAX)End IfNext i'水平网格线For i = Int(Y_MIN) To Int(Y_MAX)If i <> 0 ThenpicGraph.Line (X_MIN, i)-(X_MAX, i)End IfNext i'绘制刻度picGraph.ForeColor = vbBlackpicGraph.FontSize = 8'X轴刻度For i = Int(X_MIN) To Int(X_MAX)If i <> 0 And i Mod 2 = 0 ThenpicGraph.Line (i, -0.3)-(i, 0.3)picGraph.CurrentX = i - 0.2picGraph.CurrentY = -0.8picGraph.Print CStr(i)End IfNext i'Y轴刻度For i = Int(Y_MIN) To Int(Y_MAX)If i <> 0 And i Mod 2 = 0 ThenpicGraph.Line (-0.3, i)-(0.3, i)picGraph.CurrentX = 0.4picGraph.CurrentY = i - 0.2picGraph.Print CStr(i)End IfNext i'绘制坐标轴标签picGraph.FontSize = 12picGraph.CurrentX = X_MAX - 0.8picGraph.CurrentY = -0.8picGraph.Print "X"picGraph.CurrentX = 0.5picGraph.CurrentY = Y_MAX - 0.8picGraph.Print "Y"End Sub' 绘制二次函数图像Private Sub DrawQuadraticFunction(a As Double, b As Double, c As Double)Dim x As DoubleDim y As DoubleDim prevX As Double, prevY As DoubleDim firstPoint As BooleanDim stepSize As Double' 设置绘图样式picGraph.ForeColor = vbRedpicGraph.DrawWidth = 2'计算步长(根据显示范围调整)stepSize = (X_MAX - X_MIN) / picGraph.Width * 10firstPoint = True'绘制曲线For x = X_MIN To X_MAX Step stepSizey = QuadraticFunc(a, b, c, x)' 检查Y值是否在显示范围内If y >= Y_MIN And y <= Y_MAX ThenIf firstPoint ThenfirstPoint = FalseElse'绘制线段连接相邻点picGraph.Line (prevX, prevY)-(x, y)End IfprevX = xprevY = yElsefirstPoint = TrueEnd IfNext x' 绘制顶点和交点DrawSpecialPoints a, b, cEnd Sub'绘制特殊点(顶点、与坐标轴交点)Private Sub DrawSpecialPoints(a As Double, b As Double, c As Double)Dim vertexX As Double, vertexY As DoubleDim discriminant As DoubleDim x1 As Double, x2 As DoubleDim yIntercept As Double' 计算顶点If a <> 0 ThenvertexX = -b / (2 * a)vertexY = QuadraticFunc(a, b, c, vertexX)'绘制顶点picGraph.ForeColor = vbRedpicGraph.FillColor = vbRedpicGraph.FillStyle = 0 ' SolidpicGraph.Circle (vertexX, vertexY), 0.2picGraph.CurrentX = vertexX + 0.3picGraph.CurrentY = vertexY + 0.3picGraph.Print "(" & Format(vertexX, "0.00") & "," & Format(vertexY, "0.00") & ")"End If'计算Δ的值,根据Δ的值情况,可以知道X轴交点discriminant = b * b - 4 * a * cIf discriminant >= 0 And a <> 0 Thenx1 = (-b + Sqr(discriminant)) / (2 * a)x2 = (-b - Sqr(discriminant)) / (2 * a)' 绘制交点picGraph.ForeColor = &HFF0080picGraph.FillColor = &HFF0080If discriminant > 0 Then '两个不同实根picGraph.Circle (x1, 0), 0.2picGraph.Circle (x2, 0), 0.2picGraph.CurrentX = x1 + 0.3picGraph.CurrentY = 0.5picGraph.Print "x1=" & Format(x1, "0.00")picGraph.CurrentX = x2 + 0.3picGraph.CurrentY = -0.5picGraph.Print "x2=" & Format(x2, "0.00")Else '两个相同的根picGraph.Circle (x1, 0), 0.2picGraph.CurrentX = x1 + 0.3picGraph.CurrentY = 0.5picGraph.Print "x=" & Format(x1, "0.00")End IfEnd If' 绘制与Y轴交点yIntercept = cpicGraph.ForeColor = vbMagentapicGraph.FillColor = vbMagentapicGraph.Circle (0, yIntercept), 0.2picGraph.CurrentX = 0.5picGraph.CurrentY = yIntercept + 0.3picGraph.Print "y=" & Format(yIntercept, "0.00")End SubPrivate Sub Command1_Click() '一键计算二次函数的对称轴、顶点、根a = txtA '将文本框Ab = txtBc = txtC'计算对称轴vertexX = -(b / (2 * a))'计算顶点坐标vertexY = (4 * a * c - b * b) / (4 * a)Text1 = "x=" & vertexXText2 = "(" & vertexX & "," & vertexY & ")"'计算Δ,判断根的情况discriminant = b * b - 4 * a * cIf discriminant >= 0 And a <> 0 Thenx1 = (-b + Sqr(discriminant)) / (2 * a)x2 = (-b - Sqr(discriminant)) / (2 * a)If discriminant > 0 Then ' 两个不同实根Text3 = "x1=" & Format(x1, "0.00") & ",x2=" & Format(x2, "0.00")Else ' 重根Text3 = "x=" & Format(x1, "0.00")End IfEnd IfEnd Sub' 窗体加载Private Sub Form_Load()' 设置默认值txtA.Text = "1"txtB.Text = "0"txtC.Text = "0"'设置图片框属性picGraph.BackColor = vbWhitepicGraph.ScaleMode = 3picGraph.BorderStyle = 1' 绘制初始坐标系DrawCoordinateSystemEnd Sub' 系数输入框变化时动态生成实时图像预览Private Sub txtA_Change()If Val(txtA.Text) <> 0 ThenIf IsNumeric(txtA.Text) And IsNumeric(txtB.Text) And IsNumeric(txtC.Text) ThenDrawCoordinateSystemDrawQuadraticFunction CDbl(txtA.Text), CDbl(txtB.Text), CDbl(txtC.Text)End IfEnd IfEnd SubPrivate Sub txtB_Change()If IsNumeric(txtA.Text) And IsNumeric(txtB.Text) And IsNumeric(txtC.Text) ThenDrawCoordinateSystemDrawQuadraticFunction CDbl(txtA.Text), CDbl(txtB.Text), CDbl(txtC.Text)End IfEnd SubPrivate Sub txtC_Change()If IsNumeric(txtA.Text) And IsNumeric(txtB.Text) And IsNumeric(txtC.Text) ThenDrawCoordinateSystemDrawQuadraticFunction CDbl(txtA.Text), CDbl(txtB.Text), CDbl(txtC.Text)End IfLabel8.Caption = "y=" & txtA & "x^2+" & txtB & "x+" & txtCEnd Sub'图片框大小改变时重绘Private Sub picGraph_Resize()If txtA.Text <> "" And IsNumeric(txtA.Text) ThenDrawCoordinateSystemDrawQuadraticFunction CDbl(txtA.Text), CDbl(txtB.Text), CDbl(txtC.Text)ElseDrawCoordinateSystemEnd IfEnd Sub

已关注
关注
重播 分享 赞
VB编程干货整理
跟我学VB编程研发中心
认真钻研计算机技术
分享实用的编程知识
解决各类编程难题
祝大家学习进步!
夜雨聆风
