• #### Straight line intersection: 2 by 2 system of linear equations, what

From GianLuigi Piacentini@21:1/5 to Noskosteve on Mon Nov 2 19:35:48 2015
Noskosteve wrote:

On Tuesday, January 27, 2015 at 3:01:56 PM UTC-6, GianLuigi Piacentini
wrote:
Hi all,

so far, I solved this kind of problem as a 2 by 2 system of linear
(parametric) equation, using a routine from a math library (SLATEC).
This
solver makes acrobacies to ensure numerical stability, minimize
round-off errors, and so on. That's fine, but seem to me an overkill for
a 2 by 2. Mantyla in his 'Introduction to Solid Modeling', solves
directly (I think it's Cramer's rule, but equations are so simple...)
without too much worry
about numerical aspects. He only checks for a non-zero denominator.
So far I do not have speed or memory constraint, I can go well with
SLATEC, but I would like to hear experts opinion on the subject.
If you will point me to alternative solvers, consider that it's an hobby
project and only public domain stuff is eligible (possibly Fortran,
alternatively Ada, Basic, c or Pascal - languages that I hope to be able
to understand) .

Gigi

I know this is quite late and I do not know if this is what you are after, but.... From the C.G.A. FAQ:

Subject 1.03: How do I find intersections of 2 2D line segments?
This problem can be extremely easy or extremely difficult depends on
your applications. If all you want is the intersection point, the
following should work:

You can consider the word "vector" to mean "point" or "location".

Let A,B,C,D be 2-space position vectors. This means that A is located
at Ax, Ay ; B is located at Bx, By; etc. Then the directed line
segments AB & CD are given by:
AB=A+r(B-A), r in [0,1]
CD=C+s(D-C), s in [0,1]

This means that A & B are two points on line AB and C & D are two points
on line CD.

If AB & CD intersect, then
A+r(B-A)=C+s(D-C), or

Ax+r(Bx-Ax)=Cx+s(Dx-Cx)
Ay+r(By-Ay)=Cy+s(Dy-Cy) for some r,s in [0,1]

Solving the above for r and s yields
(Ay-Cy)(Dx-Cx)-(Ax-Cx)(Dy-Cy)
r = ----------------------------- (eqn 1)
(Bx-Ax)(Dy-Cy)-(By-Ay)(Dx-Cx)

(Ay-Cy)(Bx-Ax)-(Ax-Cx)(By-Ay)
s = ----------------------------- (eqn 2)
(Bx-Ax)(Dy-Cy)-(By-Ay)(Dx-Cx)

Let P be the position/location (vector) of the intersection point,
then
P=A+r(B-A) or

Px=Ax+r(Bx-Ax)
Py=Ay+r(By-Ay)

Note that "s" is not needed for position of intersection.

By examining the values of r & s, you can also determine some
other limiting conditions:

If 0<=r<=1 & 0<=s<=1, intersection exists
r<0 or r>1 or s<0 or s>1 line segments do not intersect

If the denominator in eqn 1 is zero, AB & CD are parallel
If the numerator in eqn 1 is also zero, AB & CD are collinear.

If they are collinear, then the segments may be projected to the x-
or y-axis, and overlap of the projected intervals checked.

If the intersection point of the 2 lines are needed (lines in this
context mean infinite lines) regardless whether the two line
segments intersect, then

If r>1, P is located on extension of AB
If r<0, P is located on extension of BA
If s>1, P is located on extension of CD
If s<0, P is located on extension of DC

Also note that the denominators of eqn 1 & 2 are identical and thus,
only need to be calculated once.

References:

