График линейного уравнения - Visual Basic .NET

Узнай цену своей работы

Формулировка задачи:

Помогите пожалуйста Сделать работающий график а то этот график не правильный
Листинг программы
  1. Public Class Form1
  2. Dim Graph1 As Graphics
  3. Dim Pen1 As New Pen(Color.Black, 2)
  4. Dim Pen2 As New Pen(Color.Black, 1)
  5. Dim brush1 As New SolidBrush(Color.Black)
  6. Dim font1 As New Font("times new roman", 12)
  7. Dim X, Y, a1, a2, b1, b2, c1, c2, k1, k2, m1, m2, d, z1, z2, x1, y1 As Single
  8. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  9. Label1.Text = "Введите данные"
  10. Label2.Text = "X1+"
  11. Label3.Text = "X2="
  12. Label4.Text = "X1+"
  13. Label5.Text = "X2="
  14. Label6.Text = ""
  15. Label7.Text = ""
  16. Label8.Text = ""
  17. Button1.Text = "Решить и построить график"
  18. End Sub
  19. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  20. Graph1 = Me.PictureBox1.CreateGraphics()
  21. For X = -15 To 15 Step 3
  22. Graph1.DrawString(X, font1, brush1, X * 10 + 150, 150)
  23. Next X
  24. For Y = -15 To 150 Step 3
  25. Graph1.DrawString(Y, font1, brush1, 150, 150 - Y * 10)
  26. Next Y
  27. Graph1.ScaleTransform(1, -1)
  28. Graph1.TranslateTransform(150, -150)
  29. Graph1.DrawLine(Pen1, -150, 0, 150, 0)
  30. Graph1.DrawLine(Pen1, 0, -150, 0, 150)
  31. For X = -150 To 150 Step 30
  32. Graph1.DrawLine(Pen2, X, -1, X, 1)
  33. Next X
  34. For Y = -150 To 150 Step 30
  35. Graph1.DrawLine(Pen2, -1, Y, 1, Y)
  36. Next Y
  37. a1 = TextBox1.Text
  38. b1 = TextBox2.Text
  39. c1 = TextBox5.Text
  40. a2 = TextBox3.Text
  41. b2 = TextBox4.Text
  42. c2 = TextBox6.Text
  43. k1 = (-1) * (a1 / b1)
  44. m1 = (-1) * (c1 / b1)
  45. k2 = (-1) * (a2 / b2)
  46. m2 = (-1) * (c2 / b2)
  47. d = -(a2 / a1)
  48. a2 = a2 + (a1 * d)
  49. b2 = b2 + (b1 * d)
  50. c2 = c2 + (c1 * d)
  51. z2 = c2 / b2
  52. z1 = (c1 - (z2 * b1)) / a1
  53. Label6.Text = "X1="
  54. Label7.Text = "X2=" + z2.ToString
  55. Label8.Text = "Из решения методом Гаусса получено:"
  56. For X = -150 To 150 Step 1
  57. Y = k1 * X + m1
  58. y1 = k1 * (X + 1) + m1
  59. Graph1.DrawLine(Pen2, X * 10, Y * 10, (X + 1) * 10, y1 * 10)
  60. Next X
  61. For X = -150 To 150 Step 1
  62. Y = k2 * X + m2
  63. y1 = k2 * (X + 1) + m2
  64. Graph1.DrawLine(Pen2, X * 10, Y * 10, (X + 1) * 10, y1 * 10)
  65. Next X
  66. End Sub
  67. Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
  68. End Sub
  69. Private Sub Label6_Click(sender As Object, e As EventArgs) Handles Label6.Click
  70. End Sub
  71. End Class
График так должен выглядеть помагите пожалуйста очень надо

Решение задачи: «График линейного уравнения»

