Find the intersection of two lines: Difference between revisions
Find the intersection of two lines (view source)
Revision as of 16:03, 11 January 2024
, 4 months agoAdded Easylang
Alpha bravo (talk | contribs) (Added AutoHotkey) |
(Added Easylang) |
||
(40 intermediate revisions by 26 users not shown) | |||
Line 11:
<br>The 2<sup>nd</sup> line passes though <big> (0,3) </big> and <big> (10,7)</big> .
<br><br>
=={{header|11l}}==
{{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}}
<
INTERSEC CSECT
USING INTERSEC,R13 base register
Line 148 ⟶ 176:
PG DC CL80' '
REGEQU
END INTERSEC</
{{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>
Line 157 ⟶ 298:
{{works with|Ada|Ada|2005}}
<
procedure Intersection_Of_Two_Lines
Line 201 ⟶ 342:
Ada.Text_IO.Put_Line(p.y'Img);
end Intersection_Of_Two_Lines;
</syntaxhighlight>
{{out}}
<pre> 5.00000E+00 5.00000E+00
Line 208 ⟶ 349:
=={{header|ALGOL 68}}==
Using "school maths".
<
# mode to hold a point #
MODE POINT = STRUCT( REAL x, y );
Line 237 ⟶ 378:
print( ( fixed( x OF i, -8, 4 ), fixed( y OF i, -8, 4 ), newline ) )
END</
{{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}}==
<
x1 := L1[1,1], y1 := L1[1,2]
x2 := L1[2,1], y2 := L1[2,2]
Line 251 ⟶ 455:
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))
}</
Examples:<
L2 := [[0,3], [10,7]]
MsgBox % LineIntersectionByPoints(L1, L2)</
Outputs:<pre>5.000000, 5.000000</pre>
=={{header|AWK}}==
<syntaxhighlight lang="awk">
# syntax: GAWK -f FIND_THE_INTERSECTION_OF_TWO_LINES.AWK
# converted from Ring
Line 285 ⟶ 489:
return(1)
}
</syntaxhighlight>
{{out}}
<pre>
Line 300 ⟶ 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.
<
20 LET YA=0
30 LET XB=6
Line 319 ⟶ 613:
150 PRINT "YAB=";Y
160 PRINT "YCD=";YC-XC*((YD-YC)/(XD-XC))+X*((YD-YC)/(XD-XC))
170 PRINT "INTERSECTION: ";X;",";Y</
{{out}}
<pre>THE TWO LINES ARE:
Line 328 ⟶ 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">
#include<stdlib.h>
#include<stdio.h>
Line 389 ⟶ 720:
c.y = NAN;
}
else if(isnan(slopeA
c.x = a1.x;
c.y = (a1.x-b1.x)*slopeB + b1.y;
}
else if(isnan(slopeB
c.x = b1.x;
c.y = (b1.x-a1.x)*slopeA +
}
else{
Line 414 ⟶ 745:
c = intersectionPoint(extractPoint(argV[1]),extractPoint(argV[2]),extractPoint(argV[3]),extractPoint(argV[4]));
if(isnan(c.x
printf("The lines do not intersect, they are either parallel or co-incident.");
else
Line 422 ⟶ 753:
return 0;
}
</syntaxhighlight>
Invocation and output:
<pre>
Line 429 ⟶ 760:
</pre>
=={{header|C sharp|C#}}==
<
using System.Drawing;
public class Program
Line 454 ⟶ 785:
Console.WriteLine(FindIntersection(p(0f, 0f), p(1f, 1f), p(1f, 2f), p(4f, 5f)));
}
}</
{{out}}
<pre>
Line 463 ⟶ 794:
=={{header|C++}}==
<
#include <cmath>
#include <
using namespace std;
Line 477 ⟶ 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 492 ⟶ 823:
double y3my4 = y3 - y4;
double denom = Det(x1mx2, y1my2, x3mx4, y3my4);
if(denom == 0.0) // Lines don't seem to cross
{
ixOut = NAN;
Line 502 ⟶ 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 514 ⟶ 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 530 ⟶ 861:
assert(fabs(ix - 5.0) < eps);
assert(fabs(iy - 5.0) < eps);
return 0;
}</
{{out}}
<pre>result 1,5,5</pre>
=={{header|Clojure}}==
<
(defn compute-line [pt1 pt2]
(let [[x1 y1] pt1
Line 551 ⟶ 881:
{:x x
:y (+ (* (:slope line1) x)
(:offset line1))}))</
{{out}}
Line 562 ⟶ 892:
(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}}
<
struct Point {
Line 605 ⟶ 955:
l2 = Line(Point(1.0, 2.0), Point(4.0, 5.0));
writeln(findIntersection(l1, l2));
}</
{{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#}}==
<
(*
Find the point of intersection of 2 lines.
Line 624 ⟶ 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>
{{out}}
<pre>
Line 633 ⟶ 1,199:
=={{header|Factor}}==
{{works with|Factor|0.99 2020-01-23}}
<
math.matrices.laplace math.vectors prettyprint sequences ;
Line 652 ⟶ 1,218:
{ 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 .</
{{out}}
<pre>
Line 662 ⟶ 1,228:
=={{header|Fortran}}==
{{works with|Fortran|90 and later}}
<
implicit none
Line 708 ⟶ 1,274:
write(*,*)x,y
end subroutine intersect
end program intersect_two_lines</
{{out}}
<pre> 5.00000000 5.00000000 </pre>
=={{header|FreeBASIC}}==
<
' compile with: fbc -s console
#Define NaN 0 / 0 ' FreeBASIC returns -1.#IND
Line 757 ⟶ 1,323:
Print : Print "hit any key to end program"
Sleep
End</
{{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">
package main
Line 809 ⟶ 1,396:
}
}
</syntaxhighlight>
{{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}}==
<
type Point = (Float, Float)
Line 849 ⟶ 1,489:
case interSection of
Left x -> x
Right x -> show x</
{{Out}}
<pre>(5.0,5.0)</pre>
Line 856 ⟶ 1,496:
{{trans|C++}}
'''Solution:'''
<
findIntersection=: (det ,."1 [: |: -/"2) %&det -/"2</
'''Examples:'''
<
line2=: 0 3 ,: 10 7
line3=: 0 3 ,: 10 7.1
Line 875 ⟶ 1,515:
__ __
findIntersection line6 ,: line7
2.5 1.5</
=={{header|Java}}==
{{trans|Kotlin}}
<
private static class Point {
double x, y;
Line 925 ⟶ 1,565:
System.out.println(findIntersection(l1, l2));
}
}</
{{out}}
<pre>{5.000000, 5.000000}
Line 933 ⟶ 1,573:
{{Trans|Haskell}}
===ES6===
<
'use strict';
// INTERSECTION OF TWO LINES ----------------------------------------------
Line 1,006 ⟶ 1,646:
]);
return show(lrIntersection.Left || lrIntersection.Right);
})();</
{{Out}}
<pre>[5,5]</pre>
Line 1,015 ⟶ 1,655:
points P1 and P2. Array destructuring is used for simplicity.
<
def det(a;b;c;d): a*d - b*c ;
Line 1,036 ⟶ 1,676:
then error("lineIntersect: parallel lines")
else [.xnom/.denom, .ynom/.denom]
end ;</
Example:
<
{{out}}
<syntaxhighlight lang
=={{header|Julia}}==
Line 1,046 ⟶ 1,686:
{{trans|Kotlin}}
<
x::T
y::T
Line 1,076 ⟶ 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))</
{{out}}
Line 1,083 ⟶ 1,723:
==== GeometryTypes library version ====
<
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#}}
<
class PointF(val x: Float, val y: Float) {
Line 1,121 ⟶ 1,761:
l2 = LineF(PointF(1f, 2f), PointF(4f, 5f))
println(findIntersection(l1, l2))
}</
{{out}}
Line 1,128 ⟶ 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#}}
<
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 1,142 ⟶ 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))</
{{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}}==
<
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));</
{{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}}]
]</
{{out}}
<pre>Point[{5, 5}]</pre>
=={{header|MATLAB}}==
<syntaxhighlight lang="matlab">
function cross=intersection(line1,line2)
a=polyfit(line1(:,1),line1(:,2),1);
Line 1,171 ⟶ 1,892:
cross=[a(1) -1; b(1) -1]\[-a(2);-b(2)];
end
</syntaxhighlight>
{{out}}
<pre>line1=[4 0; 6 10]; line2=[0 3; 10 7]; cross=intersection(line1,line2)
Line 1,181 ⟶ 1,902:
=={{header|Modula-2}}==
<
FROM RealStr IMPORT RealToStr;
FROM Terminal IMPORT WriteString,WriteLn,ReadChar;
Line 1,237 ⟶ 1,958:
ReadChar;
END LineIntersection.</
=={{header|Nim}}==
{{trans|Go}}
<
Line = tuple
slope: float
Line 1,263 ⟶ 1,984:
var line1 = createLine((4.0, 0.0), (6.0, 10.0))
var line2 = createLine((0.0, 3.0), (10.0, 7.0))
echo
line1 = createLine((0.0, 0.0), (1.0, 1.0))
line2 = createLine((1.0, 2.0), (4.0, 5.0))
echo
{{out}}
<pre>
Line 1,277 ⟶ 1,998:
If warning are enabled the second print will issue a warning since we are trying to print out an undef
<
sub intersect {
my ($x1, $y1, $x2, $y2, $x3, $y3, $x4, $y4) = @_;
Line 1,298 ⟶ 2,019:
($ix, $iy) = intersect(0, 0, 1, 1, 1, 2, 4, 5);
print "$ix $iy\n";
</syntaxhighlight>
=={{header|Phix}}==
{{libheader|Phix/online}}
You can run this online [http://phix.x10.mx/p2js/intersect.htm here].
<!--<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}}==
<
// test lineIntersect() with visual and textual output
float lineA[] = {4, 0, 6, 10}; // try 4, 0, 6, 4
Line 1,362 ⟶ 2,088:
float y = Ay1 + uA * (Ay2 - Ay1);
return new PVector(x, y);
}</
==={{header|Processing Python mode}}===
<
def setup():
Line 1,394 ⟶ 2,120:
x = Ax1 + uA * (Ax2 - Ax1)
y = Ay1 + uA * (Ay2 - Ay1)
return x, y</
=={{header|Python}}==
Find the intersection without importing third-party libraries.
<
""" returns a (x, y) tuple or None if there is no intersection """
d = (By2 - By1) * (Ax2 - Ax1) - (Bx2 - Bx1) * (Ay2 - Ay1)
Line 1,417 ⟶ 2,143:
(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)</
{{Out}}
Line 1,426 ⟶ 2,152:
{{Works with|Python|3.7}}
<
from itertools import product
Line 1,541 ⟶ 2,267:
# MAIN ---
if __name__ == '__main__':
main()</
{{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.
<
if __name__ == "__main__":
line1 = LineString([(4, 0), (6, 10)])
line2 = LineString([(0, 3), (10, 7)])
print(line1.intersection(line2))</
{{out}}
<pre>POINT (5 5)</pre>
Line 1,557 ⟶ 2,283:
=={{header|Racket}}==
{{trans|C++}}
<
(define (det a b c d) (- (* a d) (* b c))) ; determinant
Line 1,575 ⟶ 2,301:
(module+ test (line-intersect 4 0 6 10
0 3 10 7))</
{{out}}
Line 1,586 ⟶ 2,312:
{{trans|zkl}}
<syntaxhighlight lang="raku"
Real $cx, Real $cy, Real $dx, Real $dy ) {
Line 1,611 ⟶ 2,337:
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 );</
{{out}}
<pre>Intersection point: (5 5)
Line 1,617 ⟶ 2,343:
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,622 ⟶ 2,383:
Naive implementation.
To be improved for parallel lines and degenerate lines such as y=5 or x=8.
<
Parse Value '(4.0,0.0)' With '(' xa ',' ya ')'
Parse Value '(6.0,10.0)' With '(' xb ',' yb ')'
Line 1,638 ⟶ 2,399:
Say 'yab='y
Say 'ycd='yc-xc*((yd-yc)/(xd-xc))+x*((yd-yc)/(xd-xc))
Say 'Intersection: ('||x','y')'</
{{out}}
<pre>The two lines are:
Line 1,652 ⟶ 2,413:
<br>
Variables are named after the Austrian notation for a straight line: y=k*x+d
<
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,723 ⟶ 2,484:
If res='' Then /* not any special case */
res='Intersection is ('||x'/'y')' /* that's the result */
Return ' -->' res</
{{out}}
<pre>A=(4.0/0.0) B=(6.0/10.0) C=(0.0/3.0) D=(10.0/7.0)
Line 1,741 ⟶ 2,502:
=={{header|Ring}}==
<
# Project : Find the intersection of two lines
Line 1,761 ⟶ 2,522:
see "ycd=" + (yc-xc*((yd-yc)/(xd-xc))+x*((yd-yc)/(xd-xc))) + nl
see "intersection: " + x + "," + y + nl
</syntaxhighlight>
Output:
<pre>
Line 1,771 ⟶ 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}}==
<
class Line
Line 1,792 ⟶ 2,576:
def to_s
"y = #{@a}x #{@b.positive? ? '+' : '-'} #{@b.abs}"
end
Line 1,801 ⟶ 2,585:
puts "Line #{l1} intersects line #{l2} at #{l1.intersect(l2)}."
</syntaxhighlight>
{{out}}
<pre>Line y = 5.0x
=={{header|Rust}}==
<
struct Point {
x: f64,
Line 1,852 ⟶ 2,636:
let l2 = Line(Point::new(1.0, 2.0), Point::new(4.0, 5.0));
println!("{:?}", l1.intersect(l2));
}</
{{Out}}
<pre>
Line 1,860 ⟶ 2,644:
=={{header|Scala}}==
<
val (l1, l2) = (LineF(PointF(4, 0), PointF(6, 10)), LineF(PointF(0, 3), PointF(10, 7)))
Line 1,889 ⟶ 2,673:
println(findIntersection(l01, l02))
}</
{{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)].
Line 1,896 ⟶ 2,680:
{{trans|Raku}}
<
func intersection(ax, ay, bx, by,
Line 1,919 ⟶ 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))</
{{out}}
<pre>
Line 1,928 ⟶ 2,712:
=={{header|Swift}}==
<
var x: Double
var y: Double
Line 1,963 ⟶ 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)!)")</
{{out}}
<pre>Intersection at : Point(x: 5.0, y: 5.0)</pre>
Line 1,971 ⟶ 2,755:
{{trans|Rexx}}
Simple version:
<
([A](2,2)-[A](1,2))/([A](2,1)-[A](1,1))→B
[A](1,2)-[A](1,1)*B→A
Line 1,979 ⟶ 2,763:
A+X*B→Y
C+X*D→Z
Disp {X,Y}</
{{out}}
<pre>
Line 1,985 ⟶ 2,769:
</pre>
Full version:
<
{4,2}→Dim([B])
0→M
Line 2,038 ⟶ 2,822:
End
End
Disp {X,Y,M}</
{{out}}
<pre>
Line 2,049 ⟶ 2,833:
{{works with|VBA|6.5}}
{{works with|VBA|7.1}}
<
Public Type Point
Line 2,114 ⟶ 2,898:
Debug.Assert ip.invalid
End Sub</
=={{header|Visual Basic .NET}}==
{{trans|C#}}
<
Module Module1
Line 2,143 ⟶ 2,927:
End Sub
End Module</
{{out}}
<pre>{X=5, Y=5}
Line 2,150 ⟶ 2,934:
=={{header|Wren}}==
{{trans|Kotlin}}
<
construct new(x, y) {
_x = x
Line 2,191 ⟶ 2,975:
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))</
{{out}}
Line 2,197 ⟶ 2,981:
(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++}}
<
detAB,detCD := det(ax,ay, bx,by), det(cx,cy, dx,dy);
abDx,cdDx := ax - bx, cx - dx; // delta x
Line 2,213 ⟶ 3,021:
return(xnom/denom, ynom/denom);
}
fcn det(a,b,c,d){ a*d - b*c } // determinant</
<
{{out}}
<pre>
|