Click here to Skip to main content
16,014,591 members
Home / Discussions / C / C++ / MFC
   

C / C++ / MFC

 
QuestionRe: code for calculating the point in a surface and minimum distance from the surface to a line segment, which is not in the surface. Pin
CPallini19-May-08 22:14
mveCPallini19-May-08 22:14 
AnswerRe: code for calculating the point in a surface and minimum distance from the surface to a line segment, which is not in the surface. Pin
mrby12320-May-08 5:44
mrby12320-May-08 5:44 
GeneralRe: code for calculating the point in a surface and minimum distance from the surface to a line segment, which is not in the surface. Pin
Member 419459320-May-08 3:56
Member 419459320-May-08 3:56 
GeneralRe: code for calculating the point in a surface and minimum distance from the surface to a line segment, which is not in the surface. Pin
mrby12320-May-08 5:41
mrby12320-May-08 5:41 
GeneralRe: code for calculating the point in a surface and minimum distance from the surface to a line segment, which is not in the surface. Pin
Member 419459320-May-08 7:01
Member 419459320-May-08 7:01 
GeneralRe: code for calculating the point in a surface and minimum distance from the surface to a line segment, which is not in the surface. Pin
mrby12320-May-08 8:23
mrby12320-May-08 8:23 
GeneralRe: code for calculating the point in a surface and minimum distance from the surface to a line segment, which is not in the surface. Pin
Member 419459320-May-08 11:54
Member 419459320-May-08 11:54 
GeneralRe: code for calculating the point in a surface and minimum distance from the surface to a line segment, which is not in the surface. Pin
Member 419459326-May-08 5:15
Member 419459326-May-08 5:15 
You were absolutly correct, this is a hard problem, but deterministic.

I have given this much thought and have come up with several ways to do this but
they were all very complicated (if you think the following is complicated, you
should have seen some of my mental whiteboard excercises). I finally came to the
conclusion that the following was probably the most straight forward method to
accomplish the task.

In making all comparison calculations below, be aware that even double floating
calculations may still leave values that are not "exactly" coplanar or colinear
and a very small (10^-6?) difference in dimensions should probably be accepted as
"equal". Also remember the construction engineer's creed "Measure with a
micrometer, mark with chalk, cut with an axe, and fill the gaps with caulking".
Never believe any input parameters, check everything before processing with
input values.

The problem (restated): For multiple surfaces, calculate the minimum distance to
a single line segment that does not lie on any of the surfaces, indicate which
surface, the point on that surface, the point on the line segment, and the
(minimimum) distance between the two calculated points. Any port in a storm! If
multiple solutions exist (either the distance from multiple planes to the line
segment have the same distance, or the line segment is parallel to a surface or
edge thus having multiple solutions for that distance) then only one of the
solutions need be returned.

Given: A line segment start point (x0, y0, z0), a length (l), a direction vector
(k,m,n), arrays x(i), y(i), z(i), i=1,2...n containing the coordinates of a
point.

