Find the intersection of two lines: Difference between revisions

Added Easylang
No edit summary
(Added Easylang)
 
(81 intermediate revisions by 40 users not shown)
Line 12:
<br><br>
 
=={{header|Ada11l}}==
{{trans|Python}}
 
<syntaxhighlight lang="11l">F line_intersect(Ax1, Ay1, Ax2, Ay2, Bx1, By1, Bx2, By2)
V d = (By2 - By1) * (Ax2 - Ax1) - (Bx2 - Bx1) * (Ay2 - Ay1)
I d == 0
R (Float.infinity, Float.infinity)
 
V uA = ((Bx2 - Bx1) * (Ay1 - By1) - (By2 - By1) * (Ax1 - Bx1)) / d
V uB = ((Ax2 - Ax1) * (Ay1 - By1) - (Ay2 - Ay1) * (Ax1 - Bx1)) / d
 
I !(uA C 0.0..1.0 & uB C 0.0..1.0)
R (Float.infinity, Float.infinity)
V x = Ax1 + uA * (Ax2 - Ax1)
V y = Ay1 + uA * (Ay2 - Ay1)
 
R (x, y)
 
V (a, b, c, d) = (4.0, 0.0, 6.0, 10.0)
V (e, f, g, h) = (0.0, 3.0, 10.0, 7.0)
V pt = line_intersect(a, b, c, d, e, f, g, h)
print(pt)</syntaxhighlight>
 
{{out}}
<pre>
(5, 5)
</pre>
 
=={{header|360 Assembly}}==
{{trans|Rexx}}
<syntaxhighlight lang="360asm">* Intersection of two lines 01/03/2019
INTERSEC CSECT
USING INTERSEC,R13 base register
B 72(R15) skip savearea
DC 17F'0' savearea
SAVE (14,12) save previous context
ST R13,4(R15) link backward
ST R15,8(R13) link forward
LR R13,R15 set addressability
LE F0,XA xa
IF CE,F0,EQ,XB THEN if xa=xb then
STE F0,X1 x1=xa
LE F0,YA
IF CE,F0,EQ,YB THEN if ya=yb then
MVI MSG,C'=' msg='='
ENDIF , endif
ELSE , else
MVI FK1,X'01' fk1=true
LE F0,YB
SE F0,YA yb-ya
LE F2,XB
SE F2,XA xb-xa
DER F0,F2 /
STE F0,K1 k1=(yb-ya)/(xb-xa)
ME F0,XA k1*xa
LE F2,YA ya
SER F2,F0 -
STE F2,D1 d1=ya-k1*xa
ENDIF , endif
LE F0,XC
IF CE,F0,EQ,XD THEN if xc=xd then
STE F0,X2 x2=xc
LE F4,YC yc
IF CE,F4,EQ,YD THEN if yc=yd then
MVI MSG,C'=' msg='='
ENDIF , endif
ELSE , else
MVI FK2,X'01' fk2=true
LE F0,YD
SE F0,YC yd-yc
LE F2,XD
SE F2,XC xd-xc
DER F0,F2 /
STE F0,K2 k2=(yd-yc)/(xd-xc)
ME F0,XC k2*xc
LE F2,YC yc
SER F2,F0 -
STE F2,D2 d2=yc-k2*xc
ENDIF , endif
IF CLI,MSG,EQ,C' ' THEN if msg=' ' then
IF CLI,FK1,EQ,X'00' THEN if not fk1 then
IF CLI,FK2,EQ,X'00' THEN if not fk2 then
LE F4,X1
IF CE,F4,EQ,X2 if x1=x2 then
MVI MSG,C'=' msg='='
ELSE , else
MVI MSG,C'/' msg='/'
ENDIF , endif
ELSE , else
LE F0,X1
STE F0,X x=x1
LE F0,K2 k2
ME F0,X *x
AE F0,D2 +d2
STE F0,Y y=k2*x+d2
ENDIF , endif
ELSE , else
IF CLI,FK2,EQ,X'00' THEN if not fk2 then
LE F0,X2
STE F0,X x=x2
LE F0,K1 k1
ME F0,X *x
AE F0,D1 +d1
STE F0,Y y=k1*x+d1
ELSE , else
LE F4,K1
IF CE,F4,EQ,K2 THEN if k1=k2 then
LE F4,D1
IF CE,F4,EQ,D2 THEN if d1=d2 then
MVI MSG,C'=' msg='=';
ELSE , else
MVI MSG,C'/' msg='/';
ENDIF , endif
ELSE , else
LE F0,D2 d2
SE F0,D1 -d1
LE F2,K1 k1
SE F2,K2 -k2
DER F0,F2 /
STE F0,X x=(d2-d1)/(k1-k2)
LE F0,K1 k1
ME F0,X *x
AE F0,D1 +d1
STE F0,Y y=k1*x+d1
ENDIF , endif
ENDIF , endif
ENDIF , endif
ENDIF , endif
IF CLI,MSG,EQ,C' ' THEN if msg=' ' then
LE F0,X x
LA R0,3 decimal=3
BAL R14,FORMATF format x
MVC PG+0(13),0(R1) output x
LE F0,Y y
LA R0,3 decimal=3
BAL R14,FORMATF format y
MVC PG+13(13),0(R1) output y
ENDIF , endif
MVC PG+28(1),MSG output msg
XPRNT PG,L'PG print buffer
L R13,4(0,R13) restore previous savearea pointer
RETURN (14,12),RC=0 restore registers from calling sav
COPY plig\$_FORMATF.MLC
XA DC E'4.0' point A
YA DC E'0.0'
XB DC E'6.0' point B
YB DC E'10.0'
XC DC E'0.0' point C
YC DC E'3.0'
XD DC E'10.0' point D
YD DC E'7.0'
X DS E
Y DS E
X1 DS E
X2 DS E
K1 DS E
K2 DS E
D1 DS E
D2 DS E
FK1 DC X'00'
FK2 DC X'00'
MSG DC C' '
PG DC CL80' '
REGEQU
END INTERSEC</syntaxhighlight>
{{out}}
<pre>
5.000 5.000
</pre>
 
=={{header|Action!}}==
{{libheader|Action! Tool Kit}}
<syntaxhighlight lang="action!">INCLUDE "D2:REAL.ACT" ;from the Action! Tool Kit
 
DEFINE REALPTR="CARD"
TYPE PointR=[REALPTR x,y]
 
PROC Det(REAL POINTER x1,y1,x2,y2,res)
REAL tmp1,tmp2
 
RealMult(x1,y2,tmp1)
RealMult(y1,x2,tmp2)
RealSub(tmp1,tmp2,res)
RETURN
 
BYTE FUNC IsZero(REAL POINTER a)
CHAR ARRAY s(10)
 
StrR(a,s)
IF s(0)=1 AND s(1)='0 THEN
RETURN (1)
FI
RETURN (0)
 
BYTE FUNC Intersection(PointR POINTER p1,p2,p3,p4,res)
REAL det1,det2,dx1,dx2,dy1,dy2,nom,denom
 
Det(p1.x,p1.y,p2.x,p2.y,det1)
Det(p3.x,p3.y,p4.x,p4.y,det2)
RealSub(p1.x,p2.x,dx1)
RealSub(p1.y,p2.y,dy1)
RealSub(p3.x,p4.x,dx2)
RealSub(p3.y,p4.y,dy2)
Det(dx1,dy1,dx2,dy2,denom)
IF IsZero(denom) THEN
RETURN (0)
FI
Det(det1,dx1,det2,dx2,nom)
RealDiv(nom,denom,res.x)
Det(det1,dy1,det2,dy2,nom)
RealDiv(nom,denom,res.y)
RETURN (1)
 
PROC PrintPoint(PointR POINTER p)
Print("(") PrintR(p.x)
Print(",") PrintR(p.y)
Print(")")
RETURN
 
PROC PrintLine(PointR POINTER p1,p2)
PrintPoint(p1)
Print(" and ")
PrintPoint(p2)
RETURN
 
PROC Test(PointR POINTER p1,p2,p3,p4)
BYTE res
REAL px,py
PointR p
 
p.x=px p.y=py
Print("Line 1 points: ")
PrintLine(p1,p2) PutE()
Print("Line 2 points: ")
PrintLine(p3,p4) PutE()
 
res=Intersection(p1,p2,p3,p4,p)
IF res THEN
Print("Intersection point: ")
PrintPoint(p) PutE()
ELSE
PrintE("There is no intersection")
FI
PutE()
RETURN
 
PROC Main()
REAL x1,y1,x2,y2,x3,y3,x4,y4,px,py
PointR p1,p2,p3,p4
 
Put(125) PutE() ;clear screen
 
p1.x=x1 p1.y=y1
p2.x=x2 p2.y=y2
p3.x=x3 p3.y=y3
p4.x=x4 p4.y=y4
 
IntToReal(4,x1) IntToReal(0,y1)
IntToReal(6,x2) IntToReal(10,y2)
IntToReal(0,x3) IntToReal(3,y3)
IntToReal(10,x4) IntToReal(7,y4)
Test(p1,p2,p3,p4)
 
IntToReal(0,x1) IntToReal(0,y1)
IntToReal(1,x2) IntToReal(1,y2)
IntToReal(1,x3) IntToReal(2,y3)
IntToReal(4,x4) IntToReal(5,y4)
Test(p1,p2,p3,p4)
RETURN</syntaxhighlight>
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Find_the_intersection_of_two_lines.png Screenshot from Atari 8-bit computer]
<pre>
Line 1 points: (4,0) and (6,10)
Line 2 points: (0,3) and (10,7)
Intersection point: (5,5)
 
Line 1 points: (0,0) and (1,1)
Line 2 points: (1,2) and (4,5)
There is no intersection
</pre>
 
=={{header|Ada}}==
{{works with|Ada|Ada|2005}}
 
<langsyntaxhighlight Adalang="ada">with Ada.Text_IO;
 
procedure Intersection_Of_Two_Lines
Line 60 ⟶ 342:
Ada.Text_IO.Put_Line(p.y'Img);
end Intersection_Of_Two_Lines;
</syntaxhighlight>
</lang>
{{out}}
<pre> 5.00000E+00 5.00000E+00
Line 67 ⟶ 349:
=={{header|ALGOL 68}}==
Using "school maths".
<langsyntaxhighlight lang="algol68">BEGIN
# mode to hold a point #
MODE POINT = STRUCT( REAL x, y );
Line 96 ⟶ 378:
print( ( fixed( x OF i, -8, 4 ), fixed( y OF i, -8, 4 ), newline ) )
 
END</langsyntaxhighlight>
{{out}}
<pre>
5.0000 5.0000
</pre>
=={{header|APL}}==
<syntaxhighlight lang="apl">
⍝ APL has a powerful operator the « dyadic domino » to solve a system of N linear equations with N unknowns
⍝ We use it first to solve the a and b, defining the 2 lines as y = ax + b, with the x and y of the given points
⍝ The system of equations for first line will be:
⍝ 0 = 4a + b
⍝ 10 = 6a + b
⍝ The two arguments to be passed to the dyadic domino are:
⍝ The (0, 10) vector as the left argument
⍝ The ( 4 1 ) matrix as the right argument.
⍝ ( 6 1 )
⍝ We will define a solver that will take the matrix of coordinates, one point per row, then massage the argument to extract x,y
⍝ and inject 1, where needed, and return a pair (a, b) of resolved unknowns.
⍝ Applied twice, we will have a, b and a', b' defining the two lines, we need to resolve it in x and y, in order to determine
⍝ their intersection
⍝ y = ax + b
⍝ y = a'x + b'
⍝ In order to reuse the same solver, we need to format a little bit the arguments, and change the sign of a and a', therefore
⍝ multiply (a,b) and (a', b') by (-1, 1):
⍝ b = -ax + y
⍝ b' = -a'x + y
A ← 4 0
B ← 6 10
C ← 0 3
D ← 10 7
solver ← {(,2 ¯1↑⍵)⌹(2 1↑⍵),1}
I ← solver 2 2⍴((¯1 1)×solver 2 2⍴A,B),(¯1 1)×solver 2 2⍴C,D
</syntaxhighlight>
{{out}}
<pre>
I
5 5
</pre>
 
=={{header|Arturo}}==
{{trans|Go}}
<syntaxhighlight lang="rebol">define :point [x,y][]
define :line [a, b][
init: [
this\slope: div this\b\y-this\a\y this\b\x-this\a\x
this\yInt: this\a\y - this\slope*this\a\x
]
]
 
evalX: function [line, x][
line\yInt + line\slope * x
]
 
intersect: function [line1, line2][
x: div line2\yInt-line1\yInt line1\slope-line2\slope
y: evalX line1 x
 
to :point @[x y]
]
 
l1: to :line @[to :point [4.0 0.0] to :point [6.0 10.0]]
l2: to :line @[to :point [0.0 3.0] to :point [10.0 7.0]]
 
print intersect l1 l2</syntaxhighlight>
 
{{out}}
 
<pre>[x:5.0 y:5.0]</pre>
 
=={{header|AutoHotkey}}==
<syntaxhighlight lang="autohotkey">LineIntersectionByPoints(L1, L2){
x1 := L1[1,1], y1 := L1[1,2]
x2 := L1[2,1], y2 := L1[2,2]
x3 := L2[1,1], y3 := L2[1,2]
x4 := L2[2,1], y4 := L2[2,2]
return ((x1*y2-y1*x2)*(x3-x4) - (x1-x2)*(x3*y4-y3*x4)) / ((x1-x2)*(y3-y4) - (y1-y2)*(x3-x4)) ", "
. ((x1*y2-y1*x2)*(y3-y4) - (y1-y2)*(x3*y4-y3*x4)) / ((x1-x2)*(y3-y4) - (y1-y2)*(x3-x4))
}</syntaxhighlight>
Examples:<syntaxhighlight lang="autohotkey">L1 := [[4,0], [6,10]]
L2 := [[0,3], [10,7]]
MsgBox % LineIntersectionByPoints(L1, L2)</syntaxhighlight>
Outputs:<pre>5.000000, 5.000000</pre>
 
=={{header|AWK}}==
<syntaxhighlight lang="awk">
<lang AWK>
# syntax: GAWK -f FIND_THE_INTERSECTION_OF_TWO_LINES.AWK
# converted from Ring
Line 129 ⟶ 489:
return(1)
}
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 144 ⟶ 504:
 
=={{header|BASIC}}==
==={{header|Applesoft BASIC}}===
<syntaxhighlight lang="gwbasic"> 0 A = 1:B = 2: HOME : VTAB 21: HGR : HCOLOR= 3: FOR L = A TO B: READ X1(L),Y1(L),X2(L),Y2(L): HPLOT X1(L),Y1(L) TO X2(L),Y2(L): NEXT : DATA4,0,6,10,0,3,10,7
1 GOSUB 5: IF NAN THEN PRINT "THE LINES DO NOT INTERSECT, THEY ARE EITHER PARALLEL OR CO-INCIDENT."
2 IF NOT NAN THEN PRINT "POINT OF INTERSECTION : "X" "Y
3 PRINT CHR$ (13)"HIT ANY KEY TO END PROGRAM": IF NOT NAN THEN FOR K = 0 TO 1 STEP 0:C = C = 0: HCOLOR= 3 * C: HPLOT X,Y: FOR I = 1 TO 30:K = PEEK (49152) > 127: NEXT I,K
4 GET K$: TEXT : END
5 FOR L = A TO B:S$(L) = "NAN": IF X1(L) < > X2(L) THEN S(L) = (Y1(L) - Y2(L)) / (X1(L) - X2(L)):S$(L) = STR$ (S(L))
6 NEXT L:NAN = S$(A) = S$(B): IF NAN THEN RETURN
7 IF S$(A) = "NAN" AND S$(B) < > "NAN" THEN X = X1(A):Y = (X1(A) - X1(B)) * S(B) + Y1(B): RETURN
8 IF S$(B) = "NAN" AND S$(A) < > "NAN" THEN X = X1(B):Y = (X1(B) - X1(A)) * S(A) + Y1(A): RETURN
9 X = (S(A) * X1(A) - S(B) * X1(B) + Y1(B) - Y1(A)) / (S(A) - S(B)):Y = S(B) * (X - X1(B)) + Y1(B): RETURN</syntaxhighlight>
==={{header|QBasic}}===
{{works with|QBasic|1.1}}
{{works with|QuickBasic|4.5}}
{{works with|BASIC256}}
{{works with|Just BASIC}}
{{works with|Run BASIC}}
<syntaxhighlight lang="qbasic">xa = 4: xb = 6: xc = 0: xd = 10
ya = 0: yb = 10: yc = 3: yd = 7
PRINT "The two lines are:"
PRINT "yab ="; (ya - xa * ((yb - ya) / (xb - xa))); "+ x*"; ((yb - ya) / (xb - xa))
PRINT "ycd ="; (yc - xc * ((yd - yc) / (xd - xc))); "+ x*"; ((yd - yc) / (xd - xc))
x = ((yc - xc * ((yd - yc) / (xd - xc))) - (ya - xa * ((yb - ya) / (xb - xa)))) / (((yb - ya) / (xb - xa)) - ((yd - yc) / (xd - xc)))
PRINT "x ="; x
y = ya - xa * ((yb - ya) / (xb - xa)) + x * ((yb - ya) / (xb - xa))
PRINT "yab ="; y
PRINT "ycd ="; (yc - xc * ((yd - yc) / (xd - xc)) + x * ((yd - yc) / (xd - xc)))
PRINT "intersection: ("; x; ","; y; ")"</syntaxhighlight>
{{out}}
<pre>The two lines are:
yab =-20 + x* 5
ycd = 3 + x* 0.4
x = 5
yab = 5
ycd = 5
intersection: ( 5, 5 )</pre>
 
==={{header|BASIC256}}===
{{works with|QBasic}}
{{works with|Just BASIC}}
{{works with|Run BASIC}}
<syntaxhighlight lang="freebasic">xa = 4 : xb = 6 : xc = 0 : xd = 10
ya = 0 : yb = 10 : yc = 3 : yd = 7
print "The two lines are:"
print "yab = "; (ya-xa*((yb-ya)/(xb-xa))); " + x*"; ((yb-ya)/(xb-xa))
print "ycd = "; (yc-xc*((yd-yc)/(xd-xc))); " + x*"; ((yd-yc)/(xd-xc))
x = ((yc-xc*((yd-yc)/(xd-xc)))-(ya-xa*((yb-ya)/(xb-xa))))/(((yb-ya)/(xb-xa))-((yd-yc)/(xd-xc)))
print "x = "; x
y = ya-xa*((yb-ya)/(xb-xa))+x*((yb-ya)/(xb-xa))
print "yab = "; y
print "ycd = "; (yc-xc*((yd-yc)/(xd-xc))+x*((yd-yc)/(xd-xc)))
print "intersection: ("; x; ", "; y ; ")"</syntaxhighlight>
 
==={{header|Craft Basic}}===
<syntaxhighlight lang="basic">define xa = 4, xb = 6, xc = 0, xd = 10
define ya = 0, yb = 10, yc = 3, yd = 7
 
print "The two lines are:"
print "yab = ", (ya - xa * ((yb - ya) / (xb - xa))), " + x * ", ((yb - ya) / (xb - xa))
print "ycd = ", (yc - xc * ((yd - yc) / (xd - xc))), " + x * ", ((yd - yc) / (xd - xc))
let x = ((yc - xc * ((yd - yc) / (xd - xc))) - (ya - xa * ((yb - ya) / (xb - xa)))) / (((yb - ya) / (xb - xa)) - ((yd - yc) / (xd - xc)))
print "x = ", x
let y = ya - xa * ((yb - ya) / (xb - xa)) + x * ((yb - ya) / (xb - xa))
print "yab = ", y
print "ycd = ", (yc - xc * ((yd - yc) / (xd - xc)) + x * ((yd - yc) / (xd - xc)))
print "intersection: (", x, comma, " ", y, ")"</syntaxhighlight>
{{out| Output}}<pre>The two lines are:
yab = -20 + x * 5
ycd = 3 + x * 0.4000
x = 5
yab = 5
ycd = 5
intersection: (5, 5)</pre>
 
==={{header|Run BASIC}}===
{{works with|Just BASIC}}
{{works with|Liberty BASIC}}
{{works with|QBasic}}
<syntaxhighlight lang="lb">xa = 4: xb = 6: xc = 0: xd = 10
ya = 0: yb = 10: yc = 3: yd = 7
print "The two lines are:"
print "yab = "; (ya - xa * ((yb - ya) / (xb - xa))); "+ x*"; ((yb - ya) / (xb - xa))
print "ycd = "; (yc - xc * ((yd - yc) / (xd - xc))); "+ x*"; ((yd - yc) / (xd - xc))
x = ((yc - xc * ((yd - yc) / (xd - xc))) - (ya - xa * ((yb - ya) / (xb - xa)))) / (((yb - ya) / (xb - xa)) - ((yd - yc) / (xd - xc)))
print "x = "; x
y = ya - xa * ((yb - ya) / (xb - xa)) + x * ((yb - ya) / (xb - xa))
print "yab = "; y
print "ycd = "; (yc - xc * ((yd - yc) / (xd - xc)) + x * ((yd - yc) / (xd - xc)))
print "intersection: ("; x; ","; y; " )"</syntaxhighlight>
 
==={{header|Sinclair ZX81 BASIC}}===
{{trans|REXX}} (version 1)
Works with 1k of RAM.
<langsyntaxhighlight lang="basic"> 10 LET XA=4
20 LET YA=0
30 LET XB=6
Line 163 ⟶ 613:
150 PRINT "YAB=";Y
160 PRINT "YCD=";YC-XC*((YD-YC)/(XD-XC))+X*((YD-YC)/(XD-XC))
170 PRINT "INTERSECTION: ";X;",";Y</langsyntaxhighlight>
{{out}}
<pre>THE TWO LINES ARE:
Line 172 ⟶ 622:
YCD=5
INTERSECTION: 5,5</pre>
 
==={{header|True BASIC}}===
{{works with|QBasic}}
{{works with|BASIC256}}
{{works with|Just BASIC}}
{{works with|Run BASIC}}
<syntaxhighlight lang="qbasic">LET xa = 4
LET ya = 0
LET xb = 6
LET yb = 10
LET xc = 0
LET yc = 3
LET xd = 10
LET yd = 7
PRINT "The two lines are:"
PRINT "yab ="; (ya-xa*((yb-ya)/(xb-xa))); " + x*"; ((yb-ya)/(xb-xa))
PRINT "ycd ="; (yc-xc*((yd-yc)/(xd-xc))); " + x*"; ((yd-yc)/(xd-xc))
LET x = ((yc-xc*((yd-yc)/(xd-xc)))-(ya-xa*((yb-ya)/(xb-xa))))/(((yb-ya)/(xb-xa))-((yd-yc)/(xd-xc)))
PRINT "x ="; x
LET y = ya-xa*((yb-ya)/(xb-xa))+x*((yb-ya)/(xb-xa))
PRINT "yab ="; y
PRINT "ycd ="; (yc-xc*((yd-yc)/(xd-xc))+x*((yd-yc)/(xd-xc)))
PRINT "intersection: ("; x; ","; y ; " )"
END</syntaxhighlight>
 
==={{header|Yabasic}}===
<syntaxhighlight lang="freebasic">xa = 4: xb = 6: xc = 0: xd = 10
ya = 0: yb = 10: yc = 3: yd = 7
print "The two lines are:"
print "yab = ", (ya - xa * ((yb - ya) / (xb - xa))), " + x*", ((yb - ya) / (xb - xa))
print "ycd = ", (yc - xc * ((yd - yc) / (xd - xc))), " + x*", ((yd - yc) / (xd - xc))
x = ((yc - xc * ((yd - yc) / (xd - xc))) - (ya - xa * ((yb - ya) / (xb - xa)))) / (((yb - ya) / (xb - xa)) - ((yd - yc) / (xd - xc)))
print "x = ", x
y = ya - xa * ((yb - ya) / (xb - xa)) + x * ((yb - ya) / (xb - xa))
print "yab = ", y
print "ycd = ", (yc - xc * ((yd - yc) / (xd - xc)) + x * ((yd - yc) / (xd - xc)))
print "intersection: (", x, ", ", y, ")"</syntaxhighlight>
 
=={{header|C}}==
This implementation is generic and considers any two lines in the XY plane and not just the specified example. Usage is printed on incorrect invocation.
<syntaxhighlight lang="c">
<lang C>
#include<stdlib.h>
#include<stdio.h>
Line 233 ⟶ 720:
c.y = NAN;
}
else if(isnan(slopeA==NAN) && slopeB!=NANisnan(slopeB)){
c.x = a1.x;
c.y = (a1.x-b1.x)*slopeB + b1.y;
}
else if(isnan(slopeB==NAN) && slopeA!=NANisnan(slopeA)){
c.x = b1.x;
c.y = (b1.x-a1.x)*slopeA + b1a1.y;
}
else{
Line 258 ⟶ 745:
c = intersectionPoint(extractPoint(argV[1]),extractPoint(argV[2]),extractPoint(argV[3]),extractPoint(argV[4]));
if(isnan(c.x==NAN))
printf("The lines do not intersect, they are either parallel or co-incident.");
else
Line 266 ⟶ 753:
return 0;
}
</syntaxhighlight>
</lang>
Invocation and output:
<pre>
Line 273 ⟶ 760:
</pre>
 
=={{header|C sharp|C#}}==
<langsyntaxhighlight lang="csharp">using System;
using System.Drawing;
public class Program
Line 298 ⟶ 785:
Console.WriteLine(FindIntersection(p(0f, 0f), p(1f, 1f), p(1f, 2f), p(4f, 5f)));
}
}</langsyntaxhighlight>
{{out}}
<pre>
Line 307 ⟶ 794:
=={{header|C++}}==
 
<langsyntaxhighlight lang="cpp">#include <iostream>
#include <cmath>
#include <assert.hcassert>
using namespace std;
 
Line 321 ⟶ 808:
}
 
/// Calculate intersection of two lines.
///\return true if found, false if not found or error
bool LineLineIntersect(double x1, double y1, // Line 1 start
double x2, double y2, // Line 1 end
double x3, double y3, // Line 2 start
double x4, double y4, // Line 2 end
double &ixOut, double &iyOut) // Output
{
double detL1 = Det(x1, y1, x2, y2);
Line 336 ⟶ 823:
double y3my4 = y3 - y4;
 
double xnom = Det(detL1, x1mx2, detL2, x3mx4);
double ynom = Det(detL1, y1my2, detL2, y3my4);
double denom = Det(x1mx2, y1my2, x3mx4, y3my4);
if(denom == 0.0) // Lines don't seem to cross
{
ixOut = NAN;
Line 346 ⟶ 831:
}
 
double xnom = Det(detL1, x1mx2, detL2, x3mx4);
double ynom = Det(detL1, y1my2, detL2, y3my4);
ixOut = xnom / denom;
iyOut = ynom / denom;
if(!isfinite(ixOut) || !isfinite(iyOut)) // Probably a numerical issue
return false;
 
Line 358 ⟶ 845:
// **Simple crossing diagonal lines**
 
// Line 1
double x1=4.0, y1=0.0;
double x2=6.0, y2=10.0;
// Line 2
double x3=0.0, y3=3.0;
double x4=10.0, y4=7.0;
Line 374 ⟶ 861:
assert(fabs(ix - 5.0) < eps);
assert(fabs(iy - 5.0) < eps);
return 0;
 
}</langsyntaxhighlight>
 
{{out}}
<pre>result 1,5,5</pre>
 
=={{header|Clojure}}==
<syntaxhighlight lang="clojure">;; Point is [x y] tuple
(defn compute-line [pt1 pt2]
(let [[x1 y1] pt1
[x2 y2] pt2
m (/ (- y2 y1) (- x2 x1))]
{:slope m
:offset (- y1 (* m x1))}))
 
(defn intercept [line1 line2]
(let [x (/ (- (:offset line1) (:offset line2))
(- (:slope line2) (:slope line1)))]
{:x x
:y (+ (* (:slope line1) x)
(:offset line1))}))</syntaxhighlight>
 
{{out}}
<pre>
(def line1 (compute-line [4 0] [6 10]))
(def line2 (compute-line [0 3] [10 7]))
line1 ; {:slope 5, :offset -20}
line2 ; {:slope 2/5, :offset 3}
 
(intercept line1 line2) ; {:x 5, :y 5}
</pre>
 
=={{header|Common Lisp}}==
<syntaxhighlight lang="lisp">
;; Point is [x y] tuple
(defun point-of-intersection (x1 y1 x2 y2 x3 y3 x4 y4)
"Find the point of intersection of the lines defined by the points (x1 y1) (x2 y2) and (x3 y3) (x4 y4)"
(let* ((dx1 (- x2 x1))
(dx2 (- x4 x3))
(dy1 (- y2 y1))
(dy2 (- y4 y3))
(den (- (* dy1 dx2) (* dy2 dx1))) )
(unless (zerop den)
(list (/ (+ (* (- y3 y1) dx1 dx2) (* x1 dy1 dx2) (* -1 x3 dy2 dx1)) den)
(/ (+ (* (+ x3 x1) dy1 dy2) (* -1 y1 dx1 dy2) (* y3 dx2 dy1)) den) ))))
</syntaxhighlight>
{{out}}
<pre>
(point-of-intersection 4 0 6 10 0 3 10 7) => (5 5)
</pre>
 
 
=={{header|D}}==
{{trans|Kotlin}}
<langsyntaxhighlight Dlang="d">import std.stdio;
 
struct Point {
Line 422 ⟶ 955:
l2 = Line(Point(1.0, 2.0), Point(4.0, 5.0));
writeln(findIntersection(l1, l2));
}</langsyntaxhighlight>
 
{{out}}
<pre>{5.000000, 5.000000}
{-inf, -inf}</pre>
 
=={{header|Delphi}}==
{{works with|Delphi|6.0}}
{{libheader|SysUtils,StdCtrls}}
This subroutine not only finds the intersection, it test for various degenerate condition where the intersection can fail.
 
<syntaxhighlight lang="Delphi">
{Vector structs and operations - these would normally be in}
{a library, but are produced here so everything is explicit}
 
type T2DVector=packed record
X,Y: double;
end;
 
type T2DLine = packed record
P1,P2: T2DVector;
end;
 
 
function MakeVector2D(const X,Y: double): T2DVector;
begin
Result.X:=X;
Result.Y:=Y;
end;
 
function MakeLine2D(X1,Y1,X2,Y2: double): T2DLine;
begin
Result.P1:=MakeVector2D(X1,Y1);
Result.P2:=MakeVector2D(X2,Y2);
end;
 
 
function DoLinesIntersect2D(L1,L2: T2DLine; var Point: T2DVector): boolean;
{Finds intersect point only if the lines actually intersect}
var distAB, theCos, theSin, newX, ABpos: double;
begin
Result:=False;
{ Fail if either line segment is zero-length.}
if (L1.P1.X=L1.P2.X) and (L1.P1.Y=L1.P2.Y) or
(L2.P1.X=L2.P2.X) and (L2.P1.Y=L2.P2.Y) then exit;
 
{ Fail if the segments share an end-point.}
if (L1.P1.X=L2.P1.X) and (L1.P1.Y=L2.P1.Y) or
(L1.P2.X=L2.P1.X) and (L1.P2.Y=L2.P1.Y) or
(L1.P1.X=L2.P2.X) and (L1.P1.Y=L2.P2.Y) or
(L1.P2.X=L2.P2.X) and (L1.P2.Y=L2.P2.Y) then exit;
 
{ (1) Translate the system so that point A is on the origin.}
L1.P2.X:=L1.P2.X-L1.P1.X; L1.P2.Y:=L1.P2.Y-L1.P1.Y;
L2.P1.X:=L2.P1.X-L1.P1.X; L2.P1.Y:=L2.P1.Y-L1.P1.Y;
L2.P2.X:=L2.P2.X-L1.P1.X; L2.P2.Y:=L2.P2.Y-L1.P1.Y;
 
{ Discover the length of segment A-B.}
distAB:=sqrt(L1.P2.X*L1.P2.X+L1.P2.Y*L1.P2.Y);
 
{ (2) Rotate the system so that point B is on the positive X L1.P1.Xis.}
theCos:=L1.P2.X/distAB;
theSin:=L1.P2.Y/distAB;
newX:=L2.P1.X*theCos+L2.P1.Y*theSin;
L2.P1.Y :=L2.P1.Y*theCos-L2.P1.X*theSin; L2.P1.X:=newX;
newX:=L2.P2.X*theCos+L2.P2.Y*theSin;
L2.P2.Y :=L2.P2.Y*theCos-L2.P2.X*theSin; L2.P2.X:=newX;
 