textual
Листинг программы
  1. Public Class Form5
  2.     Private pp As fPlot2
  3.     Private isLoad As Boolean
  4.     Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
  5.         Dim a1 As Double = CDbl(TextBox1.Text)
  6.         Dim a2 As Double = CDbl(TextBox2.Text)
  7.         Dim c1 As Double = CDbl(TextBox3.Text)
  8.         Dim b1 As Double = CDbl(TextBox6.Text)
  9.         Dim b2 As Double = CDbl(TextBox5.Text)
  10.         Dim c2 As Double = CDbl(TextBox4.Text)
  11.         Dim ff1 = Function(x) -a1 / a2 * x + c1 / a2
  12.         Dim ff2 = Function(x) -b1 / b2 * x + c2 / b2
  13.         Dim xx As Double = (c2 / b2 - c1 / a2) / (b1 / b2 - a1 / a2)
  14.         Label6.Text = "x = " & xx.ToString
  15.         Label7.Text = "y = " & ff1(xx).ToString
  16.         pp = New fPlot2(ff1, ff2, -5, 5, 0.2)
  17.         pp.isAxDivision = True
  18.         pp.isGrid = True
  19.         pp.divisionNumberToX = 10
  20.         pp.divisionNumberToY = 10
  21.         pp.isAxesLetter = True
  22.         isLoad = True
  23.         PictureBox1.Invalidate()
  24.     End Sub
  25.     Private Sub PictureBox1_Paint(sender As System.Object, e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
  26.         If Not isLoad Then Exit Sub
  27.         pp.plot(PictureBox1.Width, PictureBox1.Height, e)
  28.     End Sub
  29. End Class
  30. '…
  31. Public Class fPlot2
  32.     Private Xmn, Xmx, Ymn, Ymx, stX, divX, divY As Double
  33.     Private xy1(), xy2() As PointF
  34.     Private pnAxes, pnCurve1, pnCurve2, pnGrid As Pen
  35.     Public Sub New(ff1 As Func(Of Double, Double), ff2 As Func(Of Double, Double), ByVal Xmin As Double, ByVal Xmax As Double, ByVal stepX As Double)
  36.         Xmn = Xmin
  37.         Xmx = Xmax
  38.         stX = stepX
  39.         ReDim xy1((Xmx - Xmn) / stX)
  40.         ReDim xy2((Xmx - Xmn) / stX)
  41.         Ymn = Double.MaxValue
  42.         Ymx = Double.MinValue
  43.         Dim xx As Double = Xmn
  44.         Dim ffx1 As Double
  45.         For i = 0 To xy1.Length - 1
  46.             ffx1 = ff1(xx)
  47.             xy1(i) = New PointF(xx, ffx1)
  48.             xy2(i) = New PointF(xx, ff2(xx))
  49.             Ymn = Math.Min(Ymn, ffx1)
  50.             Ymx = Math.Max(Ymx, ffx1)
  51.             xx += stX
  52.         Next
  53.         pnAxes = New Pen(Brushes.Black, -1)
  54.         pnCurve1 = New Pen(Brushes.Red, -1)
  55.         pnCurve2 = New Pen(Brushes.Blue, -1)
  56.         pnGrid = New Pen(Brushes.LightGray, -1)
  57.         _pnAxesColor = Color.Black
  58.         _pnCurveColor1 = Color.Red
  59.         _pnCurveColor2 = Color.Blue
  60.         _isGrid = False
  61.         isAxDivision = False
  62.         _isAxesLetter = False
  63.         _divisionNumberToX = 2
  64.         _divisionNumberToY = 2
  65.     End Sub
  66.     Public Property pnAxesColor As Color            'цвет осей
  67.     Public Property pnCurveColor1 As Color           'цвет кривой 1
  68.     Public Property pnCurveColor2 As Color           'цвет кривой 2
  69.     Public Property isGrid As Boolean               'сетка
  70.     Public Property isAxDivision As Boolean         'шкала
  71.     Public Property isAxesLetter As Boolean         'подписывать
  72.     Public Property divisionNumberToX As Integer    'число делений шкалы X
  73.     Public Property divisionNumberToY As Integer    'число делений шкалы Y
  74.     Public Sub plot(ByVal w As Integer, ByVal h As Integer, ByVal e As System.Windows.Forms.PaintEventArgs)
  75.         pnAxes.Color = _pnAxesColor
  76.         pnCurve1.Color = _pnCurveColor1
  77.         pnCurve2.Color = _pnCurveColor2
  78.         Dim g As Graphics = e.Graphics
  79.         g.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
  80.         Dim xxmx As Double = Xmx
  81.         Dim xxmn As Double = Xmn
  82.         Dim yymx As Double = Ymx
  83.         Dim yymn As Double = Ymn
  84.         Try
  85.             If isAxDivision Then
  86.                 Dim axX() As Double = divisionAxes(Xmx, Xmn, divisionNumberToX)
  87.                 Dim axY() As Double = divisionAxes(Ymx, Ymn, divisionNumberToY)
  88.                 xxmx = axX(1)
  89.                 xxmn = axX(0)
  90.                 yymx = axY(1)
  91.                 yymn = axY(0)
  92.                 divX = axX(2)
  93.                 divY = axY(2)
  94.             End If
  95.             Dim scX As Single = w / (xxmx - xxmn)
  96.             Dim scY As Single = h / (yymx - yymn)
  97.             g.ScaleTransform(scX, -scY)
  98.             g.TranslateTransform(-xxmn, -yymx)
  99.             g.Clear(Color.White)
  100.             If isAxDivision AndAlso isGrid Then
  101.                 For xx As Double = xxmn To xxmx Step divX
  102.                     g.DrawLine(pnGrid, New PointF(xx, yymn), New PointF(xx, yymx))
  103.                     g.DrawLine(pnAxes, New PointF(xx, 0), New PointF(xx, -divY * 0.1))
  104.                 Next
  105.                 For yy As Double = yymn To yymx Step divY
  106.                     g.DrawLine(pnGrid, New PointF(xxmn, yy), New PointF(xxmx, yy))
  107.                     g.DrawLine(pnAxes, New PointF(0, yy), New PointF(divX * 0.1, yy))
  108.                 Next
  109.             End If
  110.             g.DrawLine(pnAxes, New PointF(0, yymn), New PointF(0, yymx))
  111.             g.DrawLine(pnAxes, New PointF(xxmn, 0), New PointF(xxmx, 0))
  112.             g.DrawLines(pnCurve1, xy1)
  113.             g.DrawLines(pnCurve2, xy2)
  114.             If isAxesLetter Then
  115.                 g.ResetTransform()
  116.                 g.ScaleTransform(1, 1)
  117.                 g.TranslateTransform(-xxmn * scX, yymx * scY)
  118.                 Dim txtFont As New Font(FontFamily.GenericMonospace, 9, FontStyle.Regular)
  119.                 For xx = xxmn To xxmx Step divX
  120.                     g.DrawString(Format(xx, "0.0"), txtFont, Brushes.Black, xx * scX, divY * 0.2 * scY)
  121.                 Next
  122.                 For yy = yymn To yymx Step divY
  123.                     If yy = 0 Then Continue For
  124.                     g.DrawString(Format(yy, "0.0"), txtFont, Brushes.Black, divX * 0.2 * scX, -yy * scY)
  125.                 Next
  126.             End If
  127.         Catch ex As Exception
  128.             MsgBox(ex.Message)
  129.         End Try
  130.     End Sub
  131.     Private Function divisionAxes(ByVal vmx As Double, ByVal vmn As Double, ByVal div As Double) As Double()
  132.         Dim ax(2) As Double
  133.         Dim divSize As Double = (vmx - vmn) / div
  134.         Dim tdSize As Double = 10 ^ Int(Math.Log10(divSize))
  135.         Dim mfc As Double = 1
  136.         Do While (vmx > (tdSize * Int(vmn / tdSize) + div * tdSize))
  137.             mfc += 1
  138.             If (mfc Mod 4) > 0 Then tdSize = 8 * tdSize / 5
  139.             tdSize = 5 * tdSize / 4
  140.         Loop
  141.         ax(0) = tdSize * Int(vmn / tdSize)  'min шкалы
  142.         ax(1) = ax(0) + div * tdSize        'max шкалы
  143.         ax(2) = (ax(1) - ax(0)) / div       'деление шкалы
  144.         Return ax
  145.     End Function
  146. End Class

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.167 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут