Intersection point of 2 lines defined by 2 points each The 2019 Stack Overflow Developer Survey Results Are InIntersection between two linesParallel Lines, One point on each.Intersection between 2 linesStraight lines - point of intersectionFinding the intersection point between two lines using a matrixCalculate intersection point between two linescollision point of circle and lineFind intersection point of two straight linesIntersection point of multiple 3D linesFour Dimensional intersection point

writing variables above the numbers in tikz picture

Mathematics of imaging the black hole

Is it possible for absolutely everyone to attain enlightenment?

How to charge AirPods to keep battery healthy?

Why doesn't UInt have a toDouble()?

If I score a critical hit on an 18 or higher, what are my chances of getting a critical hit if I roll 3d20?

What is the motivation for a law requiring 2 parties to consent for recording a conversation

Slides for 30 min~1 hr Skype tenure track application interview

Button changing its text & action. Good or terrible?

Why are there uneven bright areas in this photo of black hole?

Worn-tile Scrabble

What is this sharp, curved notch on my knife for?

Can a flute soloist sit?

Relationship between Gromov-Witten and Taubes' Gromov invariant

Why not take a picture of a closer black hole?

How do PCB vias affect signal quality?

Flight paths in orbit around Ceres?

How do I free up internal storage if I don't have any apps downloaded?

How to obtain a position of last non-zero element

What is this business jet?

How did passengers keep warm on sail ships?

Getting crown tickets for Statue of Liberty

Is it safe to harvest rainwater that fell on solar panels?

Why doesn't shell automatically fix "useless use of cat"?



Intersection point of 2 lines defined by 2 points each



The 2019 Stack Overflow Developer Survey Results Are InIntersection between two linesParallel Lines, One point on each.Intersection between 2 linesStraight lines - point of intersectionFinding the intersection point between two lines using a matrixCalculate intersection point between two linescollision point of circle and lineFind intersection point of two straight linesIntersection point of multiple 3D linesFour Dimensional intersection point










3












$begingroup$


I'm implementing this in code, but I'll rewrite it so that it is easier understood (like pseudocode):



# a = pt 1 on line 1
# b = pt 2 on line 1
# c = pt 1 on line 2
# d = pt 2 on line 2
def intersect(a,b,c,d):

# stuff for line 1
a1 = b.y-a.y
b1 = a.x-b.x
c1 = a1*a.x + b1*a.y

# stuff for line 2
a2 = d.y-c.y
b2 = c.x-d.x
c2 = a2*c.x + b2*c.y

determinant = a1*b2 - a2*b1

if (determinant == 0):
# Return (infinity, infinity) if they never intersect
# By "never intersect", I mean that the lines are parallel to each other
return math.inf, math,inf
else:
x = (b2*c1 - b1*c2)/determinant
y = (a1*c2 - a2*c1)/determinant
return x,y


All the above works, ... but only does by assuming that the lines extend infinitely in each direction, like a linear equation. I'll show what I mean here.



There are the 2 lines, red and green, and the gold dot is what is returned when I test this code ... but the lines don't actually intersect. What can be used to test whether the lines truly intersect?



Heres the actual Python code if needed.










share|cite|improve this question











