Distance between line segments: near parallel case TOO

In summary, the conversation discusses the challenge of calculating the closest points and distance between two line segments, specifically when the segments are parallel. One participant shares a general algorithm they have been using, but notes its failure in cases of parallel lines. They mention adjusting a value to try and fix this issue, but have not been successful. The participant also shares specific coordinates and results of their calculations, showing a significant change in distance between two time steps. They then mention contacting an expert in the field and receiving a detailed response about the use of floating-point arithmetic and the importance of precision in calculations. They also mention finding a solution in the Geometric Tools engine source code. They mention still wanting to learn more about implementing arbitrary precision arithmetic.
  • #1
Simon666
93
0
Does anyone know a good algorithm for calculating the closest points/distance between two line segments? I use some pretty general code:

http://geomalgorithms.com/a07-_distance.html

which works in most cases but fails horribly when line segments are nearly parallel. I've been messing with the SMALL_NUM value for division overflow to no avail. The calculated distance can still vary widely when nearly parallel.
 
Mathematics news on Phys.org
  • #2
I managed to isolate a specific incident where this happens in my code. The distance between segments P1P2 and Q1Q2 changed abruptly in one timestep from 1.05 mm to 0.90 mm (yarn radius = 1 mm), causing abrupt compression spikes. In reality the distance in the original timestep is definitely also around 0.90 mm but is not calculated as such. I find that the values of s and t (s=0 for P1, 1 for P2, t=0 for Q1, 1 for Q2) for the closest points are originally 0 and 0 (as well as in the previous time steps) and then change abruptly to 0 and around 0.29 in the new time step. What it should be, I still need to check out.

P1 = (0.012711 ,-0.000688 ,-0.001097);
P2 = (0.012895 ,-0.000686 ,-0.001133);
Q1 = (0.012676 ,-0.000689 ,-0.000999);
Q2 = (0.012859 ,-0.000687 ,-0.001034);

P1new = (0.012712, -0.000689, -0.001095);
P2new = (0.012895, -0.000687, -0.001131);
Q1new = (0.012676, -0.000690, -0.000996);
Q2new = (0.012859, -0.000688, -0.001032);

Results when calculating self contact of 15000 line segments in a few tens of fibers, one big mess:

http://users.ugent.be/~skdmeule/Fibers.jpg

Does anyone have a decent algorithm that also gives good results for nearly parallel lines?
 
Last edited by a moderator:
  • #3
I have decided to contact Dr. David H. Eberly, which is referenced as the source upon which the author in the first link I provided based himself upon. Dr. Eberly was kind enough to write an extensive reply. If I may quote part of it:

The algorithm Dan Sunday uses is different from mine (that he makes mention about at his web page). They are equivalent theoretically, and both are correct algorithms when using real-valued arithmetic. The problem shows up in an implementation of the algorithm when using floating-point arithmetic. Both algorithms rely on classifying whether two segments are parallel or not parallel. When floating-point arithmetic is used, rounding errors can cause two nonparallel segments to be processed in the parallel clause. Or two parallel segments can be processed in the nonparallel clause. The question is how the misclassification affects the results.

The parallel/nonparallel classification reduces to testing whether a 2x2 determinant is zero/not-zero. I just looked at Dan's code. He uses a floating-point tolerance on the determinant. The tolerance is 1e-8, apparently an arbitrary choice. He also mixes 'float' and 'double' in his dist3D_Segment_to_Segment function. I had tolerances in my Wild Magic source code, but removed them in my GTEngine code.

(...)

I have support for arbitrary precision arithmetic. For SegP/SegQ, the determinant is nonzero. It uses more bits of precision than 'double', (...) If you want, I can send to you a sample source code program that uses the arbitrary precision arithmetic of my library. The program will compute the squared distance between segments using exact arithmetic, switching back to 'float' or 'double' only at the very end to compute the distance (sqrt cannot be performed with arbitrary precision arithmetic).
I already asked for that sample source code and am yet to hear back from him. Meanwhile, I have downloaded the Geometric Tools engine source code from:

http://www.geometrictools.com/Downloads/Downloads.html

And looked at the code for segment to segment distance calculation, adjusted it to fit into my code and now it works fine using double's everywhere. I am still going to look into how to implement this "arbitrary precision arithmetic", I want to ask whether and where this arithmetic is necessary and still have some questions about some issues. I have however currently a temporary solution that seems to be working a lot better already.
 

1. What is the concept of "distance between line segments"?

The distance between line segments refers to the shortest distance between two non-intersecting line segments. It is measured by finding the perpendicular distance between the two line segments.

2. How is the distance between line segments calculated?

The distance between line segments can be calculated using the Pythagorean theorem, which states that in a right triangle, the square of the length of the hypotenuse (the side opposite the right angle) is equal to the sum of the squares of the other two sides.

3. What is the "near parallel case" in regards to the distance between line segments?

The near parallel case refers to two line segments that are very close to being parallel, but not exactly. In this case, the distance between the line segments can be calculated by finding the distance between the parallel lines that each segment lies on, and then finding the distance between the two parallel lines.

4. Why is calculating the distance between near parallel line segments important?

Calculating the distance between near parallel line segments is important in many fields of science and engineering, such as computer graphics, robotics, and physics. It allows for precise measurements and calculations that are necessary for accurate analysis and design.

5. Is there a specific formula for calculating the distance between near parallel line segments?

Yes, there is a formula specifically for calculating the distance between near parallel line segments, known as the "distance formula for near parallel lines". This formula takes into account the slopes and y-intercepts of the two parallel lines and the distance between them to calculate the distance between the line segments.

Similar threads

  • Programming and Computer Science
Replies
8
Views
2K
  • Linear and Abstract Algebra
Replies
8
Views
2K
  • Special and General Relativity
Replies
13
Views
1K
  • Calculus and Beyond Homework Help
Replies
2
Views
1K
  • Calculus and Beyond Homework Help
Replies
2
Views
4K
Replies
2
Views
626
Replies
1
Views
2K
Replies
1
Views
4K
  • Precalculus Mathematics Homework Help
Replies
15
Views
4K
Back
Top