[O'Rourke (C)] pp. 249-51
[Gems III] pp. 199-202 "Faster Line Segment Intersection,"

Thanks.

Seems to me that we have the usual problems: possible cancellation in the floating point subtraction (I think we cannot overcome this) and the
equalities to zero.
We are living in a floating point world, so probably the equalities are to
be transformed into ABS(value) < epsilon, where epsilon is a small number.
And now the problem is in properly choosing epsilon.

Any guidance ?

Gigi

--- SoupGate-Win32 v1.05
* Origin: fsxNet Usenet Gateway (21:1/5)
• From Noskosteve@21:1/5 to GianLuigi Piacentini on Sat Oct 31 16:00:24 2015
On Tuesday, January 27, 2015 at 3:01:56 PM UTC-6, GianLuigi Piacentini wrote:
Hi all,

so far, I solved this kind of problem as a 2 by 2 system of linear (parametric) equation, using a routine from a math library (SLATEC). This solver makes acrobacies to ensure numerical stability, minimize round-off errors, and so on. That's fine, but seem to me an overkill for a 2 by 2. Mantyla in his 'Introduction to Solid Modeling', solves directly (I think it's Cramer's rule, but equations are so simple...) without too much worry about numerical aspects. He only checks for a non-zero denominator.
So far I do not have speed or memory constraint, I can go well with SLATEC, but I would like to hear experts opinion on the subject.
If you will point me to alternative solvers, consider that it's an hobby project and only public domain stuff is eligible (possibly Fortran, alternatively Ada, Basic, c or Pascal - languages that I hope to be able to understand) .

Gigi

I know this is quite late and I do not know if this is what you are after, but....
From the C.G.A. FAQ:

Subject 1.03: How do I find intersections of 2 2D line segments?
This problem can be extremely easy or extremely difficult depends on your applications. If all you want is the intersection point, the following should work:

You can consider the word "vector" to mean "point" or "location".

Let A,B,C,D be 2-space position vectors. This means that A is located at Ax, Ay ; B is located at Bx, By; etc. Then the directed line segments AB & CD are given by:
AB=A+r(B-A), r in [0,1]
CD=C+s(D-C), s in [0,1]

This means that A & B are two points on line AB and C & D are two points on line CD.

If AB & CD intersect, then
A+r(B-A)=C+s(D-C), or

Ax+r(Bx-Ax)=Cx+s(Dx-Cx)
Ay+r(By-Ay)=Cy+s(Dy-Cy) for some r,s in [0,1]

Solving the above for r and s yields
(Ay-Cy)(Dx-Cx)-(Ax-Cx)(Dy-Cy)
r = ----------------------------- (eqn 1)
(Bx-Ax)(Dy-Cy)-(By-Ay)(Dx-Cx)

(Ay-Cy)(Bx-Ax)-(Ax-Cx)(By-Ay)
s = ----------------------------- (eqn 2)
(Bx-Ax)(Dy-Cy)-(By-Ay)(Dx-Cx)

Let P be the position/location (vector) of the intersection point, then
P=A+r(B-A) or

Px=Ax+r(Bx-Ax)
Py=Ay+r(By-Ay)

Note that "s" is not needed for position of intersection.

By examining the values of r & s, you can also determine some
other limiting conditions:

If 0<=r<=1 & 0<=s<=1, intersection exists
r<0 or r>1 or s<0 or s>1 line segments do not intersect

If the denominator in eqn 1 is zero, AB & CD are parallel
If the numerator in eqn 1 is also zero, AB & CD are collinear.

If they are collinear, then the segments may be projected to the x-
or y-axis, and overlap of the projected intervals checked.

If the intersection point of the 2 lines are needed (lines in this
context mean infinite lines) regardless whether the two line
segments intersect, then

If r>1, P is located on extension of AB
If r<0, P is located on extension of BA
If s>1, P is located on extension of CD
If s<0, P is located on extension of DC

Also note that the denominators of eqn 1 & 2 are identical and thus, only need to be calculated once.

References:

[O'Rourke (C)] pp. 249-51
[Gems III] pp. 199-202 "Faster Line Segment Intersection,"

--- SoupGate-Win32 v1.05
* Origin: fsxNet Usenet Gateway (21:1/5)
• From Noskosteve@21:1/5 to GianLuigi Piacentini on Mon Nov 2 12:41:59 2015
On Monday, November 2, 2015 at 12:35:54 PM UTC-6, GianLuigi Piacentini wrote:
Noskosteve wrote:

On Tuesday, January 27, 2015 at 3:01:56 PM UTC-6, GianLuigi Piacentini wrote:
Hi all,

so far, I solved this kind of problem as a 2 by 2 system of linear
(parametric) equation, using a routine from a math library (SLATEC).
This
solver makes acrobacies to ensure numerical stability, minimize
round-off errors, and so on. That's fine, but seem to me an overkill for >> a 2 by 2. Mantyla in his 'Introduction to Solid Modeling', solves
directly (I think it's Cramer's rule, but equations are so simple...)
without too much worry
about numerical aspects. He only checks for a non-zero denominator.
So far I do not have speed or memory constraint, I can go well with
SLATEC, but I would like to hear experts opinion on the subject.
If you will point me to alternative solvers, consider that it's an hobby >> project and only public domain stuff is eligible (possibly Fortran,
alternatively Ada, Basic, c or Pascal - languages that I hope to be able >> to understand) .

Gigi

I know this is quite late and I do not know if this is what you are after, but.... From the C.G.A. FAQ:

Subject 1.03: How do I find intersections of 2 2D line segments?
This problem can be extremely easy or extremely difficult depends on
your applications. If all you want is the intersection point, the
following should work:

You can consider the word "vector" to mean "point" or "location".

Let A,B,C,D be 2-space position vectors. This means that A is located
at Ax, Ay ; B is located at Bx, By; etc. Then the directed line
segments AB & CD are given by:
AB=A+r(B-A), r in [0,1]
CD=C+s(D-C), s in [0,1]

This means that A & B are two points on line AB and C & D are two points
on line CD.

If AB & CD intersect, then
A+r(B-A)=C+s(D-C), or

Ax+r(Bx-Ax)=Cx+s(Dx-Cx)
Ay+r(By-Ay)=Cy+s(Dy-Cy) for some r,s in [0,1]

Solving the above for r and s yields
(Ay-Cy)(Dx-Cx)-(Ax-Cx)(Dy-Cy)
r = ----------------------------- (eqn 1)
(Bx-Ax)(Dy-Cy)-(By-Ay)(Dx-Cx)

(Ay-Cy)(Bx-Ax)-(Ax-Cx)(By-Ay)
s = ----------------------------- (eqn 2)
(Bx-Ax)(Dy-Cy)-(By-Ay)(Dx-Cx)

Let P be the position/location (vector) of the intersection point,
then
P=A+r(B-A) or

Px=Ax+r(Bx-Ax)
Py=Ay+r(By-Ay)

Note that "s" is not needed for position of intersection.

By examining the values of r & s, you can also determine some
other limiting conditions:

If 0<=r<=1 & 0<=s<=1, intersection exists
r<0 or r>1 or s<0 or s>1 line segments do not intersect

If the denominator in eqn 1 is zero, AB & CD are parallel
If the numerator in eqn 1 is also zero, AB & CD are collinear.

If they are collinear, then the segments may be projected to the x-
or y-axis, and overlap of the projected intervals checked.

If the intersection point of the 2 lines are needed (lines in this
context mean infinite lines) regardless whether the two line
segments intersect, then

If r>1, P is located on extension of AB
If r<0, P is located on extension of BA
If s>1, P is located on extension of CD
If s<0, P is located on extension of DC

Also note that the denominators of eqn 1 & 2 are identical and thus,
only need to be calculated once.

References:

[O'Rourke (C)] pp. 249-51
[Gems III] pp. 199-202 "Faster Line Segment Intersection,"

Thanks.

Seems to me that we have the usual problems: possible cancellation in the floating point subtraction (I think we cannot overcome this) and the equalities to zero.
We are living in a floating point world, so probably the equalities are to
be transformed into ABS(value) < epsilon, where epsilon is a small number. And now the problem is in properly choosing epsilon.

Any guidance ?

Gigi

I can not add anything. I used this method on a floating point platform several years ago and had no problems.
Ciao, Steve

--- SoupGate-Win32 v1.05
* Origin: fsxNet Usenet Gateway (21:1/5)