[SOLVED] Math: Shortest distance from point to line (EDITED)

Questions about the LÖVE API, installing LÖVE and other support related questions go here.
Forum rules
Before you make a thread asking for help, read this.
User avatar
XHH
Citizen
Posts: 85
Joined: Thu Jun 20, 2013 6:43 pm
Location: US
Contact:

[SOLVED] Math: Shortest distance from point to line (EDITED)

Post by XHH »

I have two line segments. All I have are the coordinates for these line segments. How can I find out if these two line segments intersect?
AlB0e.png
AlB0e.png (1.99 KiB) Viewed 392 times
Image
Last edited by XHH on Mon Jul 15, 2013 12:38 am, edited 2 times in total.
I like to draw and program :)
User avatar
raidho36
Party member
Posts: 2063
Joined: Mon Jun 17, 2013 12:00 pm

Re: [Help] Math-related: Do two line segments intersect?

Post by raidho36 »

User avatar
XHH
Citizen
Posts: 85
Joined: Thu Jun 20, 2013 6:43 pm
Location: US
Contact:

Re: [Help] Math-related: Do two line segments intersect?

Post by XHH »

Thank you sir! One more new question though. How do I find the shortest distance from a point to a line?
I like to draw and program :)
User avatar
micha
Inner party member
Posts: 1083
Joined: Wed Sep 26, 2012 5:13 pm

Re: [Help] Math: Shortest distance from point to line (EDITE

Post by micha »

Here is some code that determines the distance of a points from a (infinite) line. If you need the distance of a points from a line segment, it has to be modiefied.
The point is given as (px,py) the lines is given by two points (x1,y1) and (x2,y2)

Code: Select all

function distPointToLine(px,py,x1,y1,x2,y2)
  local dx,dy = x1-x2,y1-y2
  local length = math.sqrt(dx*dx+dy*dy)
  dx,dy = dx/length,dy/length
  return math.abs( dy*(px-x1) - dx*(py-y1))
end
Disclaimer: Untested.
This snippet calculates the unit vector pointing along the line (vector of length one). Then this vector is rotated by 90°, which is achieved by swapping x- and y-component and multiplying one with -1, that is (dx,dy) -> (dy,-dx). This is the normal vector for the line. To determine the distance, then the scalar product with any vector from the line to the point p is calculated.
If you leave away the math.abs, then you get a distance with sign. This is useful, if you want to determine if a point crossed the line in one frame (compare the sign of the distance before and after the frame, if the sign is different, the line has been crossed).
User avatar
XHH
Citizen
Posts: 85
Joined: Thu Jun 20, 2013 6:43 pm
Location: US
Contact:

Re: [Help] Math: Shortest distance from point to line (EDITE

Post by XHH »

micha wrote:If you need the distance of a points from a line segment, it has to be modiefied.
Can you post that too then?
(thanks)
I like to draw and program :)
User avatar
micha
Inner party member
Posts: 1083
Joined: Wed Sep 26, 2012 5:13 pm

Re: [Help] Math: Shortest distance from point to line (EDITE

Post by micha »

XHH wrote:Can you post that too then?
(thanks)
Sure. Disclaimer again: This is from the top of my head. Please test.

Code: Select all

function distPointToLine(px,py,x1,y1,x2,y2)
  local dx,dy = x2-x1,y2-y1
  local length = math.sqrt(dx*dx+dy*dy)
  dx,dy = dx/length,dy/length
  local posOnLine = dx*(px-x1) + dy*(px-y1)
  if posOnline < 0 then
    -- first end point is closest
    dx,dy = px-x1,py-y1
    return math.sqrt(dx*dx+dy*dy)
  elseif posOnLine > length then
    -- second end point is closest
    dx,dy = px-x2,py-y2
    return math.sqrt(dx*dx+dy*dy)    
  else
    -- point is closest to some part in the middle of the line
    return math.abs( dy*(px-x1) - dx*(py-y1))
  end
end
User avatar
XHH
Citizen
Posts: 85
Joined: Thu Jun 20, 2013 6:43 pm
Location: US
Contact:

Re: [Help] Math: Shortest distance from point to line (EDITE

Post by XHH »

Didn't completely work. Sometimes it gives me 1.0 as the distance.
I like to draw and program :)
User avatar
raidho36
Party member
Posts: 2063
Joined: Mon Jun 17, 2013 12:00 pm

Re: [Help] Math: Shortest distance from point to line (EDITE

Post by raidho36 »

User avatar
micha
Inner party member
Posts: 1083
Joined: Wed Sep 26, 2012 5:13 pm

Re: [Help] Math: Shortest distance from point to line (EDITE

Post by micha »

I found a typo. This one seems to work:

Code: Select all

function distPointToLine(px,py,x1,y1,x2,y2)
  local dx,dy = x2-x1,y2-y1
  local length = math.sqrt(dx*dx+dy*dy)
  dx,dy = dx/length,dy/length
  local posOnLine = dx*(px-x1) + dy*(py-y1)
  if posOnLine < 0 then
    -- first end point is closest
    dx,dy = px-x1,py-y1
    return math.sqrt(dx*dx+dy*dy)
  elseif posOnLine > length then
    -- second end point is closest
    dx,dy = px-x2,py-y2
    return math.sqrt(dx*dx+dy*dy)   
  else
    -- point is closest to some part in the middle of the line
    return math.abs( dy*(px-x1) - dx*(py-y1))
  end
end
User avatar
Ref
Party member
Posts: 702
Joined: Wed May 02, 2012 11:05 pm

Re: [Help] Math: Shortest distance from point to line (EDITE

Post by Ref »

Saw the typo and after correction seems to work for me.
Question:
Easy to find closest-point-on-line but pretty mess to get closest-point-on-line-segment.
Do you have a 'neat' way of doing this?
Attachments
closest_point.love
simple test
(976 Bytes) Downloaded 149 times
Post Reply

Who is online

Users browsing this forum: Ahrefs [Bot] and 39 guests