因为WebGL只绘制三角形,而三角形总是平面凸多边形

凸多边形,Convex Polygon,指如果把一个多边形的所有边中,任意一条边向两方无限延长成为一直线时,其他各边都在此直线的同旁,那么这个多边形就叫做凸多边形。

所以我们还有一个问题需要解决,即如何处理更一般的多边形?我们可以有以下两种解决方案:

  1. 要求应用程序确保所生成的多边形都是三角形(逗我)
  2. 通过软件把给定的一般多边形细分成多个平面凸多边形(一般是三角形)。

把给定的一般多边形细分成多个三角形的方法有很多。这些方法我们称之为细分算法。
一种好的细分算法不会产生细长的三角形。如果可能的话,细分算法生成的一组三角形应该满足良好的几何特性,例如生成的一组三角形是三角形条带或者三角形扇形。

多边形细分算法

下面介绍一种多边形细分算法,该算法可以用于细分一个具有n个顶点的任意简单多边形。,从构建该算法的开始就知道,这个任意简单多边形最终可以被细分成n-2个三角形。

假定通过一个有序的顶点列表v0,v1,...,vn1v_0,v_1,...,v_{n-1}来指定该多边形,则该多边形具有从v0v_0v1v_1的边,v1v_1v2v_2的边,直至最后vn1v_{n-1}v0v_0的边。

算法的步骤

  1. 通过比较每个顶点的x值,寻找多边形最左边的顶点viv_i
  2. 假定与顶点viv_i相邻的两个顶点分别是vi1v_{i-1}vi+1v_{i+1}。这三个顶点生成一个三角形vi1vivi+1v_{i-1}v_iv_{i+1}
    如果三角形vi1vivi+1v_{i-1}v_iv_{i+1}是如图8.36所示的情形,那么只要将viv_i从初始的顶点列表删除掉,这时得到一个三角形和一个具有n-1个顶点的多边形,之后可以按同样的方法对细分后得到的这个多边形进行迭代处理。
    8.10.3 WebGL与凹多边形
    然而,由于被细分的多边形可能是凹多边形,因此从vi1v_{i-1}vi+1v_{i+1}的线段可能与多边形的其他边相交,如图8.37所示。
    8.10.3 WebGL与凹多边形

判断出现这种情形的方法

测试多边形的其他顶点是否位于该线段的左侧且位于三角形vi1vivi+1v_{i-1}v_iv_{i+1}的内部。

解决这种情形的方法

如果viv_i与多边形的其他顶点中位于最左边的那个顶点连接起来,那么可以将最初的多边形分割成两个新的多边形。
8.10.3 WebGL与凹多边形

相关文章:

  • 2021-12-01
  • 2022-12-23
  • 2021-09-13
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-10-12
  • 2022-12-23
猜你喜欢
  • 2021-07-19
  • 2021-07-26
  • 2021-12-29
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-11-17
相关资源
相似解决方案