Results 1 to 3 of 3

Thread: intersection point slightly off

Hybrid View

  1. #1

    Thread Starter
    eXtreme Programmer .paul.'s Avatar
    Join Date
    May 2007
    Location
    Chelmsford UK
    Posts
    25,464

    intersection point slightly off

    the code i've posted is supposed to find the intersection point of 2 lines, but it's slightly wrong. i make the point of intersection 122,42, but i think getnode (i found this function on msdn) finds 122,40...

    i was trying to solve the problem myself but i was confused with the slope factor of the 2 lines.
    an explanation of how to calculate this taking in to consideration the slope factor(s) of the lines would be appreciated, + a fix for the existing code would also be appreciated:

    as usual please keep any answers as simple as possible thanks

    Code:
    Public Class Form1
    
        'getnode code from:
        'http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/4eb3423e-eb81-4977-8ce5-5a568d53fd9b/
    
        Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
            e.Graphics.DrawLine(Pens.Black, 120, 20, 130, 120)
            e.Graphics.DrawLine(Pens.Black, 50, 50, 150, 40)
            '122,42
            Dim intersectionPoint As Point = getnode(New Point(120, 20), New Point(130, 120), New Point(50, 50), New Point(150, 40))
            intersectionPoint.Offset(-5, -2)
            e.Graphics.FillEllipse(Brushes.Red, New Rectangle(intersectionPoint, New Size(10, 10)))
        End Sub
    
        Public Function getnode(ByVal A As Point, ByVal B As Point, ByVal C As Point, ByVal D As Point) As Point
            Dim dy1 As Double = B.Y - A.Y
            Dim dx1 As Double = B.X - A.X
            Dim dy2 As Double = D.Y - C.Y
            Dim dx2 As Double = D.X - C.X
            Dim p As New Point
            'check whether the two line parallel
            If dy1 * dx2 = dy2 * dx1 Then
                MessageBox.Show("no point")
                'Return P with a specific data
            Else
                Dim x As Integer = CInt(((C.Y - A.Y) * dx1 * dx2 + dy1 * dx2 * A.X - dy2 * dx1 * C.X) / (dy1 * dx2 - dy2 * dx1))
                Dim y As Integer = CInt(A.Y + (dy1 / dx1) * (x - A.X))
                p = New Point(x, y)
                Return p
            End If
        End Function
    
    End Class

  2. #2
    Only Slightly Obsessive jemidiah's Avatar
    Join Date
    Apr 2002
    Posts
    2,431

    Re: intersection point slightly off

    It looks like rounding error is throwing the result off. At some point there's nothing that can be done, but at least the y-coordinate can be made a bit more accurate by not rounding x to an integer before computing y. Try...

    Code:
    ...
                Dim xd As Double= ((C.Y - A.Y) * dx1 * dx2 + dy1 * dx2 * A.X - dy2 * dx1 * C.X) / (dy1 * dx2 - dy2 * dx1)
                Dim x As Integer = CInt(xd)
                Dim y As Integer = CInt(A.Y + (dy1 / dx1) * (xd - A.X))
    ...
    The time you enjoy wasting is not wasted time.
    Bertrand Russell

    <- Remember to rate posts you find helpful.

  3. #3
    Hyperactive Member Lenggries's Avatar
    Join Date
    Sep 2009
    Posts
    353

    Re: intersection point slightly off

    Yeah... what Jemidiah said.

    But to go further, why are you mucking around with Integers at all? In your comments you linked to a forum post which gave you your getnode() function, and the only thing you changed was the types of the variables x and y from Double to Integer. Given that you are dealing with a Cartesian plane where almost all points are non-integers, introducing Integer datatypes is a recipe for rounding error. If at some point you need to map values to a integer-based screen coordinate system, you can do so at the presentation layer. As a general rule, though, you should avoid mixing integer and non-interger datatypes as much as possible.... they just don't mix very well.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  



Click Here to Expand Forum to Full Width