Code:
```'==============================================================================
' uses an algo found in VB Helper to determine whether two line segments intersect
' Chris Holbrook Sep 2009
'==============================================================================
#compile exe
#include "win32api.inc"
'-------------------------------------------------------------------------------
' THIS FUNCTION DOES IT ALL - the rest is just to show working!
' Return True if the segments intersect.
' parameters are x, y of one end of first line, x, y of other end of first line
'                x, y of one end of second line, x, y of other end of second line
function SegmentsIntersect( X1 as long,  Y1 as long, _
X2 as long,  Y2 as long, _
A1 as long,  B1 as long, _
A2 as long,  B2 as long) as long
local dx, dy, da, db as single ', t, s As Single
local s, t as single

dx = X2 - X1
dy = Y2 - Y1
da = A2 - A1
db = B2 - B1
if (da * dy - db * dx) = 0 then
' The segments are parallel.
SegmentsIntersect = %False
exit function
end if

s = (dx * (B1 - Y1) + dy * (X1 - A1)) / (da * dy - db * dx)
t = (da * (Y1 - B1) + db * (A1 - X1)) / (db * dx - da * dy)
if (s >= 0#) and (s <= 1#) and (t >= 0#) and (t <= 1#) then
function = %true
else
function = %false
end if

' If it exists, the point of intersection is:
' (x1 + t * dx, y1 + t * dy)
end function
'------------------------------------------------------------------------------
callback function CbMain
local     hDc                 as dword
local     PS                  as PAINTSTRUCT
local     lp                  as POINTAPI
static    start1x, start1y, end1x, end1y    as long
static    start2x, start2y, end2x, end2y    as long
'  LOCAL     ra, rb, rc, rd, rp, rq _
'                                AS SINGLE
local     sz                  as asciz * 64
local     rtext               as rect
local     lresult             as long
'  LOCAL     lx, ly              AS SINGLE 'closest point coordinates

select case cbmsg
case %wm_initdialog

case %wm_paint
hDc = BeginPaint(cbhndl, PS)
gosub paintdlg
EndPaint cbhndl, PS

case %WM_ERASEBKGND

case %wm_lbuttondown
GetCursorPos lp
ScreenToClient cbhndl, lp
start1x = lp.x
start1y = lp.y

case %wm_rbuttondown
GetCursorPos lp
ScreenToClient cbhndl, lp
start2x = lp.x
start2y = lp.y

case %wm_mousemove
select case cb.wparam
'
case %MK_LBUTTON
GetCursorPos lp
ScreenToClient cbhndl, lp
end1x = lp.x
end1y = lp.y
InvalidateRect cbhndl, byval 0, byval %TRUE
UpdateWindow cbhndl
'
case %MK_RBUTTON
GetCursorPos lp
ScreenToClient cbhndl, lp
end2x = lp.x
end2y = lp.y
InvalidateRect cbhndl, byval 0, byval %TRUE
UpdateWindow cbhndl
end select
end select
exit function
''''''''''''''''''''
paintdlg:
sz = "1. draw first line using mouse with L button down"
rText.ntop = 20: rtext.nleft = 10: rtext.nright = 350: rtext.nbottom = 36
drawtext (hdc, byval varptr(sz),len(sz), rtext, %DT_LEFT) to lresult
sz = "2. draw second line using mouse with R button down"
rText.ntop = 38: rtext.nleft = 10: rtext.nright = 350: rtext.nbottom = 52
drawtext (hdc, byval varptr(sz),len(sz), rtext, %DT_LEFT) to lresult
MoveTo hdc, start1x, start1y
LineTo hdc, end1x, end1y
if start2x + start2y = 0 then return
MoveTo hdc, start2x, start2y
LineTo hdc, end2x, end2y
lresult = segmentsintersect(start1x, start1y, end1x, end1y, start2x,start2y,end2x,end2y)
if lresult = %true then
sz = "true"
else
sz = "false"
end if
rText.ntop = end2y: rtext.nleft = end2x + 12: rtext.nright = end2x + 112: rtext.nbottom = end2y + 20
drawtext (hdc, byval varptr(sz),len(sz), rtext, %DT_LEFT) to lresult
return
end function
'===============================================================
function pbmain as long
local hDlg as long
dialog new 0,"Lines intersect",,,300,300,%ws_sysmenu  to hDlg
dialog show modal hDlg call CbMain
end function```