$endgroup$
















    3












    $begingroup$


    I'm implementing this in code, but I'll rewrite it so that it is easier understood (like pseudocode):



    # a = pt 1 on line 1
    # b = pt 2 on line 1
    # c = pt 1 on line 2
    # d = pt 2 on line 2
    def intersect(a,b,c,d):

    # stuff for line 1
    a1 = b.y-a.y
    b1 = a.x-b.x
    c1 = a1*a.x + b1*a.y

    # stuff for line 2
    a2 = d.y-c.y
    b2 = c.x-d.x
    c2 = a2*c.x + b2*c.y

    determinant = a1*b2 - a2*b1

    if (determinant == 0):
    # Return (infinity, infinity) if they never intersect
    # By "never intersect", I mean that the lines are parallel to each other
    return math.inf, math,inf
    else:
    x = (b2*c1 - b1*c2)/determinant
    y = (a1*c2 - a2*c1)/determinant
    return x,y


    All the above works, ... but only does by assuming that the lines extend infinitely in each direction, like a linear equation. I'll show what I mean here.



    There are the 2 lines, red and green, and the gold dot is what is returned when I test this code ... but the lines don't actually intersect. What can be used to test whether the lines truly intersect?



    Heres the actual Python code if needed.










    share|cite|improve this question











    $endgroup$














      3












      3








      3





      $begingroup$


      I'm implementing this in code, but I'll rewrite it so that it is easier understood (like pseudocode):



      # a = pt 1 on line 1
      # b = pt 2 on line 1
      # c = pt 1 on line 2
      # d = pt 2 on line 2
      def intersect(a,b,c,d):

      # stuff for line 1
      a1 = b.y-a.y
      b1 = a.x-b.x
      c1 = a1*a.x + b1*a.y

      # stuff for line 2
      a2 = d.y-c.y
      b2 = c.x-d.x
      c2 = a2*c.x + b2*c.y

      determinant = a1*b2 - a2*b1

      if (determinant == 0):
      # Return (infinity, infinity) if they never intersect
      # By "never intersect", I mean that the lines are parallel to each other
      return math.inf, math,inf
      else:
      x = (b2*c1 - b1*c2)/determinant
      y = (a1*c2 - a2*c1)/determinant
      return x,y


      All the above works, ... but only does by assuming that the lines extend infinitely in each direction, like a linear equation. I'll show what I mean here.



      There are the 2 lines, red and green, and the gold dot is what is returned when I test this code ... but the lines don't actually intersect. What can be used to test whether the lines truly intersect?



      Heres the actual Python code if needed.










      share|cite|improve this question











      $endgroup$




      I'm implementing this in code, but I'll rewrite it so that it is easier understood (like pseudocode):



      # a = pt 1 on line 1
      # b = pt 2 on line 1
      # c = pt 1 on line 2
      # d = pt 2 on line 2
      def intersect(a,b,c,d):

      # stuff for line 1
      a1 = b.y-a.y
      b1 = a.x-b.x
      c1 = a1*a.x + b1*a.y

      # stuff for line 2
      a2 = d.y-c.y
      b2 = c.x-d.x
      c2 = a2*c.x + b2*c.y

      determinant = a1*b2 - a2*b1

      if (determinant == 0):
      # Return (infinity, infinity) if they never intersect
      # By "never intersect", I mean that the lines are parallel to each other
      return math.inf, math,inf
      else:
      x = (b2*c1 - b1*c2)/determinant
      y = (a1*c2 - a2*c1)/determinant
      return x,y


      All the above works, ... but only does by assuming that the lines extend infinitely in each direction, like a linear equation. I'll show what I mean here.



      There are the 2 lines, red and green, and the gold dot is what is returned when I test this code ... but the lines don't actually intersect. What can be used to test whether the lines truly intersect?



      Heres the actual Python code if needed.







      linear-algebra matrices python






      share|cite|improve this question















      share|cite|improve this question













      share|cite|improve this question




      share|cite|improve this question








      edited Apr 6 at 1:29









      Ethan Bolker

      46k553120




      46k553120










      asked Apr 6 at 0:13









      crazicrafter1crazicrafter1

      247




      247




















          3 Answers
          3






          active

          oldest

          votes


















          5












          $begingroup$

          I think you are asking for the intersection point (if any) of two line segments, not two lines.



          Once you find the intersection point $P$ as you have, you can check that it is between the endpoints $A$ and $B$ of a segment by solving the equation
          $$
          tA + (1-t)B = P
          $$

          for $t$ and checking that $t$ is between $0$ and $1$. That equation will have a solution because you know $P$ is on the line. Do that for each of the two segments.



          Warning: you may have numerical instability if the determinant is close to $0$. That will happen when the lines are nearly parallel.



          (There may be a shorter way to do this from scratch, but this will work.)






          share|cite|improve this answer











          $endgroup$




















            3












            $begingroup$

            You have the point $x$ where the infinite lines intersect. You need to check whether that point is on both finite line segments.



            Line segment 1 has endpoints $a$ and $b$. Use these to make a vector $vecab=b-a$. If the dot product $vecabcdotvecax$ is positive, then $x$ is forward of $a$; if it's negative, then $x$ is behind $a$. Likewise, if $vecabcdotvecbx$ is positive, then $x$ is forward of $b$. The point $x$ is on the segment if it's between $a$ and $b$.



            Do the same test for the other line segment.






            share|cite|improve this answer









            $endgroup$




















              2












              $begingroup$

              This is an elaboration on Ethan Bolker's post.



              Every point on the line segment from $a$ to $b$ can be expressed as $$a + t(b-a)$$ for some $t$ between $0$ and $1$. Likewise, every point on the line segment from $c$ to $d$ can be expressed as $$c + s(d-c)$$ for some $s$ between $0$ and $1$. Any intersection point can be expressed in both forms, so we will have



              $$a + t(b-a) = c + s(d - c)$$
              re-arranging,
              $$t(b - a) + s(c - d) = c - a$$



              Letting $n = b - a, m = c-d$, and $p = c - a$, and switching to coordinates, we have
              $$n_xt + m_xs = p_x\n_yt + m_ys = p_y$$



              Instead of solving directly for the coordinates of the point of intersection, you should solve for $t$ and $s$. Letting
              $$D = n_xm_y - n_ym_x\Q_x = m_yp_x - m_xp_y\Q_y =n_xp_y - n_yp_x$$



              We have $$t=frac Q_xD, quad s = frac Q_yD$$



              In particular, we can figure out the following before doing the divisions:



              • If $D$ is $0$, then the segments are parallel - the only way they can intersect in a unique point is if the two segments are adjacent and have a common endpoint (for instance $b = c$, and $a$ and $d$ are on opposite sides of the common point).

              • If $D$ is the opposite sign of either $Q_x$ or $Q_y$, then one of $t$ or $s < 0$, so the line segments do not intersect.

              • If $|D|$ is smaller than $|Q_x|$ or smaller than $|Q_y|$, then one of $t$ or $s > 1$, and again the line segments do not intersect.

              • Otherwise, the segments do intersect, and you either calculate $t$ and $a + t(b -a)$ or calculate $s$ and $c + s(d - c)$ to get the point of intersection.

              This is a more numerically stable approach to the problem.






              share|cite|improve this answer











              $endgroup$












              • $begingroup$
                @crazicrafter1 This is a much better algorithm than mine built on yours and you should implement it.
                $endgroup$
                – Ethan Bolker
                Apr 6 at 10:48











              • $begingroup$
                @EthanBolker - the problem is one I already had personal experience with.
                $endgroup$
                – Paul Sinclair
                Apr 6 at 16:10











              Your Answer





              StackExchange.ifUsing("editor", function ()
              return StackExchange.using("mathjaxEditing", function ()
              StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix)
              StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["$", "$"], ["\\(","\\)"]]);
              );
              );
              , "mathjax-editing");

              StackExchange.ready(function()
              var channelOptions =
              tags: "".split(" "),
              id: "69"
              ;
              initTagRenderer("".split(" "), "".split(" "), channelOptions);

              StackExchange.using("externalEditor", function()
              // Have to fire editor after snippets, if snippets enabled
              if (StackExchange.settings.snippets.snippetsEnabled)
              StackExchange.using("snippets", function()
              createEditor();
              );

              else
              createEditor();

              );

              function createEditor()
              StackExchange.prepareEditor(
              heartbeatType: 'answer',
              autoActivateHeartbeat: false,
              convertImagesToLinks: true,
              noModals: true,
              showLowRepImageUploadWarning: true,
              reputationToPostImages: 10,
              bindNavPrevention: true,
              postfix: "",
              imageUploader:
              brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
              contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
              allowUrls: true
              ,
              noCode: true, onDemand: true,
              discardSelector: ".discard-answer"
              ,immediatelyShowMarkdownHelp:true
              );



              );













              draft saved

              draft discarded


















              StackExchange.ready(
              function ()
              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmath.stackexchange.com%2fquestions%2f3176543%2fintersection-point-of-2-lines-defined-by-2-points-each%23new-answer', 'question_page');

              );

              Post as a guest















              Required, but never shown

























              3 Answers
              3






              active

              oldest

              votes








              3 Answers
              3






              active

              oldest

              votes









              active

              oldest

              votes






              active

              oldest

              votes









              5












              $begingroup$

              I think you are asking for the intersection point (if any) of two line segments, not two lines.



              Once you find the intersection point $P$ as you have, you can check that it is between the endpoints $A$ and $B$ of a segment by solving the equation
              $$
              tA + (1-t)B = P
              $$

              for $t$ and checking that $t$ is between $0$ and $1$. That equation will have a solution because you know $P$ is on the line. Do that for each of the two segments.



              Warning: you may have numerical instability if the determinant is close to $0$. That will happen when the lines are nearly parallel.



              (There may be a shorter way to do this from scratch, but this will work.)






              share|cite|improve this answer











              $endgroup$

















                5












                $begingroup$

                I think you are asking for the intersection point (if any) of two line segments, not two lines.



                Once you find the intersection point $P$ as you have, you can check that it is between the endpoints $A$ and $B$ of a segment by solving the equation
                $$
                tA + (1-t)B = P
                $$

                for $t$ and checking that $t$ is between $0$ and $1$. That equation will have a solution because you know $P$ is on the line. Do that for each of the two segments.



                Warning: you may have numerical instability if the determinant is close to $0$. That will happen when the lines are nearly parallel.



                (There may be a shorter way to do this from scratch, but this will work.)






                share|cite|improve this answer











                $endgroup$















                  5












                  5








                  5





                  $begingroup$

                  I think you are asking for the intersection point (if any) of two line segments, not two lines.



                  Once you find the intersection point $P$ as you have, you can check that it is between the endpoints $A$ and $B$ of a segment by solving the equation
                  $$
                  tA + (1-t)B = P
                  $$

                  for $t$ and checking that $t$ is between $0$ and $1$. That equation will have a solution because you know $P$ is on the line. Do that for each of the two segments.



                  Warning: you may have numerical instability if the determinant is close to $0$. That will happen when the lines are nearly parallel.



                  (There may be a shorter way to do this from scratch, but this will work.)






                  share|cite|improve this answer











                  $endgroup$



                  I think you are asking for the intersection point (if any) of two line segments, not two lines.



                  Once you find the intersection point $P$ as you have, you can check that it is between the endpoints $A$ and $B$ of a segment by solving the equation
                  $$
                  tA + (1-t)B = P
                  $$

                  for $t$ and checking that $t$ is between $0$ and $1$. That equation will have a solution because you know $P$ is on the line. Do that for each of the two segments.



                  Warning: you may have numerical instability if the determinant is close to $0$. That will happen when the lines are nearly parallel.



                  (There may be a shorter way to do this from scratch, but this will work.)







                  share|cite|improve this answer














                  share|cite|improve this answer



                  share|cite|improve this answer








                  edited Apr 6 at 1:46

























                  answered Apr 6 at 1:34









                  Ethan BolkerEthan Bolker

                  46k553120




                  46k553120





















                      3












                      $begingroup$

                      You have the point $x$ where the infinite lines intersect. You need to check whether that point is on both finite line segments.



                      Line segment 1 has endpoints $a$ and $b$. Use these to make a vector $vecab=b-a$. If the dot product $vecabcdotvecax$ is positive, then $x$ is forward of $a$; if it's negative, then $x$ is behind $a$. Likewise, if $vecabcdotvecbx$ is positive, then $x$ is forward of $b$. The point $x$ is on the segment if it's between $a$ and $b$.



                      Do the same test for the other line segment.






                      share|cite|improve this answer









                      $endgroup$

















                        3












                        $begingroup$

                        You have the point $x$ where the infinite lines intersect. You need to check whether that point is on both finite line segments.



                        Line segment 1 has endpoints $a$ and $b$. Use these to make a vector $vecab=b-a$. If the dot product $vecabcdotvecax$ is positive, then $x$ is forward of $a$; if it's negative, then $x$ is behind $a$. Likewise, if $vecabcdotvecbx$ is positive, then $x$ is forward of $b$. The point $x$ is on the segment if it's between $a$ and $b$.



                        Do the same test for the other line segment.






                        share|cite|improve this answer









                        $endgroup$















                          3












                          3








                          3





                          $begingroup$

                          You have the point $x$ where the infinite lines intersect. You need to check whether that point is on both finite line segments.



                          Line segment 1 has endpoints $a$ and $b$. Use these to make a vector $vecab=b-a$. If the dot product $vecabcdotvecax$ is positive, then $x$ is forward of $a$; if it's negative, then $x$ is behind $a$. Likewise, if $vecabcdotvecbx$ is positive, then $x$ is forward of $b$. The point $x$ is on the segment if it's between $a$ and $b$.



                          Do the same test for the other line segment.






                          share|cite|improve this answer









                          $endgroup$



                          You have the point $x$ where the infinite lines intersect. You need to check whether that point is on both finite line segments.



                          Line segment 1 has endpoints $a$ and $b$. Use these to make a vector $vecab=b-a$. If the dot product $vecabcdotvecax$ is positive, then $x$ is forward of $a$; if it's negative, then $x$ is behind $a$. Likewise, if $vecabcdotvecbx$ is positive, then $x$ is forward of $b$. The point $x$ is on the segment if it's between $a$ and $b$.



                          Do the same test for the other line segment.







                          share|cite|improve this answer












                          share|cite|improve this answer



                          share|cite|improve this answer










                          answered Apr 6 at 1:42









                          mr_e_manmr_e_man

                          1,2001424




                          1,2001424





















                              2












                              $begingroup$

                              This is an elaboration on Ethan Bolker's post.



                              Every point on the line segment from $a$ to $b$ can be expressed as $$a + t(b-a)$$ for some $t$ between $0$ and $1$. Likewise, every point on the line segment from $c$ to $d$ can be expressed as $$c + s(d-c)$$ for some $s$ between $0$ and $1$. Any intersection point can be expressed in both forms, so we will have



                              $$a + t(b-a) = c + s(d - c)$$
                              re-arranging,
                              $$t(b - a) + s(c - d) = c - a$$



                              Letting $n = b - a, m = c-d$, and $p = c - a$, and switching to coordinates, we have
                              $$n_xt + m_xs = p_x\n_yt + m_ys = p_y$$



                              Instead of solving directly for the coordinates of the point of intersection, you should solve for $t$ and $s$. Letting
                              $$D = n_xm_y - n_ym_x\Q_x = m_yp_x - m_xp_y\Q_y =n_xp_y - n_yp_x$$



                              We have $$t=frac Q_xD, quad s = frac Q_yD$$



                              In particular, we can figure out the following before doing the divisions:



                              • If $D$ is $0$, then the segments are parallel - the only way they can intersect in a unique point is if the two segments are adjacent and have a common endpoint (for instance $b = c$, and $a$ and $d$ are on opposite sides of the common point).

                              • If $D$ is the opposite sign of either $Q_x$ or $Q_y$, then one of $t$ or $s < 0$, so the line segments do not intersect.

                              • If $|D|$ is smaller than $|Q_x|$ or smaller than $|Q_y|$, then one of $t$ or $s > 1$, and again the line segments do not intersect.

                              • Otherwise, the segments do intersect, and you either calculate $t$ and $a + t(b -a)$ or calculate $s$ and $c + s(d - c)$ to get the point of intersection.

                              This is a more numerically stable approach to the problem.






                              share|cite|improve this answer











                              $endgroup$












                              • $begingroup$
                                @crazicrafter1 This is a much better algorithm than mine built on yours and you should implement it.
                                $endgroup$
                                – Ethan Bolker
                                Apr 6 at 10:48











                              • $begingroup$
                                @EthanBolker - the problem is one I already had personal experience with.
                                $endgroup$
                                – Paul Sinclair
                                Apr 6 at 16:10















                              2












                              $begingroup$

                              This is an elaboration on Ethan Bolker's post.



                              Every point on the line segment from $a$ to $b$ can be expressed as $$a + t(b-a)$$ for some $t$ between $0$ and $1$. Likewise, every point on the line segment from $c$ to $d$ can be expressed as $$c + s(d-c)$$ for some $s$ between $0$ and $1$. Any intersection point can be expressed in both forms, so we will have



                              $$a + t(b-a) = c + s(d - c)$$
                              re-arranging,
                              $$t(b - a) + s(c - d) = c - a$$



                              Letting $n = b - a, m = c-d$, and $p = c - a$, and switching to coordinates, we have
                              $$n_xt + m_xs = p_x\n_yt + m_ys = p_y$$



                              Instead of solving directly for the coordinates of the point of intersection, you should solve for $t$ and $s$. Letting
                              $$D = n_xm_y - n_ym_x\Q_x = m_yp_x - m_xp_y\Q_y =n_xp_y - n_yp_x$$



                              We have $$t=frac Q_xD, quad s = frac Q_yD$$



                              In particular, we can figure out the following before doing the divisions:



                              • If $D$ is $0$, then the segments are parallel - the only way they can intersect in a unique point is if the two segments are adjacent and have a common endpoint (for instance $b = c$, and $a$ and $d$ are on opposite sides of the common point).

                              • If $D$ is the opposite sign of either $Q_x$ or $Q_y$, then one of $t$ or $s < 0$, so the line segments do not intersect.

                              • If $|D|$ is smaller than $|Q_x|$ or smaller than $|Q_y|$, then one of $t$ or $s > 1$, and again the line segments do not intersect.

                              • Otherwise, the segments do intersect, and you either calculate $t$ and $a + t(b -a)$ or calculate $s$ and $c + s(d - c)$ to get the point of intersection.

                              This is a more numerically stable approach to the problem.






                              share|cite|improve this answer











                              $endgroup$












                              • $begingroup$
                                @crazicrafter1 This is a much better algorithm than mine built on yours and you should implement it.
                                $endgroup$
                                – Ethan Bolker
                                Apr 6 at 10:48











                              • $begingroup$
                                @EthanBolker - the problem is one I already had personal experience with.
                                $endgroup$
                                – Paul Sinclair
                                Apr 6 at 16:10













                              2












                              2








                              2





                              $begingroup$

                              This is an elaboration on Ethan Bolker's post.



                              Every point on the line segment from $a$ to $b$ can be expressed as $$a + t(b-a)$$ for some $t$ between $0$ and $1$. Likewise, every point on the line segment from $c$ to $d$ can be expressed as $$c + s(d-c)$$ for some $s$ between $0$ and $1$. Any intersection point can be expressed in both forms, so we will have



                              $$a + t(b-a) = c + s(d - c)$$
                              re-arranging,
                              $$t(b - a) + s(c - d) = c - a$$



                              Letting $n = b - a, m = c-d$, and $p = c - a$, and switching to coordinates, we have
                              $$n_xt + m_xs = p_x\n_yt + m_ys = p_y$$



                              Instead of solving directly for the coordinates of the point of intersection, you should solve for $t$ and $s$. Letting
                              $$D = n_xm_y - n_ym_x\Q_x = m_yp_x - m_xp_y\Q_y =n_xp_y - n_yp_x$$



                              We have $$t=frac Q_xD, quad s = frac Q_yD$$



                              In particular, we can figure out the following before doing the divisions:



                              • If $D$ is $0$, then the segments are parallel - the only way they can intersect in a unique point is if the two segments are adjacent and have a common endpoint (for instance $b = c$, and $a$ and $d$ are on opposite sides of the common point).

                              • If $D$ is the opposite sign of either $Q_x$ or $Q_y$, then one of $t$ or $s < 0$, so the line segments do not intersect.

                              • If $|D|$ is smaller than $|Q_x|$ or smaller than $|Q_y|$, then one of $t$ or $s > 1$, and again the line segments do not intersect.

                              • Otherwise, the segments do intersect, and you either calculate $t$ and $a + t(b -a)$ or calculate $s$ and $c + s(d - c)$ to get the point of intersection.

                              This is a more numerically stable approach to the problem.






                              share|cite|improve this answer











                              $endgroup$



                              This is an elaboration on Ethan Bolker's post.



                              Every point on the line segment from $a$ to $b$ can be expressed as $$a + t(b-a)$$ for some $t$ between $0$ and $1$. Likewise, every point on the line segment from $c$ to $d$ can be expressed as $$c + s(d-c)$$ for some $s$ between $0$ and $1$. Any intersection point can be expressed in both forms, so we will have



                              $$a + t(b-a) = c + s(d - c)$$
                              re-arranging,
                              $$t(b - a) + s(c - d) = c - a$$



                              Letting $n = b - a, m = c-d$, and $p = c - a$, and switching to coordinates, we have
                              $$n_xt + m_xs = p_x\n_yt + m_ys = p_y$$



                              Instead of solving directly for the coordinates of the point of intersection, you should solve for $t$ and $s$. Letting
                              $$D = n_xm_y - n_ym_x\Q_x = m_yp_x - m_xp_y\Q_y =n_xp_y - n_yp_x$$



                              We have $$t=frac Q_xD, quad s = frac Q_yD$$



                              In particular, we can figure out the following before doing the divisions:



                              • If $D$ is $0$, then the segments are parallel - the only way they can intersect in a unique point is if the two segments are adjacent and have a common endpoint (for instance $b = c$, and $a$ and $d$ are on opposite sides of the common point).

                              • If $D$ is the opposite sign of either $Q_x$ or $Q_y$, then one of $t$ or $s < 0$, so the line segments do not intersect.

                              • If $|D|$ is smaller than $|Q_x|$ or smaller than $|Q_y|$, then one of $t$ or $s > 1$, and again the line segments do not intersect.

                              • Otherwise, the segments do intersect, and you either calculate $t$ and $a + t(b -a)$ or calculate $s$ and $c + s(d - c)$ to get the point of intersection.

                              This is a more numerically stable approach to the problem.







                              share|cite|improve this answer














                              share|cite|improve this answer



                              share|cite|improve this answer








                              edited 2 days ago

























                              answered Apr 6 at 4:00









                              Paul SinclairPaul Sinclair

                              20.8k21543




                              20.8k21543











                              • $begingroup$
                                @crazicrafter1 This is a much better algorithm than mine built on yours and you should implement it.
                                $endgroup$
                                – Ethan Bolker
                                Apr 6 at 10:48











                              • $begingroup$
                                @EthanBolker - the problem is one I already had personal experience with.
                                $endgroup$
                                – Paul Sinclair
                                Apr 6 at 16:10
















                              • $begingroup$
                                @crazicrafter1 This is a much better algorithm than mine built on yours and you should implement it.
                                $endgroup$
                                – Ethan Bolker
                                Apr 6 at 10:48











                              • $begingroup$
                                @EthanBolker - the problem is one I already had personal experience with.
                                $endgroup$
                                – Paul Sinclair
                                Apr 6 at 16:10















                              $begingroup$
                              @crazicrafter1 This is a much better algorithm than mine built on yours and you should implement it.
                              $endgroup$
                              – Ethan Bolker
                              Apr 6 at 10:48





                              $begingroup$
                              @crazicrafter1 This is a much better algorithm than mine built on yours and you should implement it.
                              $endgroup$
                              – Ethan Bolker
                              Apr 6 at 10:48













                              $begingroup$
                              @EthanBolker - the problem is one I already had personal experience with.
                              $endgroup$
                              – Paul Sinclair
                              Apr 6 at 16:10




                              $begingroup$
                              @EthanBolker - the problem is one I already had personal experience with.
                              $endgroup$
                              – Paul Sinclair
                              Apr 6 at 16:10

















                              draft saved

                              draft discarded
















































                              Thanks for contributing an answer to Mathematics Stack Exchange!


                              • Please be sure to answer the question. Provide details and share your research!

                              But avoid


                              • Asking for help, clarification, or responding to other answers.

                              • Making statements based on opinion; back them up with references or personal experience.

                              Use MathJax to format equations. MathJax reference.


                              To learn more, see our tips on writing great answers.




                              draft saved


                              draft discarded














                              StackExchange.ready(
                              function ()
                              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmath.stackexchange.com%2fquestions%2f3176543%2fintersection-point-of-2-lines-defined-by-2-points-each%23new-answer', 'question_page');

                              );

                              Post as a guest















                              Required, but never shown





















































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown

































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown







                              Popular posts from this blog

                              រឿង រ៉ូមេអូ និង ហ្ស៊ុយលីយេ សង្ខេបរឿង តួអង្គ បញ្ជីណែនាំ

                              QGIS export composer to PDF scale the map [closed] Planned maintenance scheduled April 23, 2019 at 23:30 UTC (7:30pm US/Eastern) Announcing the arrival of Valued Associate #679: Cesar Manara Unicorn Meta Zoo #1: Why another podcast?Print Composer QGIS 2.6, how to export image?QGIS 2.8.1 print composer won't export all OpenCycleMap base layer tilesSave Print/Map QGIS composer view as PNG/PDF using Python (without changing anything in visible layout)?Export QGIS Print Composer PDF with searchable text labelsQGIS Print Composer does not change from landscape to portrait orientation?How can I avoid map size and scale changes in print composer?Fuzzy PDF export in QGIS running on macSierra OSExport the legend into its 100% size using Print ComposerScale-dependent rendering in QGIS PDF output

                              PDF-ში გადმოწერა სანავიგაციო მენიუproject page