{ Fail if segment C-D doesn't cross line A-B.}
if (L2.P1.Y<0) and (L2.P2.Y<0) or (L2.P1.Y>=0) and (L2.P2.Y>=0) then exit;
 
{ (3) Discover the position of the intersection point along line A-B.}
ABpos:=L2.P2.X+(L2.P1.X-L2.P2.X)*L2.P2.Y/(L2.P2.Y-L2.P1.Y);
 
{ Fail if segment C-D crosses line A-B outside of segment A-B.}
if (ABpos<0) or (ABpos>distAB) then exit;
 
{ (4) Apply the discovered position to line A-B in the original coordinate system.}
Point.X:=L1.P1.X+ABpos*theCos;
Point.Y:=L1.P1.Y+ABpos*theSin;
Result:=True;
end;
 
procedure TestIntersect(Memo: TMemo; L1,L2: T2DLine);
var Int: T2DVector;
var S: string;
begin
Memo.Lines.Add('Line-1: '+Format('(%1.0f,%1.0f)->(%1.0f,%1.0f)',[L1.P1.X,L1.P1.Y,L1.P2.X,L1.P2.Y]));
Memo.Lines.Add('Line-2: '+Format('(%1.0f,%1.0f)->(%1.0f,%1.0f)',[L2.P1.X,L2.P1.Y,L2.P2.X,L2.P2.Y]));
if DoLinesIntersect2D(L1,L2,Int) then Memo.Lines.Add(Format('Intersect = %2.1f %2.1f',[Int.X,Int.Y]))
else Memo.Lines.Add('No Intersect.');
end;
 
procedure TestLineIntersect(Memo: TMemo);
var L1,L2: T2DLine;
var S: string;
begin
L1:=MakeLine2D(4,0,6,10);
L2:=MakeLine2D(0,3,10,7);
TestIntersect(Memo,L1,L2);
Memo.Lines.Add('');
L1:=MakeLine2D(0,0,1,1);
L2:=MakeLine2D(1,2,4,5);
TestIntersect(Memo,L1,L2);
end;
 
 
</syntaxhighlight>
{{out}}
<pre>
Line-1: (4,0)->(6,10)
Line-2: (0,3)->(10,7)
Intersect = 5.0 5.0
 
Line-1: (0,0)->(1,1)
Line-2: (1,2)->(4,5)
No Intersect.
</pre>
 
 
=={{header|EasyLang}}==
{{trans|Python}}
<syntaxhighlight>
proc intersect ax1 ay1 ax2 ay2 bx1 by1 bx2 by2 . rx ry .
rx = 1 / 0
ry = 1 / 0
d = (by2 - by1) * (ax2 - ax1) - (bx2 - bx1) * (ay2 - ay1)
if d = 0
return
.
ua = ((bx2 - bx1) * (ay1 - by1) - (by2 - by1) * (ax1 - bx1)) / d
ub = ((ax2 - ax1) * (ay1 - by1) - (by2 - by1) * (ax1 - bx1)) / d
if abs ua > 1 or abs ub > 1
return
.
rx = ax1 + ua * (ax2 - ax1)
ry = ay1 + ua * (ay2 - ay1)
.
intersect 4 0 6 10 0 3 10 7 rx ry
print rx & " " & ry
intersect 4 0 6 10 0 3 10 7.1 rx ry
print rx & " " & ry
intersect 0 0 1 1 1 2 4 5 rx ry
print rx & " " & ry
</syntaxhighlight>
 
=={{header|Emacs Lisp}}==
<syntaxhighlight lang="lisp">
;; y = a*x + b
(let ()
(defun line-prop (p1 p2)
(let* ((prop-a (/ (- (plist-get p2 'y) (plist-get p1 'y))
(- (plist-get p2 'x) (plist-get p1 'x))))
(prop-b (- (plist-get p1 'y) (* prop-a (plist-get p1 'x)))))
 
(list 'a prop-a 'b prop-b) ) )
 
(defun calculate-intersection (line1 line2)
(if (= (plist-get line1 'a) (plist-get line2 'a))
(progn (error "The two lines don't have any intersection.") nil)
(progn
(let (int-x int-y)
(setq int-x (/ (- (plist-get line2 'b) (plist-get line1 'b))
(- (plist-get line1 'a) (plist-get line2 'a))))
(setq int-y (+ (* (plist-get line1 'a) int-x) (plist-get line1 'b)))
(list 'x int-x 'y int-y) ) ) ) )
 
(let ((p1 '(x 4.0 y 0.0)) (p2 '(x 6.0 y 10.0))
(p3 '(x 0.0 y 3.0)) (p4 '(x 10.0 y 7.0)))
(let ((line1 (line-prop p1 p2))
(line2 (line-prop p3 p4)))
(message "%s" (calculate-intersection line1 line2)) ) )
 
)
</syntaxhighlight>
 
{{out}}
<pre>
(x 5.0 y 5.0)
</pre>
 
=={{header|EMal}}==
<syntaxhighlight lang="emal">
type Intersection
model
Point point
fun asText = <|when(me.point == null, "No intersection", me.point.asText())
end
type Point
model
real x, y
fun asText = <|"(" + me.x + "," + me.y + ")"
end
type Line
model
Point s,e
end
type Main
fun getIntersectionByLines = Intersection by Line n1, Line n2
real a1 = n1.e.y - n1.s.y
real b1 = n1.s.x - n1.e.x
real c1 = a1 * n1.s.x + b1 * n1.s.y
real a2 = n2.e.y - n2.s.y
real b2 = n2.s.x - n2.e.x
real c2 = a2 * n2.s.x + b2 * n2.s.y
real delta = a1 * b2 - a2 * b1
if delta == 0 do return Intersection() end
return Intersection(Point((b2 * c1 - b1 * c2) / delta, (a1 * c2 - a2 * c1) / delta))
end
Line n1 = Line(Point(4, 0), Point(6, 10))
Line n2 = Line(Point(0, 3), Point(10, 7))
writeLine(getIntersectionByLines(n1, n2))
n1 = Line(Point(0, 0), Point(1, 1))
n2 = Line(Point(1, 2), Point(4, 5))
writeLine(getIntersectionByLines(n1, n2))
</syntaxhighlight>
{{out}}
<pre>
(5.0,5.0)
No intersection
</pre>
 
=={{header|F_Sharp|F#}}==
<langsyntaxhighlight lang="fsharp">
(*
Find the point of intersection of 2 lines.
Line 441 ⟶ 1,190:
intersect (fn (4.0,0.0) (6.0,10.0)) (fn (0.0,3.0) (10.0,7.0))
intersect {a=3.18;b=4.23;c=7.13} {a=6.36;b=8.46;c=9.75}
</syntaxhighlight>
</lang>
{{out}}
<pre>
-10.00x + 2.00y = -40.00 intersects -4.00x + 10.00y = 30.00 at x=5.00 y=5.00
3.18x + 4.23y = 7.13 does not intersect 6.36x + 8.46y = 9.75
</pre>
 
=={{header|Factor}}==
{{works with|Factor|0.99 2020-01-23}}
<syntaxhighlight lang="factor">USING: arrays combinators.extras kernel math
math.matrices.laplace math.vectors prettyprint sequences ;
 
: det ( pt pt -- x ) 2array determinant ;
 
: numerator ( x y pt pt quot -- z )
bi@ swapd [ 2array ] 2bi@ det ; inline
 
: intersection ( pt pt pt pt -- pt )
[ [ det ] 2bi@ ]
[ [ v- ] 2bi@ ] 4bi
[ [ first ] numerator ]
[ [ second ] numerator ]
[ det 2nip ] 4tri
dup zero? [ 3drop { 0/0. 0/0. } ]
[ tuck [ / ] 2bi@ 2array ] if ;
 
{ 4 0 } { 6 10 } { 0 3 } { 10 7 } intersection .
{ 4 0 } { 6 10 } { 0 3 } { 10 7+1/10 } intersection .
{ 0 0 } { 1 1 } { 1 2 } { 4 5 } intersection .</syntaxhighlight>
{{out}}
<pre>
{ 5 5 }
{ 5+5/459 5+25/459 }
{ NAN: 8000000000000 NAN: 8000000000000 }
</pre>
 
=={{header|Fortran}}==
{{works with|Fortran|90 and later}}
<langsyntaxhighlight lang="fortran">program intersect_two_lines
implicit none
Line 496 ⟶ 1,274:
write(*,*)x,y
end subroutine intersect
end program intersect_two_lines</langsyntaxhighlight>
{{out}}
<pre> 5.00000000 5.00000000 </pre>
 
=={{header|FreeBASIC}}==
<langsyntaxhighlight lang="freebasic">' version 16-08-2017
' compile with: fbc -s console
#Define NaN 0 / 0 ' FreeBASIC returns -1.#IND
Line 545 ⟶ 1,323:
Print : Print "hit any key to end program"
Sleep
End</langsyntaxhighlight>
{{out}}
<pre> 5 5
-1.#IND -1.#IND</pre>
 
=={{header|Frink}}==
<syntaxhighlight lang="frink">lineIntersection[x1, y1, x2, y2, x3, y3, x4, y4] :=
{
det = (x1 - x2)(y3 - y4) - (y1 - y2)(x3 - x4)
if det == 0
return undef
 
t1 = (x1 y2 - y1 x2)
t2 = (x3 y4 - y3 x4)
px = (t1 (x3 - x4) - t2 (x1 - x2)) / det
py = (t1 (y3 - y4) - t2 (y1 - y2)) / det
return [px, py]
}
 
println[lineIntersection[4, 0, 6, 10, 0, 3, 10, 7]]</syntaxhighlight>
{{out}}
<pre>
[5, 5]
</pre>
 
 
=={{header|Go}}==
<syntaxhighlight lang="go">
<lang go>
package main
 
Line 596 ⟶ 1,396:
}
}
</syntaxhighlight>
</lang>
{{Out}}
<pre>{5 5}</pre>
 
=={{header|Groovy}}==
{{trans|Java}}
<syntaxhighlight lang="groovy">class Intersection {
private static class Point {
double x, y
 
Point(double x, double y) {
this.x = x
this.y = y
}
 
@Override
String toString() {
return "($x, $y)"
}
}
 
private static class Line {
Point s, e
 
Line(Point s, Point e) {
this.s = s
this.e = e
}
}
 
private static Point findIntersection(Line l1, Line l2) {
double a1 = l1.e.y - l1.s.y
double b1 = l1.s.x - l1.e.x
double c1 = a1 * l1.s.x + b1 * l1.s.y
 
double a2 = l2.e.y - l2.s.y
double b2 = l2.s.x - l2.e.x
double c2 = a2 * l2.s.x + b2 * l2.s.y
 
double delta = a1 * b2 - a2 * b1
return new Point((b2 * c1 - b1 * c2) / delta, (a1 * c2 - a2 * c1) / delta)
}
 
static void main(String[] args) {
Line l1 = new Line(new Point(4, 0), new Point(6, 10))
Line l2 = new Line(new Point(0, 3), new Point(10, 7))
println(findIntersection(l1, l2))
 
l1 = new Line(new Point(0, 0), new Point(1, 1))
l2 = new Line(new Point(1, 2), new Point(4, 5))
println(findIntersection(l1, l2))
}
}</syntaxhighlight>
{{out}}
<pre>(5.0, 5.0)
(-Infinity, -Infinity)</pre>
 
=={{header|Haskell}}==
<langsyntaxhighlight lang="haskell">type Line = (Point, Point)
 
type Point = (Float, Float)
Line 636 ⟶ 1,489:
case interSection of
Left x -> x
Right x -> show x</langsyntaxhighlight>
{{Out}}
<pre>(5.0,5.0)</pre>
Line 643 ⟶ 1,496:
{{trans|C++}}
'''Solution:'''
<langsyntaxhighlight lang="j">det=: -/ .* NB. calculate determinant
findIntersection=: (det ,."1 [: |: -/"2) %&det -/"2</langsyntaxhighlight>
 
'''Examples:'''
<langsyntaxhighlight lang="j"> line1=: 4 0 ,: 6 10
line2=: 0 3 ,: 10 7
line3=: 0 3 ,: 10 7.1
Line 662 ⟶ 1,515:
__ __
findIntersection line6 ,: line7
2.5 1.5</langsyntaxhighlight>
 
=={{header|Java}}==
{{trans|Kotlin}}
<langsyntaxhighlight Javalang="java">public class Intersection {
private static class Point {
double x, y;
Line 712 ⟶ 1,565:
System.out.println(findIntersection(l1, l2));
}
}</langsyntaxhighlight>
{{out}}
<pre>{5.000000, 5.000000}
Line 720 ⟶ 1,573:
{{Trans|Haskell}}
===ES6===
<langsyntaxhighlight JavaScriptlang="javascript">(() => {
'use strict';
// INTERSECTION OF TWO LINES ----------------------------------------------
Line 793 ⟶ 1,646:
]);
return show(lrIntersection.Left || lrIntersection.Right);
})();</langsyntaxhighlight>
{{Out}}
<pre>[5,5]</pre>
Line 802 ⟶ 1,655:
points P1 and P2. Array destructuring is used for simplicity.
 
