1
$\begingroup$

I'm having a problem how to figure out the shortest distance of a point $\vec{p} = [x_p, y_p, z_p]$ to the surface of a cone given by:

  • Start vertex $\vec{a} = [x_a, y_a, z_a]$. This is the center of the bottom circle in $\Bbb{R}^3$.
  • End vertex $\vec{b} = [x_b, y_b, z_b]$. This is the center if the top circle in $\Bbb{R}^3$.
  • The main axis of the cone is then defined as $\vec{b} - \vec{a}$.
  • Base radius $r_a$, top radius $r_b$.
  • Height $h$ is defined as $|\vec{b} - \vec{a}|$.

i tried to solve the case for a symmetric cone first but im not coming that far

$\endgroup$
  • $\begingroup$ What do you mean by "start vertex" and "end vertex"? And is it correct they are the same point as p? $\endgroup$ – DavidButlerUofA Jul 9 '14 at 8:44
  • $\begingroup$ Hi David, i edited the question so i hope its more clear now. you may define a cone with $r_a = 2, r_b = 1$ and $\vec{a} = \vec{0}, \vec{b} = [0, 1, 0]$ so you get a conical frustum at the origin pointing top. if you set $r_b=0$ you get a typical cone with its apex at [0, 1, 0] $\endgroup$ – reads Jul 9 '14 at 11:59
  • $\begingroup$ Is the axis of the cone at right angles to the two circles? Also, when you say "$[px, py, pz]$" do you mean p TIMES x, y, z or do you mean more like "$[p_x, p_y, p_z]$"? $\endgroup$ – DavidButlerUofA Jul 9 '14 at 12:02
  • $\begingroup$ I mean $p_x, p_y, p_z$. For a first step i assume that they are perpendicular yes. As soon as i have a solution for that problem, i want to try and find one for the case that they are not. $\endgroup$ – reads Jul 9 '14 at 14:36
2
$\begingroup$

3d --> 2d

You can use the rotational symmetry of the cone to reduce the problem to $\Bbb{R}^2$: take the plane which contains $p$, $a$, and $b$, i.e., the plane through the point and the axis of the cone.

Now, the point on the cone closest to $p$ lies on this plane, do all you need to do is to find the distance from a given point to the given isosceles trapezoid (which is the intersection of the cone with the plane).

Distance from a polygon

The distance to a polygon (a trapezoid in your case) is the smallest of the distances from its sides.

The computation of the distance between a point $\vec{p}$ and a segment (a side of the polygon) with ends $\vec{a}$ and $\vec{b}$ depends on the position of the projection of $ \vec{p} $ on the segment relative to its ends ($(\cdot,\cdot)$ is the scalar product of two vectors, $||\vec{x}||=\sqrt{(\vec{x},\vec{x})}$ is the length of a vector):

If $(\vec{p}-\vec{b},\vec{b}-\vec{a})\ge 0$, then the projection lies outside of the segment beyond $ \vec{b} $ and the distance is $||\vec{p}-\vec{b}||$.

If $(\vec{p}-\vec{a},\vec{a}-\vec{b})\ge 0$, then the projection lies outside of the segment beyond $ \vec{a} $ and the distance is $||\vec{p}-\vec{a}||$.

Otherwise the projection lies inside the segment and the distance is $$||(\vec{p}-\vec{a}) - \frac{\vec{b}-\vec{a}}{||\vec{b}-\vec{a}||^2}(\vec{b}-\vec{a},\vec{p}-\vec{a})||$$

$\endgroup$
  • $\begingroup$ thats as far as i got when i thought about it. but im really stuck at the point when i try to write it down. I get the plane vectors $\vec{v_1} = \vec{p} - \vec{a}$ and $\vec{v_2} = \vec{b} - \vec{a}$ but im still stuck in $R^3$ $\endgroup$ – reads Jul 9 '14 at 15:43
0
$\begingroup$

2d -> 3d

In the "3d -> 2d" post, the shortest distance is in the plane through $\vec{p}$ and the axis of the cone. The intersection of this plane and the cone is a trapezium and you need to find the 3D coordinates of each of its vertices. In the picture I have labelled these vertices as $\vec{c}$, $\vec{d}$, $\vec{e}$, $\vec{f}$.

trapezium cone

These four points are all a perpendicular distance from the axis. If we can find a direction vector perpendicular to the axis in this plane, then we can make a unit vector in this direction and so find the coordinates of the vertices.

The vector $\vec{x}$ in the diagram is perpendicular to the axis. You can find it by projecting $\vec{p}$ onto the axis and subtracting the result. This was done in the "3d -> 2d" post already:

So: $$ \vec{x} = (\vec{p} - \vec{a}) - \frac{(\vec{p}-\vec{a},\vec{b}-\vec{a})}{(\vec{b}-\vec{a},\vec{b} - \vec{a})}(\vec{b} - \vec{a}) $$ Dividing this vector by its length gives a unit vector, which I will call $\vec{u}$. That is, $$ \vec{u} = \frac{1}{||\vec{x}||}\vec{x} $$

Now we have the following: $$ \vec{c} = \vec{a} + r_a \vec{u}\\ \vec{d} = \vec{b} + r_b \vec{u}\\ \vec{e} = \vec{b} - r_b \vec{u}\\ \vec{d} = \vec{a} - r_a \vec{u} $$

From the "3d -> 2d" post, you need to find the shortest distance from $\vec{p}$ to each of the edges of the trapezium, and the minimum of all of these is the shortest distance from $\vec{p}$ to the cone.

$\endgroup$
  • $\begingroup$ that was of great help, but shouldnt $\vec{x}$ be $\vec{x} =( \vec{p} - \vec{a}) - (\vec{b} - \vec{a}) \cdot \frac{(\vec{p} - \vec{a}, \vec{b} - \vec{a})}{(\vec{b} - \vec{a}, \vec{b} - \vec{a})}$ $\endgroup$ – reads Jul 10 '14 at 10:02
  • $\begingroup$ Also im still not quite sure what i should make of the cases from sds answer. Why should the shortest distance always be to one of the points $\vec{c}, \vec{d}, \vec{e}$ or $\vec{f}$? It may be on the vector $\vec{c} - \vec{d}$? $\endgroup$ – reads Jul 10 '14 at 10:09
  • $\begingroup$ It doesn't have to be at one of the corners. Suppose the shortest distance to the infinite line $\vec{c}\vec{d}$ is at the point $\vec{y}$. Then the angle between $\vec{d} - \vec{c}$ and $\vec{p} - \vec{y}$ will be a right angle so $(\vec{d} - \vec{c},\vec{p} - \vec{y}) = 0$. However, the only way this could happen is if the angles using $\vec{c}$ and $\vec{d}$ for $\vec{y}$ were such that one was obtuse and the other acute. This would require the scalar products to be opposite signs. If they are, then the shortest distance is to a point between. If not, then it is to one of the corners. $\endgroup$ – DavidButlerUofA Jul 10 '14 at 10:55

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.