Does any know what's the best algorithm for deriving various properties of (non-regular) convex polytopes, such as the ridges, vertices, etc., given only the equations of the bounding hyperplanes?
I came up with the following algorithm, but it's very inefficient: O(n!). Does anyone know a better way of doing this?
In the following, a hyperplane in R<sup>n</sup> is defined by a normal vector N and a constant displacement factor C: it is the set { x in R<sup>n</sup> | N.x + C = 0 }. A half-space corresponding to H is defined to be: { x in R<sup>n</sup> | N.x + C <= 0 }.
A (non-regular) convex polytope P in R<sup>n</sup> is defined to be the intersection of the half-spaces corresponding to its bounding hyperplanes: P = intersection of H<sub>1</sub> ... H<sub>m</sub> for some positive integer m.
Given H<sub>1</sub> ... H<sub>m</sub>, we want to compute its vertices, edges, ridges, facets, etc.. Here's one way of doing this (unfortunately inefficient):
For each H_i:
1) find a linear transformation T<sub>i</sub> that maps H<sub>i</sub> to the horizontal hyperplane H<sub>0</sub>. H<sub>0</sub> is simply the subspace of R<sup>n</sup> where all points have their last Cartesian coordinate equal to 0.
2) For each j != i, compute the intersection of T<sub>i</sub>(H<sub>j</sub>) with H<sub>0</sub>. The result of this intersection is a ridge (an (n-2)-dimensional plane) in R<sup>n</sup>, but it is a hyperplane in R<sup>n-1</sup>. The set of all these hyperplanes in R<sup>n-1</sup> defines a polytope Q that corresponds with the facet F<sub>i</sub> of P which is coplanar with H<sub>i</sub>. That is, T<sub>i</sub><sup>-1</sup>(Q) = F<sub>i</sub>.
3) Recursively apply this algorithm to this face polytope, until we reach R<sup>1</sup>, in which case we have computed the vertices, edges, ridges, etc., for Q. Applying the inverse transformation T<sub>i</sub><sup>-1</sup> yields the coordinates of these vertices, edges, etc., in R<sup>n</sup>.
If I didn't miss anything obvious, this should compute all the vertices, edges, planes, etc., of the polytope P. The only problem is that it's extremely inefficient due to the deep recursion. Is there a better way of doing these computations?