<langsyntaxhighlight lang="jq"># determinant of 2x2 matrix
def det(a;b;c;d): a*d - b*c ;
 
Line 823 ⟶ 1,676:
then error("lineIntersect: parallel lines")
else [.xnom/.denom, .ynom/.denom]
end ;</langsyntaxhighlight>
Example:
<langsyntaxhighlight lang="jq">[[4.0, 0.0], [6.0,10.0]] | lineIntersection([[0.0, 3.0], [10.0, 7.0]])</langsyntaxhighlight>
{{out}}
<syntaxhighlight lang ="jq">[5,5]</langsyntaxhighlight>
 
=={{header|Julia}}==
Line 833 ⟶ 1,686:
{{trans|Kotlin}}
 
<langsyntaxhighlight lang="julia">struct Point{T}
x::T
y::T
Line 863 ⟶ 1,716:
l1 = Line(Point{Float64}(0, 0), Point{Float64}(1, 1))
l2 = Line(Point{Float64}(1, 2), Point{Float64}(4, 5))
println(intersection(l1, l2))</langsyntaxhighlight>
 
{{out}}
<pre>Point{Float64}(5.0, 5.0)
Point{Float64}(-Inf, -Inf)</pre>
 
==== GeometryTypes library version ====
<syntaxhighlight lang="julia">using GeometryTypes
 
a = LineSegment(Point2f0(4, 0), Point2f0(6, 10))
b = LineSegment(Point2f0(0, 3), Point2f0(10, 7))
@show intersects(a, b) # --> intersects(a, b) = (true, Float32[5.0, 5.0])
</syntaxhighlight>
 
