0

我已经在这几天了。

我在数学上(使用 PQ 公式和 Qaudratic 方程)设法得到一条曲线的交点。但这一点与我将鼠标单击到表单的这一点时得到的点不同。

下面是截图: http ://s7.directupload.net/file/d/3341/zi8ohv7u_png.htm "msgMouseClickOnPoint"

另外,我的代码的一部分

Private Sub Form1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick
    Dim ptLocationOnForm As New System.Drawing.Point
    'To get the mouse location relative to the Form
    ptLocationOnForm = Me.PointToClient(Cursor.Position)
    'SHow the locations
    MessageBox.Show(ptLocationOnForm.X.ToString + " : " + (ptLocationOnForm.Y).ToString)
End Sub

Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    '' Create font and brush.
    Dim drawFont As New Font("Arial", 8)
    Dim drawBrush As New SolidBrush(Color.Black)

    Dim x1 As Integer = 0
    Dim y1 As Integer = 100
    Dim x2 As Integer = 500
    Dim y2 As Integer = 250
    ' y = m*x +b
    ' m = (y1-y2)/(x1-x2)
    ' b = y1 -m*x1
    Dim m As Double = (y1 - y2) / (x1 - x2)
    Dim b As Double = y1 - (m * x1)
    'Testing m and b
    'y1 = m * x1 + b
    'y2 = m * x2 + b

    Dim g As Graphics
    Dim p As Pen
    p = New Pen(System.Drawing.Color.Black)
    Dim px = New Pen(System.Drawing.Color.DarkOrange)
    g = e.Graphics
    With g
        'draw x Axis
        .DrawLine(p, 0, 500, 500, 500)
        'draw y Axis
        .DrawLine(p, 0, 0, 0, 500)

        'draw marks on the Axis 
        .DrawLine(px, 100, 495, 100, 505)

        .DrawLine(px, 200, 495, 200, 505)
        .DrawLine(px, 300, 495, 300, 505)
        .DrawLine(px, 400, 495, 400, 505)

        .DrawLine(p, 0, 100, 10, 100)
        .DrawLine(p, 0, 200, 10, 200)
        .DrawLine(p, 0, 300, 10, 300)
        .DrawLine(p, 0, 400, 10, 400)

        .DrawLine(New Pen(System.Drawing.Color.DarkGreen), x1, y1, x2, y2)
        .DrawString(x2.ToString + ", " + (y2).ToString, drawFont, Brushes.Brown, x2, y2)
        .DrawString(x1.ToString + ", " + (y1).ToString, drawFont, Brushes.Brown, x1, y1)
        .DrawString("Line Equation: " + (m).ToString + "X² + " + b.ToString, drawFont, Brushes.Brown, 189, 140)
    End With


    'draw curve
    Dim xc1 As Integer = 20
    Dim yc1 As Integer = 120

    Dim xc2 As Integer = 240
    Dim yc2 As Integer = 489

    Dim xc3 As Integer = 500
    Dim yc3 As Integer = 20

    Dim point1 As New Point(xc1, yc1)
    Dim point2 As New Point(xc2, yc2)
    Dim point3 As New Point(xc3, yc3)
    Dim points() As Point = {point1, point2, point3}
    'Draw Curve before calculating a, bc and c. This helps to test the correctness of a, bc and c.
    e.Graphics.DrawCurve(Pens.Green, points)

    'calculate a, bc anc c
    Dim a As Double = ((yc2 - yc1) * (xc1 - xc3) + (yc3 - yc1) * (xc2 - xc1)) / ((xc1 - xc3) * ((xc2 ^ 2) - (xc1 ^ 2)) + (xc2 - xc1) * ((xc3 ^ 2) - (xc1 ^ 2)))
    Dim bc As Double = ((yc2 - yc1) - a * ((xc2 ^ 2) - (xc1 ^ 2))) / (xc2 - xc1)
    Dim c As Double = yc1 - (a * (xc1 ^ 2)) - (bc * xc1)
    e.Graphics.DrawString("Curve Equation: Ax² + Bx + C := " + a.ToString + " X² + " + bc.ToString + " X + " + c.ToString, drawFont, Brushes.Green, 100, 10)
    'create another y points using Curve Equation
    yc1 = a * (xc1 ^ 2) + (bc * xc1) + c
    yc2 = a * (xc2 ^ 2) + (bc * xc2) + c
    yc3 = a * (xc3 ^ 2) + (bc * xc3) + c

    Dim point1_n As New Point(xc1, yc1)
    Dim point2_n As New Point(xc2, yc2)
    Dim point3_n As New Point(xc3, yc3)
    Dim points_n() As Point = {point1_n, point2_n, point3_n}
    'Another curve using the new y values. To show that a, bc, c are correct the two curves have to be on eachother
    e.Graphics.DrawCurve(Pens.DarkBlue, points_n)

    'intercept mit PQ Formel (-p/2 +- wurzel (p/2)^2 - q)
    'In other to use the PQ Formula, we need the equation in this form x²+bx+c for the equations: ax²+bcx+c = mx+b
    'So solving that equation we will get x² + ((bc-m)/a)x + (c-b)/a
    Dim p_inter As Double = (bc - m) / a
    Dim q_inter As Double = (c - b) / a

    'e.Graphics.DrawString("a : " + a.ToString + ", b : " + (bc - m).ToString + ", c : " + (c - b).ToString, drawFont, Brushes.Brown, 25, 600)
    'e.Graphics.DrawString("p = " + p_inter.ToString + ", q = " + q_inter.ToString, drawFont, Brushes.Brown, 25, 620)

    Dim unterWurzel As Double = ((p_inter / 2) ^ 2) - q_inter
    Dim x_positive As Double = -(p_inter / 2) + (Math.Sqrt(unterWurzel))
    'substituting the x in the line Equation to get the corresponding y 
    Dim y_positive As Double = m * x_positive + b

    e.Graphics.DrawString("Points of interception", drawFont, Brushes.Brown, 400, 285)
    e.Graphics.DrawString("( " + x_positive.ToString + " , " + (y_positive).ToString + " )", drawFont, Brushes.Brown, 400, 300)

    Dim x_negative As Double = -(p_inter / 2) - (Math.Sqrt(unterWurzel))
    Dim y_negative As Double = m * x_negative + b
    'also substituting in the curve Equation give the same value
    Dim y_equa_nega As Double = a * (x_negative ^ 2) + (bc * x_negative) + c
    Dim y_equa_pos As Double = a * (x_positive ^ 2) + (bc * x_positive) + c
    'e.Graphics.DrawString("Y(Negative) from Curve : " + (Trans - y_equa_nega).ToString, drawFont, Brushes.Brown, 25, 555)
    'e.Graphics.DrawString("Y(positive) from Curve : " + (Trans - y_equa_pos).ToString, drawFont, Brushes.Brown, 25, 575)

    e.Graphics.DrawString("( " + x_negative.ToString + " : " + (y_negative).ToString + " )", drawFont, Brushes.Brown, 400, 325)
End Sub

我从计算中获得的值与鼠标单击该点的值不同。

我已尽我所能,但仍然不知道为什么价值观不一样。

请帮助我。

谢谢

4

0 回答 0