理解用于凸包简化的对偶多胞形
Understanding the Dual Polytope for Hull Simplification

原始链接: https://cairnc.github.io/posts/understanding-the-dual-polytope/

对于包含原点的凸多面体 \(P\),其支撑函数为 \[ h(y)=\max_{x\in P}x\cdot y=\max_i v_i\cdot y. \] 它是分段线性的,每个顶点对应一个线性区域。这些区域与高斯映射的胞腔相对应。 对于任意 \(c>0\), \[ \{y:h(y)\le c\}=cP^\circ, \qquad P^\circ=\{y:x\cdot y\le1\text{ 对所有 }x\in P\}. \] 因此,极对偶是一个由若干半空间相交而成的凸多面体。它的各个面对应于 \(P\) 的各个顶点:与 \(v_i\) 对应的面位于 \(v_i\cdot y=1\) 上。反过来,\(P\) 中位于 \(n\cdot x=d\) 上的每个面,都对应于对偶顶点 \(n/d\)。 对偶多面体的棱投影到高斯映射的分界线上,而其各个面投影到高斯映射的胞腔中。这种几何对应关系解释了这两种对偶凸包方法:将原多面体的面所在平面表示为对偶点 \(n/d\),编辑或合并这些点,然后取它们的凸包。由此得到的每个对偶面 \(w\cdot y=1\) 都对应一个化简后的原顶点 \(w\)。

# 黑客新闻 最新 | 历史 | 评论 | 提问 | 展示 | 职位 | 提交 登录 ## 理解用于凸包简化的对偶多胞体 (cairnc.github.io) 22 分 由 OlympicMarmoto 提交 1 天前 隐藏 | 过去 | 收藏 | 2 条评论 帮助 **OlympicMarmoto** 1 天前 下一条 [–] 我写了一篇关于凸包构建和对偶多胞体的短文。 对偶多胞体属于那种我理解之后,几个月后又 inevitably 会忘记细节的东西,所以我主要是把它写下来,作为自己的参考。希望其他人也会觉得有用。 回复 **vivzkestrel** 23 小时前 上一条 [–] - 帖子页面出现 404 了? - https://cairnc.github.io/posts/ 回复 指南 | 常见问题 | 列表 | API | 安全 | 法律 | 申请加入 YC | 联系方式 搜索:
相关文章

原文

I was recently trying to simplify convex hulls. A common approach is to find all the face planes of the hull, merge or drop some of them, and then rebuild the hull from the planes that are left. There are two common ways to do the rebuild. The first is to make each plane a giant quad and clip it by every other plane, repeating this for each plane. The second is to take the convex hull of the face normals. Each face plane \(\boldsymbol{n \cdot x = d}\) becomes the point \(\boldsymbol{n/d}\), so this is the convex hull of the dual polytope, and its faces give the vertices of the simplified hull. I had trouble understanding the dual polytope, so this is a short explanation of it in terms of the level sets of the support function.

Let \(\boldsymbol{P}\) be a convex polytope with vertices \(\boldsymbol{v_{1}, v_{2}, \dots v_{k}}\) and the origin inside it. Its support function is

\[h(y) = \max_{x \in P} (x \cdot y) = \max_{i} (v_i \cdot y)\]

The support function is piecewise linear. Its linear regions are wedges, one per vertex, where wedge \(\boldsymbol{i}\) is the set of directions whose support vertex is \(\boldsymbol{v_{i}}\). On the sphere these wedges are the regions of the Gauss map. Let’s look at the level sets of \(\boldsymbol{h}\).

Figure 1: The cube \(\boldsymbol{[-1,1]^{3}}\), the level sets of its support function \(\boldsymbol{h(y) = |y_{1}| + |y_{2}| + |y_{3}|}\) with one octant cut away, and the Gauss map of the cube, all from the same angle. The level sets are nested octahedra and their wireframe matches the Gauss map. The octahedron face with normal \(\boldsymbol{v}\) sits over the highlighted region of \(\boldsymbol{v}\).