=={{header|Kotlin}}==
{{trans|C#}}
<langsyntaxhighlight kotlinlang="scala">// version 1.1.2
 
class PointF(val x: Float, val y: Float) {
Line 900 ⟶ 1,761:
l2 = LineF(PointF(1f, 2f), PointF(4f, 5f))
println(findIntersection(l1, l2))
}</langsyntaxhighlight>
 
{{out}}
Line 907 ⟶ 1,768:
{-Infinity, -Infinity}
</pre>
 
=={{header|Lambdatalk}}==
{{trans|Python}}
<syntaxhighlight lang="scheme">
{def line_intersect
{def line_intersect.sub
{lambda {:111 :121 :112 :122 :211 :221 :212 :222}
{let { {:x :111} {:y :121}
{:z {- {* {- :222 :221} {- :112 :111}}
{* {- :212 :211} {- :122 :121}} } }
{:a {- :112 :111}} {:b {- :122 :121}}
{:c {- :212 :211}} {:d {- :222 :221}}
{:e {- :121 :221}} {:f {- :111 :211}}
{:g {- :121 :211}} {:h {- :122 :121}}
} {if {> :z 0}
then {A.new ∞ ∞}
else {let { {:x :x} {:y :y} {:a :a} {:b :b}
{:t1 {/ {- {* :c :e} {* :d :f}} :z} }
{:t2 {/ {- {* :a :g} {* :h :f}} :z} }
} {if {and {>= :t1 0} {<= :t1 1} {>= :t2 0} {<= :t2 1}}
then {A.new {+ :x {* :t1 :a}} {+ :y {* :t1 :b}} }
else {A.new ∞ ∞}} }}}}}
{lambda {:1 :2}
{line_intersect.sub
{A.first {A.first :1}} {A.last {A.first :1}}
{A.first {A.last :1}} {A.last {A.last :1}}
{A.first {A.first :2}} {A.last {A.first :2}}
{A.first {A.last :2}} {A.last {A.last :2}} }}}
-> line_intersect
 
{line_intersect {A.new {A.new 4 0} {A.new 6 10}}
{A.new {A.new 0 3} {A.new 10 7}}}
-> [5,5]
{line_intersect {A.new {A.new 4 0} {A.new 6 10}}
{A.new {A.new 0 3} {A.new 10 7.1}}}
-> [5.010893246187364,5.05446623093682]
{line_intersect {A.new {A.new 1 -1} {A.new 4 4}}
{A.new {A.new 2 5} {A.new 3 -2}}}
-> [2.5,1.5]
{line_intersect {A.new {A.new 0 0} {A.new 0 0}}
{A.new {A.new 0 3} {A.new 10 7}}}
-> [∞,∞]
{line_intersect {A.new {A.new 0 0} {A.new 1 1}}
{A.new {A.new 1 2} {A.new 4 5}}}
-> [∞,∞]
</syntaxhighlight>
 
=={{header|Lua}}==
{{trans|C#}}
<langsyntaxhighlight lang="lua">function intersection (s1, e1, s2, e2)
local d = (s1.x - e1.x) * (s2.y - e2.y) - (s1.y - e1.y) * (s2.x - e2.x)
local a = s1.x * e1.y - s1.y * e1.x
Line 921 ⟶ 1,828:
local line1start, line1end = {x = 4, y = 0}, {x = 6, y = 10}
local line2start, line2end = {x = 0, y = 3}, {x = 10, y = 7}
print(intersection(line1start, line1end, line2start, line2end))</langsyntaxhighlight>
{{out}}
<pre>5 5</pre>
=={{header|M2000 Interpreter}}==
<syntaxhighlight lang="m2000 interpreter">
Module Lineintersection (lineAtuple, lineBtuple) {
class line {
private:
slop, k
public:
function f(x) {
=x*.slop-.k
}
function intersection(b as line) {
if b.slop==.slop then
=(,)
else
x1=(.k-b.k)/(.slop-b.slop)
=(x1, .f(x1))
end if
}
Class:
module line {
read x1, y1, x2, y2
if x1==x2 then error "wrong input"
if x1>x2 then swap x1,x2 : swap y1, y2
.slop<=(y1-y2)/(x1-x2)
.k<=x1*.slop-y1
}
}
M=line(!lineAtuple)
N=line(!lineBtuple)
Print M.intersection(N)
}
Lineintersection (4,0,6,10), (0,3,10,7) ' print 5 5
</syntaxhighlight>
{{out}}
<pre>
5 5
</pre>
 
=={{header|Maple}}==
<langsyntaxhighlight Maplelang="maple">with(geometry):
line(L1, [point(A,[4,0]), point(B,[6,10])]):
line(L2, [point(C,[0,3]), point(E,[10,7])]):
coordinates(intersection(x,L1,L2));</langsyntaxhighlight>
{{Output|Out}}
<pre>[5, 5]</pre>
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
<syntaxhighlight lang="mathematica">RegionIntersection[
InfiniteLine[{{4, 0}, {6, 10}}],
InfiniteLine[{{0, 3}, {10, 7}}]
]</syntaxhighlight>
{{out}}
<pre>Point[{5, 5}]</pre>
 
=={{header|MATLAB}}==
<syntaxhighlight lang="matlab">
<lang MATLAB>
function cross=intersection(line1,line2)
a=polyfit(line1(:,1),line1(:,2),1);
Line 940 ⟶ 1,892:
cross=[a(1) -1; b(1) -1]\[-a(2);-b(2)];
end
</syntaxhighlight>
</lang>
{{out}}
<pre>line1=[4 0; 6 10]; line2=[0 3; 10 7]; cross=intersection(line1,line2)
Line 948 ⟶ 1,900:
5.0000
</pre>
 
=={{header|Modula-2}}==
<langsyntaxhighlight lang="modula2">MODULE LineIntersection;
FROM RealStr IMPORT RealToStr;
FROM Terminal IMPORT WriteString,WriteLn,ReadChar;
Line 1,005 ⟶ 1,958:
 
ReadChar;
END LineIntersection.</langsyntaxhighlight>
 
=={{header|Nim}}==
{{trans|Go}}
<syntaxhighlight lang="nim">type
Line = tuple
slope: float
yInt: float
Point = tuple
x: float
y: float
 
func createLine(a, b: Point): Line =
result.slope = (b.y - a.y) / (b.x - a.x)
result.yInt = a.y - result.slope * a.x
 
func evalX(line: Line, x: float): float =
line.slope * x + line.yInt
 
func intersection(line1, line2: Line): Point =
let x = (line2.yInt - line1.yInt) / (line1.slope - line2.slope)
let y = evalX(line1, x)
(x, y)
 
var line1 = createLine((4.0, 0.0), (6.0, 10.0))
var line2 = createLine((0.0, 3.0), (10.0, 7.0))
echo intersection(line1, line2)
line1 = createLine((0.0, 0.0), (1.0, 1.0))
line2 = createLine((1.0, 2.0), (4.0, 5.0))
echo intersection(line1, line2)</syntaxhighlight>
{{out}}
<pre>
(x: 5.0, y: 5.0)
(x: inf, y: inf)
</pre>
 
=={{header|Perl}}==
Line 1,011 ⟶ 1,998:
If warning are enabled the second print will issue a warning since we are trying to print out an undef
 
<langsyntaxhighlight lang="perl">
sub intersect {
my ($x1, $y1, $x2, $y2, $x3, $y3, $x4, $y4) = @_;
Line 1,032 ⟶ 2,019:
($ix, $iy) = intersect(0, 0, 1, 1, 1, 2, 4, 5);
print "$ix $iy\n";
</syntaxhighlight>
</lang>
 
=={{header|Perl 6Phix}}==
{{libheader|Phix/online}}
{{works with|Rakudo|2016.11}}
You can run this online [http://phix.x10.mx/p2js/intersect.htm here].
{{trans|zkl}}
<!--<syntaxhighlight lang="phix">(phixonline)-->
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #008080;">enum</span> <span style="color: #000000;">X</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">Y</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">abc</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #000000;">e</span><span style="color: #0000FF;">)</span>
<span style="color: #000080;font-style:italic;">-- yeilds {a,b,c}, corresponding to ax+by=c</span>
<span style="color: #004080;">atom</span> <span style="color: #000000;">a</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">e</span><span style="color: #0000FF;">[</span><span style="color: #000000;">Y</span><span style="color: #0000FF;">]-</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">Y</span><span style="color: #0000FF;">],</span> <span style="color: #000000;">b</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">X</span><span style="color: #0000FF;">]-</span><span style="color: #000000;">e</span><span style="color: #0000FF;">[</span><span style="color: #000000;">X</span><span style="color: #0000FF;">],</span> <span style="color: #000000;">c</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">a</span><span style="color: #0000FF;">*</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">X</span><span style="color: #0000FF;">]+</span><span style="color: #000000;">b</span><span style="color: #0000FF;">*</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">Y</span><span style="color: #0000FF;">]</span>
<span style="color: #008080;">return</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">a</span><span style="color: #0000FF;">,</span><span style="color: #000000;">b</span><span style="color: #0000FF;">,</span><span style="color: #000000;">c</span><span style="color: #0000FF;">}</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">procedure</span> <span style="color: #000000;">intersect</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">s1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">e1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">s2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">e2</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">atom</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">a1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">b1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">c1</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">abc</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">e1</span><span style="color: #0000FF;">),</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">a2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">b2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">c2</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">abc</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">e2</span><span style="color: #0000FF;">),</span>
<span style="color: #000000;">delta</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">a1</span><span style="color: #0000FF;">*</span><span style="color: #000000;">b2</span> <span style="color: #0000FF;">-</span> <span style="color: #000000;">a2</span><span style="color: #0000FF;">*</span><span style="color: #000000;">b1</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">x</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">b2</span><span style="color: #0000FF;">*</span><span style="color: #000000;">c1</span> <span style="color: #0000FF;">-</span> <span style="color: #000000;">b1</span><span style="color: #0000FF;">*</span><span style="color: #000000;">c2</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">y</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">a1</span><span style="color: #0000FF;">*</span><span style="color: #000000;">c2</span> <span style="color: #0000FF;">-</span> <span style="color: #000000;">a2</span><span style="color: #0000FF;">*</span><span style="color: #000000;">c1</span>
<span style="color: #0000FF;">?</span><span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">delta</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span><span style="color: #0000FF;">?</span><span style="color: #008000;">"parallel lines/do not intersect"</span>
<span style="color: #0000FF;">:{</span><span style="color: #000000;">x</span><span style="color: #0000FF;">/</span><span style="color: #000000;">delta</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">y</span><span style="color: #0000FF;">/</span><span style="color: #000000;">delta</span><span style="color: #0000FF;">})</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
<span style="color: #000000;">intersect</span><span style="color: #0000FF;">({</span><span style="color: #000000;">4</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">},{</span><span style="color: #000000;">6</span><span style="color: #0000FF;">,</span><span style="color: #000000;">10</span><span style="color: #0000FF;">},{</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">3</span><span style="color: #0000FF;">},{</span><span style="color: #000000;">10</span><span style="color: #0000FF;">,</span><span style="color: #000000;">7</span><span style="color: #0000FF;">})</span> <span style="color: #000080;font-style:italic;">-- {5,5}</span>
<span style="color: #000000;">intersect</span><span style="color: #0000FF;">({</span><span style="color: #000000;">4</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">},{</span><span style="color: #000000;">6</span><span style="color: #0000FF;">,</span><span style="color: #000000;">10</span><span style="color: #0000FF;">},{</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">3</span><span style="color: #0000FF;">},{</span><span style="color: #000000;">10</span><span style="color: #0000FF;">,</span><span style="color: #000000;">7.1</span><span style="color: #0000FF;">})</span> <span style="color: #000080;font-style:italic;">-- {5.010893246,5.054466231}</span>
<span style="color: #000000;">intersect</span><span style="color: #0000FF;">({</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">},{</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">},{</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">3</span><span style="color: #0000FF;">},{</span><span style="color: #000000;">10</span><span style="color: #0000FF;">,</span><span style="color: #000000;">7</span><span style="color: #0000FF;">})</span> <span style="color: #000080;font-style:italic;">-- "parallel lines/do not intersect"</span>
<span style="color: #000000;">intersect</span><span style="color: #0000FF;">({</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">},{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">},{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">},{</span><span style="color: #000000;">4</span><span style="color: #0000FF;">,</span><span style="color: #000000;">5</span><span style="color: #0000FF;">})</span> <span style="color: #000080;font-style:italic;">-- "parallel lines/do not intersect"</span>
<span style="color: #000000;">intersect</span><span style="color: #0000FF;">({</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">},{</span><span style="color: #000000;">4</span><span style="color: #0000FF;">,</span><span style="color: #000000;">4</span><span style="color: #0000FF;">},{</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">5</span><span style="color: #0000FF;">},{</span><span style="color: #000000;">3</span><span style="color: #0000FF;">,-</span><span style="color: #000000;">2</span><span style="color: #0000FF;">})</span> <span style="color: #000080;font-style:italic;">-- {2.5,1.5}</span>
<!--</syntaxhighlight>-->
 
=={{header|Processing}}==
<lang perl6>sub intersection (Real $ax, Real $ay, Real $bx, Real $by,
Real $cx, Real $cy, Real $dx, Real $dy ) {
 
<syntaxhighlight lang="java">void setup() {
sub term:<|AB|> { determinate($ax, $ay, $bx, $by) }
// test lineIntersect() with visual and textual output
sub term:<|CD|> { determinate($cx, $cy, $dx, $dy) }
float lineA[] = {4, 0, 6, 10}; // try 4, 0, 6, 4
 
float lineB[] = {0, 3, 10, 7}; // for non intersecting test
my $ΔxAB = $ax - $bx;
PVector pt = lineInstersect(lineA[0], lineA[1], lineA[2], lineA[3],
my $ΔyAB = $ay - $by;
lineB[0], lineB[1], lineB[2], lineB[3]);
my $ΔxCD = $cx - $dx;
scale(9);
my $ΔyCD = $cy - $dy;
line(lineA[0], lineA[1], lineA[2], lineA[3]);
 
line(lineB[0], lineB[1], lineB[2], lineB[3]);
my $x-numerator = determinate( |AB|, $ΔxAB, |CD|, $ΔxCD );
if (pt != null) {
my $y-numerator = determinate( |AB|, $ΔyAB, |CD|, $ΔyCD );
stroke(255);
my $denominator = determinate( $ΔxAB, $ΔyAB, $ΔxCD, $ΔyCD );
point(pt.x, pt.y);
 
println(pt.x, pt.y);
return 'Lines are parallel' if $denominator == 0;
} else {
 
println("No point");
($x-numerator/$denominator, $y-numerator/$denominator);
}
}
 
PVector lineInstersect(float Ax1, float Ay1, float Ax2, float Ay2,
sub determinate ( Real $a, Real $b, Real $c, Real $d ) { $a * $d - $b * $c }
float Bx1, float By1, float Bx2, float By2) {
// returns null if there is no intersection
float uA, uB;
float d = ((By2 - By1) * (Ax2 - Ax1) - (Bx2 - Bx1) * (Ay2 - Ay1));
if (d != 0) {
uA = ((Bx2 - Bx1) * (Ay1 - By1) - (By2 - By1) * (Ax1 - Bx1)) / d;
uB = ((Ax2 - Ax1) * (Ay1 - By1) - (Ay2 - Ay1) * (Ax1 - Bx1)) / d;
} else {
return null;
}
if (0 > uA || uA > 1 || 0 > uB || uB > 1) {
return null;
}
float x = Ax1 + uA * (Ax2 - Ax1);
float y = Ay1 + uA * (Ay2 - Ay1);
return new PVector(x, y);
}</syntaxhighlight>
 
==={{header|Processing Python mode}}===
# TESTING
say 'Intersection point: ', intersection( 4,0, 6,10, 0,3, 10,7 );
say 'Intersection point: ', intersection( 4,0, 6,10, 0,3, 10,7.1 );
say 'Intersection point: ', intersection( 0,0, 1,1, 1,2, 4,5 );</lang>
{{out}}
<pre>Intersection point: (5 5)
Intersection point: (5.010893 5.054466)
Intersection point: Lines are parallel
</pre>
 
<syntaxhighlight lang="python">from __future__ import division
=={{header|Phix}}==
<lang Phix>enum X, Y
 
def setup():
function abc(sequence s,e)
""" test line_intersect() with visual and textual output """
-- yeilds {a,b,c}, corresponding to ax+by=c
atom (a, =b), e[Y]-s[Y](c, bd) = s[X]-e[X](4, c0), =(6, a*s[X]+b*s[Y]10) # try (4, 0), (6, 4)
(e, f), (g, h) = (0, 3), (10, 7) # for non intersecting test
return {a,b,c}
pt = line_instersect(a, b, c, d, e, f, g, h)
end function
scale(9)
line(a, b, c, d)
line(e, f, g, h)
if pt:
x, y = pt
stroke(255)
point(x, y)
println(pt) # prints x, y coordinates or 'None'
 
def line_instersect(Ax1, Ay1, Ax2, Ay2, Bx1, By1, Bx2, By2):
procedure intersect(sequence s1, e1, s2, e2)
""" returns a (x, y) tuple or None if there is no intersection """
atom {a1,b1,c1} = abc(s1,e1),
d = (By2 - By1) * (Ax2 - Ax1) - (Bx2 - Bx1) * (Ay2 - Ay1)
{a2,b2,c2} = abc(s2,e2),
if d:
delta = a1*b2 - a2*b1,
xuA = b2((Bx2 - Bx1) *c1 (Ay1 - b1By1) - (By2 - By1) *c2, (Ax1 - Bx1)) / d
yuB = a1((Ax2 - Ax1) *c2 (Ay1 - a2By1) - (Ay2 - Ay1) *c1 (Ax1 - Bx1)) / d
else:
?iff(delta=0?"parallel lines/do not intersect"
:{x/delta, y/delta})return
if not(0 <= uA <= 1 and 0 <= uB <= 1):
end procedure
return
 
x = Ax1 + uA * (Ax2 - Ax1)
intersect({4,0},{6,10},{0,3},{10,7}) -- {5,5}
y = Ay1 + uA * (Ay2 - Ay1)
intersect({4,0},{6,10},{0,3},{10,7.1}) -- {5.010893246,5.054466231}
return x, y</syntaxhighlight>
intersect({0,0},{0,0},{0,3},{10,7}) -- "parallel lines/do not intersect"
intersect({0,0},{1,1},{1,2},{4,5}) -- "parallel lines/do not intersect"
intersect({1,-1},{4,4},{2,5},{3,-2}) -- {2.5,1.5}</lang>
 
=={{header|Python}}==
Find the intersection without importing third-party libraries.
<syntaxhighlight lang="python">def line_intersect(Ax1, Ay1, Ax2, Ay2, Bx1, By1, Bx2, By2):
""" returns a (x, y) tuple or None if there is no intersection """
d = (By2 - By1) * (Ax2 - Ax1) - (Bx2 - Bx1) * (Ay2 - Ay1)
if d:
uA = ((Bx2 - Bx1) * (Ay1 - By1) - (By2 - By1) * (Ax1 - Bx1)) / d
uB = ((Ax2 - Ax1) * (Ay1 - By1) - (Ay2 - Ay1) * (Ax1 - Bx1)) / d
else:
return
if not(0 <= uA <= 1 and 0 <= uB <= 1):
return
x = Ax1 + uA * (Ax2 - Ax1)
y = Ay1 + uA * (Ay2 - Ay1)
return x, y
 
if __name__ == '__main__':
<lang python>from __future__ import print_function
(a, b), (c, d) = (4, 0), (6, 10) # try (4, 0), (6, 4)
from shapely.geometry import LineString
(e, f), (g, h) = (0, 3), (10, 7) # for non intersecting test
pt = line_intersect(a, b, c, d, e, f, g, h)
print(pt)</syntaxhighlight>
 
{{Out}}
if __name__=="__main__":
<pre>(5.0, 5.0)</pre>
line1 = LineString([(4.0,0.0), (6.0,10.0)])
line2 = LineString([(0.0,3.0), (10.0,7.0)])
print (line1.intersection(line2))</lang>
{{out}}
<pre>POINT (5 5)</pre>
 
Or, one approach to using only the standard libraries:
<lang python>from functools import (reduce)
 
Or, labelling the moving parts a little more, and returning a composable option value containing either a message (in the absence of an intersection), or a pair of coordinates:
 
{{Works with|Python|3.7}}
# main :: IO()
<syntaxhighlight lang="python">'''The intersection of two lines.'''
def main():
# ab :: Line
ab = ((4.0, 0.0), (6.0, 10.0))
 
from itertools import product
# pq :: Line
pq = ((0.0, 3.0), (10.0, 7.0))
 
# Left(message - no intersection) or Right(point)
# lrPoint :: Either String Point
lrPoint = intersection(ab)(pq)
print(
lrPoint['Left'] or lrPoint['Right']
)
 
 
# intersection :: Line -> Line -> Either String Point
def intersection(ab):
'''Either the point at which the lines ab and pq
intersect, or a message string indicating that
they are parallel and have no intersection.'''
def delta(f):
return lambda x: f(fst(x)) - f(snd(x))
Line 1,137 ⟶ 2,170:
 
def go(pq):
[abDX, pqDX, abDY, pqDY] = apapList(
[delta(fst), delta(snd)]
)([ab, pq])
Line 1,145 ⟶ 2,178:
[abD, pqD] = map(
lambda xy: prodDiff(
apapList([fst, snd])([fst(xy), snd(xy)])
), [ab, pq]
)
return apapList(
[lambda abpq: prodDiff(
[abD, fst(abpq), pqD, snd(abpq)]) / determinant]
Line 1,163 ⟶ 2,196:
 
 
# GENERIC FUNCTIONS --------------------------TEST---------------------------
# main :: IO()
def main():
'''Test'''
 
# Left(message - no intersection) or Right(point)
# lrPoint :: Either String Point
lrPoint = intersection(
((4.0, 0.0), (6.0, 10.0))
)(
((0.0, 3.0), (10.0, 7.0))
)
print(
lrPoint['Left'] or lrPoint['Right']
)
 
 
# --------------------GENERIC FUNCTIONS--------------------
 
# Left :: a -> Either a b
def Left(x):
return'''Constructor {type:for an empty 'Either', 'Right':(option None, 'Left':type) x}value
with an associated string.'''
return {'type': 'Either', 'Right': None, 'Left': x}
 
 
# Right :: b -> Either a b
def Right(x):
return'''Constructor {type:for a populated 'Either', 'Left':(option None,type) value''Right': x}
return {'type': 'Either', 'Left': None, 'Right': x}
 
 
# apapList (<*>) :: [(a -> b)] -> [a] -> [b]
def apapList(fs):
'''The application of each of a list of functions,
return lambda xs: concatMap(
to lambdaeach f:of concatMap(lambdaa x:list [f(x)])(xs)of values.
)(fs)'''
def go(fx):
f, x = fx
return f(x)
return lambda xs: [
go(x) for x
in product(fs, xs)
]
 
 
# bindLR (>>=) :: Either a -> (a -> Either b) -> Either b
def bindLR(m):
'''Either monad injection operator.
Two computations sequentially composed,
with any value produced by the first
passed as an argument to the second.'''
return lambda mf: (
mf(m.get('Right')) if None is not m.get('Left') else mf(m.get('Right'))
)
 
 
# concatMap :: (a -> [b]) -> [a] -> [b]
def concatMap(f):
return lambda xs: (
reduce(lambda a, b: a + b, map(f, xs), [])
)
 
Line 1,198 ⟶ 2,255:
# fst :: (a, b) -> a
def fst(tpl):
'''First member of a pair.'''
return tpl[0]
 
Line 1,203 ⟶ 2,261:
# snd :: (a, b) -> b
def snd(tpl):
'''Second member of a pair.'''
return tpl[1]
 
 
# MAIN ---
if __name__ == '__main__':
main()</lang>
main()</syntaxhighlight>
{{Out}}
{{out}}
<pre>(5.0, 5.0)</pre>
{{libheader|Shapely}}
Find the intersection by importing the external [https://shapely.readthedocs.io/en/latest/manual.html Shapely] library.
<syntaxhighlight lang="python">from shapely.geometry import LineString
 
if __name__ == "__main__":
line1 = LineString([(4, 0), (6, 10)])
line2 = LineString([(0, 3), (10, 7)])
print(line1.intersection(line2))</syntaxhighlight>
{{out}}
<pre>POINT (5 5)</pre>
 
=={{header|Racket}}==
{{trans|C++}}
<langsyntaxhighlight lang="racket">#lang racket/base
(define (det a b c d) (- (* a d) (* b c))) ; determinant
 
Line 1,231 ⟶ 2,301:
 
(module+ test (line-intersect 4 0 6 10
0 3 10 7))</langsyntaxhighlight>
 
{{out}}
<pre>5
5</pre>
 
=={{header|Raku}}==
(formerly Perl 6)
{{works with|Rakudo|2016.11}}
{{trans|zkl}}
 
<syntaxhighlight lang="raku" line>sub intersection (Real $ax, Real $ay, Real $bx, Real $by,
Real $cx, Real $cy, Real $dx, Real $dy ) {
 
sub term:<|AB|> { determinate($ax, $ay, $bx, $by) }
sub term:<|CD|> { determinate($cx, $cy, $dx, $dy) }
 
my $ΔxAB = $ax - $bx;
my $ΔyAB = $ay - $by;
my $ΔxCD = $cx - $dx;
my $ΔyCD = $cy - $dy;
 
my $x-numerator = determinate( |AB|, $ΔxAB, |CD|, $ΔxCD );
my $y-numerator = determinate( |AB|, $ΔyAB, |CD|, $ΔyCD );
my $denominator = determinate( $ΔxAB, $ΔyAB, $ΔxCD, $ΔyCD );
 
return 'Lines are parallel' if $denominator == 0;
 
($x-numerator/$denominator, $y-numerator/$denominator);
}
 
sub determinate ( Real $a, Real $b, Real $c, Real $d ) { $a * $d - $b * $c }
 
# TESTING
say 'Intersection point: ', intersection( 4,0, 6,10, 0,3, 10,7 );
say 'Intersection point: ', intersection( 4,0, 6,10, 0,3, 10,7.1 );
say 'Intersection point: ', intersection( 0,0, 1,1, 1,2, 4,5 );</syntaxhighlight>
{{out}}
<pre>Intersection point: (5 5)
Intersection point: (5.010893 5.054466)
Intersection point: Lines are parallel
</pre>
 
===Using a geometric algebra library===
 
See task [[geometric algebra]].
 
<syntaxhighlight lang=raku>use Clifford;
 
# We pick a projective basis,
# and we compute its pseudo-scalar and its square.
my ($i, $j, $k) = @e;
my $I = $i∧$j∧$k;
my $I2 = ($I**2).narrow;
 
# Homogeneous coordinates of point (X,Y) are (X,Y,1)
my $A = 4*$i + 0*$j + $k;
my $B = 6*$i + 10*$j + $k;
my $C = 0*$i + 3*$j + $k;
my $D = 10*$i + 7*$j + $k;
 
# We form lines by joining points
my $AB = $A∧$B;
my $CD = $C∧$D;
 
# The intersection is their meet, which we
# compute by using the De Morgan law
my $ab = $AB*$I/$I2;
my $cd = $CD*$I/$I2;
my $M = ($ab ∧ $cd)*$I/$I2;
 
# Affine coordinates are (X/Z, Y/Z)
say $M/($M·$k) X· $i, $j;</syntaxhighlight>
 
{{out}}
 
<pre>(5 5)</pre>
 
=={{header|REXX}}==
Line 1,241 ⟶ 2,383:
Naive implementation.
To be improved for parallel lines and degenerate lines such as y=5 or x=8.
<langsyntaxhighlight lang="rexx">/* REXX */
Parse Value '(4.0,0.0)' With '(' xa ',' ya ')'
Parse Value '(6.0,10.0)' With '(' xb ',' yb ')'
Line 1,257 ⟶ 2,399:
Say 'yab='y
Say 'ycd='yc-xc*((yd-yc)/(xd-xc))+x*((yd-yc)/(xd-xc))
Say 'Intersection: ('||x','y')'</langsyntaxhighlight>
{{out}}
<pre>The two lines are:
Line 1,271 ⟶ 2,413:
<br>
Variables are named after the Austrian notation for a straight line: y=k*x+d
<syntaxhighlight lang="rexx">say ggx1('4.0 0.0 6.0 10.0 0.0 3.0 10.0 7.0')
say ggx1('0.0 0.0 0.0 10.0 0.0 3.0 10.0 7.0')
say ggx1('0.0 0.0 0.0 10.0 0.0 3.0 10.0 7.0')
Line 1,342 ⟶ 2,484:
If res='' Then /* not any special case */
res='Intersection is ('||x'/'y')' /* that's the result */
Return ' -->' res</langsyntaxhighlight>
{{out}}
<pre>A=(4.0/0.0) B=(6.0/10.0) C=(0.0/3.0) D=(10.0/7.0)
Line 1,360 ⟶ 2,502:
 
=={{header|Ring}}==
<langsyntaxhighlight lang="ring">
# Project : Find the intersection of two lines
 
Line 1,380 ⟶ 2,522:
see "ycd=" + (yc-xc*((yd-yc)/(xd-xc))+x*((yd-yc)/(xd-xc))) + nl
see "intersection: " + x + "," + y + nl
</syntaxhighlight>
</lang>
Output:
<pre>
Line 1,390 ⟶ 2,532:
ycd=5
intersection: 5,5
</pre>
 
=={{header|RPL}}==
{{works with|HP|48}}
« C→R ROT C→R ROT →V2
SWAP 1 4 ROLL 1 { 2 2 } →ARRY /
» '<span style="color:blue">→LINECOEFF</span>' STO
« <span style="color:blue">→LINECOEFF</span> ROT ROT <span style="color:blue">→LINECOEFF</span> OVER -
ARRY→ DROP NEG SWAP /
DUP2 * 1 GET ROT 2 GET + R→C
» '<span style="color:blue">INTERSECT</span>' STO
Latest versions of RPL have powerful equation handling and solving functions:
{{works with|HP|49}}
« DROITE UNROT DROITE OVER -
'X' SOLVE DUP EQ→ NIP
UNROT SUBST EQ→ NIP COLLECT R→C
» '<span style="color:blue">INTERSECT</span>' STO
 
(4,0) (6,10) (0,3) (10,7) <span style="color:blue">INTERSECT</span>
{{out}}
<pre>
1: (5,5)
</pre>
 
=={{header|Ruby}}==
<langsyntaxhighlight lang="ruby">Point = Struct.new(:x, :y)
 
class Line
Line 1,411 ⟶ 2,576:
 
def to_s
"y = #{@a}x #{@b.positive? ? '+' : '-'} #{@b.abs}"
end
 
Line 1,420 ⟶ 2,585:
 
puts "Line #{l1} intersects line #{l2} at #{l1.intersect(l2)}."
</syntaxhighlight>
</lang>
{{out}}
<pre>Line y = 5.0x + - 20.0 intersects line y = 0.4x + 3.0 at #<struct Point x=5.0, y=5.0>.</pre>
 
=={{header|Rust}}==
<langsyntaxhighlight Rustlang="rust">#[derive(Copy, Clone, Debug)]
struct Point {
x: f64,
Line 1,471 ⟶ 2,636:
let l2 = Line(Point::new(1.0, 2.0), Point::new(4.0, 5.0));
println!("{:?}", l1.intersect(l2));
}</langsyntaxhighlight>
{{Out}}
<pre>
Line 1,479 ⟶ 2,644:
 
=={{header|Scala}}==
<langsyntaxhighlight Scalalang="scala">object Intersection extends App {
val (l1, l2) = (LineF(PointF(4, 0), PointF(6, 10)), LineF(PointF(0, 3), PointF(10, 7)))
 
Line 1,508 ⟶ 2,673:
println(findIntersection(l01, l02))
 
}</langsyntaxhighlight>
{{Out}}See it in running in your browser by [https://scalafiddle.io/sf/DAqMtEx/0 (JavaScript)]
or by [https://scastie.scala-lang.org/WQOqakOlQnaBRFBa1PuRYw Scastie (JVM)].
 
=={{header|Sidef}}==
{{trans|Perl 6Raku}}
 
<langsyntaxhighlight lang="ruby">func det(a, b, c, d) { a*d - b*c }
 
func intersection(ax, ay, bx, by,
Line 1,537 ⟶ 2,703:
say ('Intersection point: ', intersection(4,0, 6,10, 0,3, 10,7))
say ('Intersection point: ', intersection(4,0, 6,10, 0,3, 10,7.1))
say ('Intersection point: ', intersection(0,0, 1,1, 1,2, 4,5))</langsyntaxhighlight>
{{out}}
<pre>
Line 1,546 ⟶ 2,712:
 
=={{header|Swift}}==
<langsyntaxhighlight lang="swift">struct Point {
var x: Double
var y: Double
Line 1,570 ⟶ 2,736:
return Point(x: p1.x, y: (p1.x - other.p1.x) * theirSlope + other.p1.y)
} else if theirSlope.isNaN && !ourSlope.isNaN {
return Point(x: other.p1.x, y: (other.p1.x - p1.x) * ourSlope + other.p1.y)
} else {
let x = (ourSlope*p1.x - theirSlope*other.p1.x + other.p1.y - p1.y) / (ourSlope - theirSlope)
Line 1,581 ⟶ 2,747:
let l2 = Line(p1: Point(x: 0.0, y: 3.0), p2: Point(x: 10.0, y: 7.0))
 
print("Intersection at : \(l1.intersection(of: l2)!)")</langsyntaxhighlight>
{{out}}
<pre>Intersection at : Point(x: 5.0, y: 5.0)</pre>
 
=={{header|TI-83 BASIC}}==
{{works with|TI-83 BASIC|TI-84Plus 2.55MP}}
{{trans|Rexx}}
Simple version:
<syntaxhighlight lang="ti83b">[[4,0][6,10][0,3][10,7]]→[A]
([A](2,2)-[A](1,2))/([A](2,1)-[A](1,1))→B
[A](1,2)-[A](1,1)*B→A
([A](4,2)-[A](3,2))/([A](4,1)-[A](3,1))→D
[A](3,2)-[A](3,1)*D→C
(C-A)/(B-D)→X
A+X*B→Y
C+X*D→Z
Disp {X,Y}</syntaxhighlight>
{{out}}
<pre>
{5 5}
</pre>
Full version:
<syntaxhighlight lang="ti83b">[[4,0][6,10][0,3][10,7]]→[A]
{4,2}→Dim([B])
0→M
If [A](1,1)=[A](2,1)
Then
[A](1,1)→[B](3,1)
If [A](1,2)=[A](2,2):1→M
Else
1→[B](4,1)
([A](2,2)-[A](1,2))/([A](2,1)-[A](1,1))→[B](1,1)
[A](1,2)-[B](1,1)*[A](1,1)→[B](2,1)
End
If [A](3,1)=[A](4,1)
Then
[A](3,1)→[B](3,2)
If [A](3,2)=[A](4,2):2→M
Else
1→[B](4,2)
([A](4,2)-[A](3,2))/([A](4,1)-[A](3,1))→[B](1,2)
[A](3,2)-[B](1,2)*[A](3,1)→[B](2,2)
End
If M=0 Then
If [B](4,1)=0
Then
If [B](4,2)=0
Then
If [B](3,1)=[B](3,2)
Then:3→M
Else:4→M
End
Else
[B](3,1)→X
[B](1,2)*X+[B](2,2)→Y
End
Else
If [B](4,2)=0
Then
[B](3,2)→X
[B](1,1)*X+[B](2,1)→Y
Else
If [B](1,1)=[B](1,2)
Then
If [B](2,1)=[B](2,2)
Then:5→M
Else:6→M
End
Else
([B](2,2)-[B](2,1))/([B](1,1)-[B](1,2))→X
[B](1,1)*X+[B](2,1)→Y
End
End
End
End
Disp {X,Y,M}</syntaxhighlight>
{{out}}
<pre>
{5 5}
</pre>
 
=={{header|Visual Basic}}==
{{works with|Visual Basic|5}}
{{works with|Visual Basic|6}}
{{works with|VBA|6.5}}
{{works with|VBA|7.1}}
<syntaxhighlight lang="vb">Option Explicit
 
Public Type Point
x As Double
y As Double
invalid As Boolean
End Type
 
Public Type Line
s As Point
e As Point
End Type
Public Function GetIntersectionPoint(L1 As Line, L2 As Line) As Point
Dim a1 As Double
Dim b1 As Double
Dim c1 As Double
Dim a2 As Double
Dim b2 As Double
Dim c2 As Double
Dim det As Double
 
a1 = L1.e.y - L1.s.y
b1 = L1.s.x - L1.e.x
c1 = a1 * L1.s.x + b1 * L1.s.y
a2 = L2.e.y - L2.s.y
b2 = L2.s.x - L2.e.x
c2 = a2 * L2.s.x + b2 * L2.s.y
det = a1 * b2 - a2 * b1
If det Then
With GetIntersectionPoint
.x = (b2 * c1 - b1 * c2) / det
.y = (a1 * c2 - a2 * c1) / det
End With
Else
GetIntersectionPoint.invalid = True
End If
End Function
 
Sub Main()
Dim ln1 As Line
Dim ln2 As Line
Dim ip As Point
ln1.s.x = 4
ln1.s.y = 0
ln1.e.x = 6
ln1.e.y = 10
ln2.s.x = 0
ln2.s.y = 3
ln2.e.x = 10
ln2.e.y = 7
ip = GetIntersectionPoint(ln1, ln2)
Debug.Assert Not ip.invalid
Debug.Assert ip.x = 5 And ip.y = 5
LSet ln2.s = ln2.e
ip = GetIntersectionPoint(ln1, ln2)
Debug.Assert ip.invalid
LSet ln2 = ln1
ip = GetIntersectionPoint(ln1, ln2)
Debug.Assert ip.invalid
End Sub</syntaxhighlight>
 
=={{header|Visual Basic .NET}}==
{{trans|C#}}
<syntaxhighlight lang="vbnet">Imports System.Drawing
 
Module Module1
 
Function FindIntersection(s1 As PointF, e1 As PointF, s2 As PointF, e2 As PointF) As PointF
Dim a1 = e1.Y - s1.Y
Dim b1 = s1.X - e1.X
Dim c1 = a1 * s1.X + b1 * s1.Y
 
Dim a2 = e2.Y - s2.Y
Dim b2 = s2.X - e2.X
Dim c2 = a2 * s2.X + b2 * s2.Y
 
Dim delta = a1 * b2 - a2 * b1
 
'If lines are parallel, the result will be (NaN, NaN).
Return If(delta = 0, New PointF(Single.NaN, Single.NaN), New PointF((b2 * c1 - b1 * c2) / delta, (a1 * c2 - a2 * c1) / delta))
End Function
 
Sub Main()
Dim p = Function(x As Single, y As Single) New PointF(x, y)
Console.WriteLine(FindIntersection(p(4.0F, 0F), p(6.0F, 10.0F), p(0F, 3.0F), p(10.0F, 7.0F)))
Console.WriteLine(FindIntersection(p(0F, 0F), p(1.0F, 1.0F), p(1.0F, 2.0F), p(4.0F, 5.0F)))
End Sub
 
End Module</syntaxhighlight>
{{out}}
<pre>{X=5, Y=5}
{X=NaN, Y=NaN}</pre>
 
=={{header|Wren}}==
{{trans|Kotlin}}
<syntaxhighlight lang="wren">class Point {
construct new(x, y) {
_x = x
_y = y
}
 
x { _x }
y { _y }
 
toString { "(%(_x), %(_y))" }
}
 
class Line {
construct new(s, e) {
_s = s
_e = e
}
 
s { _s }
e { _e }
}
 
var findIntersection = Fn.new { |l1, l2|
var a1 = l1.e.y - l1.s.y
var b1 = l1.s.x - l1.e.x
var c1 = a1*l1.s.x + b1*l1.s.y
 
var a2 = l2.e.y - l2.s.y
var b2 = l2.s.x - l2.e.x
var c2 = a2*l2.s.x + b2*l2.s.y
 
var delta = a1*b2 - a2*b1
// if lines are parallel, intersection point will contain infinite values
return Point.new((b2*c1 - b1*c2)/delta, (a1*c2 - a2*c1)/delta)
}
 
var l1 = Line.new(Point.new(4, 0), Point.new(6, 10))
var l2 = Line.new(Point.new(0, 3), Point.new(10, 7))
System.print(findIntersection.call(l1, l2))
l1 = Line.new(Point.new(0, 0), Point.new(1, 1))
l2 = Line.new(Point.new(1, 2), Point.new(4, 5))
System.print(findIntersection.call(l1, l2))</syntaxhighlight>
 
{{out}}
<pre>
(5, 5)
(-infinity, -infinity)
</pre>
 
=={{header|XPL0}}==
<syntaxhighlight lang="xpl0">func real Det; real A0, B0, A1, B1;
return A0*B1 - A1*B0;
 
func Cramer; real A0, B0, C0, A1, B1, C1;
real Denom;
[Denom:= Det(A0, B0, A1, B1);
RlOut(0, Det(C0, B0, C1, B1) / Denom);
RlOut(0, Det(A0, C0, A1, C1) / Denom);
];
 
real L0, L1, M0, M1;
[L0:= [[ 4., 0.], [ 6., 10.]];
L1:= [[ 0., 3.], [10., 7.]];
M0:= (L0(1,1) - L0(0,1)) / (L0(1,0) - L0(0,0));
M1:= (L1(1,1) - L1(0,1)) / (L1(1,0) - L1(0,0));
Cramer(M0, -1., M0*L0(0,0)-L0(0,1), M1, -1., M1*L1(0,0)-L1(0,1));
]</syntaxhighlight>
 
{{out}}
<pre>
5.00000 5.00000
</pre>
 
=={{header|zkl}}==
{{trans|C++}}
<langsyntaxhighlight lang="zkl">fcn lineIntersect(ax,ay, bx,by, cx,cy, dx,dy){ // --> (x,y)
detAB,detCD := det(ax,ay, bx,by), det(cx,cy, dx,dy);
abDx,cdDx := ax - bx, cx - dx; // delta x
Line 1,599 ⟶ 3,021:
return(xnom/denom, ynom/denom);
}
fcn det(a,b,c,d){ a*d - b*c } // determinant</langsyntaxhighlight>
<langsyntaxhighlight lang="zkl">lineIntersect(4.0,0.0, 6.0,10.0, 0.0,3.0, 10.0,7.0).println();</langsyntaxhighlight>
{{out}}
<pre>
2,060

edits