Not given: What type of data (assumed double floating), how many structures in
the array (n used both for the limit of the array index and as an z direction
vector parameter, can't be both, assume what was meant was i=1,2...t), or how
the points are to be combined to form surfaces (assumed three adjacent indexed
points describe each triangular area).

1. Calculate the other end point for the line segment.

2. Set the desired minimum distance to max size for the data type.

3. For each triangular area (three adjacent points taken from the x,y,z arrays)
do the following:

A. Calculate the distance from one end of the line segment to the plane
containing the selected triangular area. Do not calculate the actual
distance, but skip the last step and do not take the square root, leave
it as distance squared for all steps and compare the squares and not the
distance until the very end and finally take the square root of the
final minimum distance for reporting (optimization #1).

B. Calculate the point in the plane for this distance. If this point just
happens to match any of the 3 vertices, then skip the next step and
consider the point to be inside the triangular area. This is not
necessarily the minimum distance between the line and the surface.

C. Calculate the angles between vectors drawn from this created point to
each of the 3 vertices. If the sum of the angles is 2*PI, then the
created point lies inside the triangular area and this distance is
valid. The distance is not necessarily the minimum distance.

D. Repeat the steps (A, B, and C) for the other end point.

In steps (E, F, and G) below, beware of created points that lie on vertices
and just accept that the created point falls inside the triangular area.

E. If both created points fall inside the triangular area (or both created
points just happen to fall on vertices), then pick the point and
distance which is minimum, and save them if the distance is less than
the prior minimum distance, and save the index of the x, y, z arrays
for identification of which surface had the mimumum distance (save the
first x array index), and save the matching point on the line segment
(the other end of the distance line).

F. If only one of the created points falls inside of the triangular area,
(or one of the created points just happens to fall on a vertex), but
that point has a minimum distance between the two, then pick that point
and distance and save them if the distance is less than the prior
minimum distance, and save the index of the x, y, z arrays for
identification of which surface had the mimumum distance (save the first
x array index), and save the matching point on the line segment (the
other end of the distance line).

G. If only one of the created points falls inside of the triangular area,
(or one of the created points just happens to fall on a vertex), but
that point has a maximum distance between the two, then create a line
between the two created points and calculate the intersection between
the created line and the edges of the triangular area (three results are
possible if one edge is crossed, and the other end of the line just
happens to cross at a vertex between the other two edges, or if one of
the created points happens to lie on one of the edges). By intersections
it is meant that the intersection point must lie on the actual created
line segment between the end points, and the intersection must also lie
on the edge between the two end point vertices. Pick the intersection
that lies on the created line between the created point that lies inside
the triangular area and the created point that lies outside the
triangular area. From this third created point, calculate the distance
to the line segment (on a line that is perpendicular to the line
segment) and its intersection point on the line segment, pick that point
and distance, and save them if the distance is less than the prior
minimum distance, and save the index of the x, y, z arrays for
identification of which surface had the mimumum distance (save the first
x array index), and save the matching point on the line segment (the
other end of the distance line). Optimization #2 - delay calculating the
intersection point on the line segment until it is determined that the
new distance is a new minimum distance.

H. If both of the created points fall outside of the triangular area, then
create a line between them. Calculate the intersection between this line
and the three edges of the triangular area. By intersections it is meant
that the intersection point must lie on the actual line segment between
the end points, and the intersection must also lie on the edge between
the two end point vertices. Again, up to three intersections are
possible as in G above. There are four possibilities for where this line
could intersect, and these possibilities are described below (I, J, K,
and L):

I. If the created line intersects three of the edges at the vertices (only
two vertices but a single end point for two of the edges, and both end
points for the other edge), then use the two intersected vertices as the
distance points, and calculate the distances to the line segment from
these two points (on lines that are perpendicular to the line segment),
then pick the point and distance which is minimum, and save them if the
distance is less than the prior minimum distance, and save the index of
the x, y, z arrays for identification of which surface had the mimumum
distance (save the first x array index), and save the matching point on
the line segment (the other end of the distance line). Optimization #2
again - delay calculating the intersection point on the line segment
until it is determined that the new distance is a new minimum distance.

J. If the created line intersects two of the edges at a vertex (only one
vertex but a single end point for two of the edges), then use the vertex
as the selected point, and calculate the distance to the line segment
from this point (on a line that is perpendicular to the line segment),
then pick this point and distance, and save them if the distance is less
than the prior minimum distance, and save the index of the x, y, z
arrays for identification of which surface had the mimumum distance
(save the first x array index), and save the matching point on the line
segment (the other end of the distance line). Optimization #2 again -
delay calculating the intersection point on the line segment until it
is determined that the new distance is a new minimum distance.

K. If the created line intersects two of the edges at other than the
vertices, use those two points and construct perpendiculars to the line
segment and calculate the other ends of these two distance lines. Pick
the point and distance that is the minimum distance for these two points
and save them if the distance is less than the prior minimum distance,
and save the index of the x, y, z arrays for identification of which
surface had the mimumum distance (save the first x array index), and
save the matching point on the line segment (the other end of the
distance line). Optimization #2 again - delay calculating the
intersection point on the line segment until it is determined that the
new distance is a new minimum distance.

L. If there are no intersections with the edges (at least not an
intersection somewhere between the end points of the edge), then for
each vertex, calculate the distance to the line segment (on a line that
is perpendicular to the line segment) and its intersection point on the
line segment. There are two possibilities here also (for each vertex),
described below (M and N):

M. If the intersection point from the minimum distance line lies between
the endpoints of the line segment, then pick that vertex and distance,
and save them if the distance is less than the prior minimum distance,
and save the index of the x, y, z arrays for identification of which
surface had the mimumum distance (save the first x array index), and
save the matching point on the line segment (the other end of the
distance line).

N. If the intersection point from the minimum distance line lies outside
the endpoints of the line segment, then calculate the distance to both
ends of the line segment from that vertex, then pick that vertex point
and the minimum distance, and save them if the distance is less than
the prior minimum distance, and save the index of the x, y, z arrays
for identification of which surface had the mimumum distance (save the
first x array index), and save the matching point on the line segment
(the other end of the distance line).

O. Repeat M and N for each vertex of the triangular area.

P. Repeat A through O for each triangular area described in the array of
vertex structures.

4. Undo the first optimization by taking the square root of the distance values
that had been compared during the process and return the minimum distance,
the surface, and the point on the surface and the point on the line segment.

5. Without some means of determining exactly what type of structure is defined
by the triangular surfaces (if any structure is so defined - maybe they are
just disjointed triangles), no optimization can be made concerning how to
eliminate checking some of the areas.

I can envision an open sheet structure (hyperbolic surface?), or a closed
surface like a sphere, or even a torus. The line segement could be above or
below the sheet surface, or outside or inside the closed surface, even
through the open middle of the torus.

The procedure should work correctly for all cases.

Maybe some other frequent visitors to this forum (Mr. Pallini?) would also like
to jump in and evaluate the aproach I have taken. Is it a complete solution? Is
it an optimum solution or is there a simpler way to do this?

Dave Augustine
QuestionMemory address differences with MSVC and g++/MinGW Pin
Samjiman19-May-08 11:10
Samjiman19-May-08 11:10 
QuestionRe: Memory address differences with MSVC and g++/MinGW Pin
Maximilien19-May-08 16:13
Maximilien19-May-08 16:13 
GeneralRe: Memory address differences with MSVC and g++/MinGW Pin
Samjiman19-May-08 23:52
Samjiman19-May-08 23:52 
QuestionRe: Memory address differences with MSVC and g++/MinGW Pin
CPallini19-May-08 22:18
mveCPallini19-May-08 22:18 
GeneralRe: Memory address differences with MSVC and g++/MinGW Pin
Samjiman19-May-08 23:54
Samjiman19-May-08 23:54 
QuestionHow to find out Frame Rate and Video Length [modified] Pin
80Eddy19-May-08 10:46
80Eddy19-May-08 10:46 
QuestionSetScrollSizes is cauing pinch. Pin
adityarao3119-May-08 6:16
adityarao3119-May-08 6:16 
AnswerRe: SetScrollSizes is cauing pinch. [modified] Pin
Nelek19-May-08 7:51
protectorNelek19-May-08 7:51 
GeneralRe: SetScrollSizes is cauing pinch. Pin
adityarao3119-May-08 8:15
adityarao3119-May-08 8:15 
QuestionAbout the path Pin
capint19-May-08 5:08
capint19-May-08 5:08 
AnswerRe: About the path Pin
toxcct19-May-08 5:12
toxcct19-May-08 5:12 
GeneralRe: About the path Pin
capint19-May-08 5:30
capint19-May-08 5:30 
GeneralRe: About the path [modified] Pin
toxcct19-May-08 5:34
toxcct19-May-08 5:34 
QuestionHaven't ever heard about escape sequences? Pin
CPallini19-May-08 5:46
mveCPallini19-May-08 5:46 
GeneralRe: About the path Pin
David Crow19-May-08 6:06
David Crow19-May-08 6:06 
JokeRe: About the path Pin
CPallini19-May-08 7:19
mveCPallini19-May-08 7:19 
GeneralRe: About the path Pin
Rajesh R Subramanian19-May-08 20:50
professionalRajesh R Subramanian19-May-08 20:50 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.