Since \(\boldsymbol{h}\) is linear inside each wedge, a level set of \(\boldsymbol{h}\) is flat inside each wedge and can only bend on the seams between wedges. From that, these properties should be clear.

  1. The wireframe of a level set projects onto the Gauss map.

  2. Its faces sit over the regions of the Gauss map, one per vertex of \(\boldsymbol{P}\).

  3. Its vertices sit over the points where the arcs meet, one per face of \(\boldsymbol{P}\).

The polar dual of \(\boldsymbol{P}\) is

\[P^{\circ} = \{y : x \cdot y \leq 1,\ \forall x \in P\}\]

Theorem. For \(\boldsymbol{c > 0}\) the level set \(\boldsymbol{\{h \leq c\}}\) is \(\boldsymbol{cP^{\circ}}\), and

  1. \(\boldsymbol{P^{\circ}}\) is a convex polytope.

  2. The faces of \(\boldsymbol{P^{\circ}}\) are the vertices of \(\boldsymbol{P}\). Face \(\boldsymbol{i}\) lies in the plane \(\boldsymbol{v_{i} \cdot y = 1}\), so its normal is \(\boldsymbol{v_{i}}\).

  3. The vertices of \(\boldsymbol{P^{\circ}}\) are the faces of \(\boldsymbol{P}\). A face of \(\boldsymbol{P}\) with plane \(\boldsymbol{n \cdot x = d}\) becomes the vertex \(\boldsymbol{n/d}\), and projecting the edges of \(\boldsymbol{P^{\circ}}\) onto the sphere gives the Gauss map.

Proof. From the definition of \(\boldsymbol{h}\),

\[h(y) \leq 1 \iff x \cdot y \leq 1 \ \text{ for all } x \in P\]

so \(\boldsymbol{\{h \leq 1\} = P^{\circ}}\). Since \(\boldsymbol{h(ty) = t\,h(y)}\) for \(\boldsymbol{t > 0}\), the other level sets are scaled copies,

\[\{h \leq c\} = cP^{\circ}\]

  1. Since \(\boldsymbol{h}\) is a max of linear functions,

    \[P^{\circ} = \bigcap_{i} \{y : v_{i} \cdot y \leq 1\}\]

    is an intersection of finitely many half spaces. It is bounded because the origin is inside \(\boldsymbol{P}\), so

    \[h(y) \geq m \lVert y \rVert, \qquad m = \min_{\lVert y \rVert = 1} h(y) > 0\]

  2. On wedge \(\boldsymbol{i}\),

    \[h(y) = v_{i} \cdot y\]

    so inside that wedge the boundary of \(\boldsymbol{P^{\circ}}\) is the plane \(\boldsymbol{v_{i} \cdot y = 1}\). Different vertices give different planes, so neighbouring faces meet at an angle along the seams.

  3. By homogeneity every ray from the origin crosses the boundary of \(\boldsymbol{P^{\circ}}\) exactly once, at \(\boldsymbol{y/h(y)}\). So projecting onto the sphere sends each face of \(\boldsymbol{P^{\circ}}\) to its wedge and each edge to a seam, which is the Gauss map. The vertices of \(\boldsymbol{P^{\circ}}\) lie where three or more wedges meet, which is along the face normals \(\boldsymbol{n}\) of \(\boldsymbol{P}\). Along that ray

    \[h(tn) = t\,d = 1 \implies t = \frac{1}{d}\]

    so the vertex is \(\boldsymbol{n/d}\). \(\blacksquare\)

Merging or dropping face normals edits the vertices of \(\boldsymbol{P^{\circ}}\), and taking their convex hull rebuilds \(\boldsymbol{P^{\circ}}\). By part 2 of the theorem, each face \(\boldsymbol{w \cdot y = 1}\) of the new hull gives the vertex \(\boldsymbol{w}\) of the simplified polytope.

联系我们 contact @ memedata.com