分类:
2008-04-14 09:00:23
一些有规则性的立体图形,可以使用几个简单的变量,并透过运算来产生立体图形的所有顶点,正多面体正是这么样的图形,只有一个变数就可以定出所有的座标点。
如果将正多面体装入一个刚好可以容纳它的球体中,则正多面体的每一个顶点都会位于球壳上,且每个棱边长是相等的。正多面体又称“柏拉图多面体”,因为希腊哲学家柏拉图发现,在三维空间中,最多就只有五种正多面体:正四面体、正六面体、正八面体、正十二面体与正二十面体。
如何使用一个变数来指定正多面体的所有顶点呢?先将正多面体的中心置于原点,然后将其中一个顶点置于Y轴上,也就是(0, r, 0),其中从中心至顶点的距离,也就是可以容纳正多面体的球半径,将由Y轴上顶点延伸出来的錂线取出与錂线相接的顶点,再由这些顶点求出对称原点的另一端顶点,如此就可以求出所有的顶点。
正四面体、正六面体、正十二面体单一顶点延伸出来的錂线有三条,而正八面体有四条,正二十面体有五条。
正四面体
有一正四面体其中心在原点,如下所示:
由顶点(0, r, 0)所延伸出来的錂线有三条,为了计算方便,将两个顶点置于同一XY平面上,所以錂线所接的各顶点经计算后如下所示:
由于正四面体只有四个顶点,所以此时所有的顶点已被订出,正四面体每个面的顶点数为三,配合顶点索引阵列,可以使用以下的程式来订出所有的面:
double sq2 = Math.sqrt(2.0), sq3 = Math.sqrt(3.0);
Vt[0] = new Point3D(0, r, 0);
Vt[1] = new Point3D(0, -r/3, r*2*sq2/3);
Vt[2] = new Point3D(r*sq2/sq3, -r/3, -r*sq2/3);
Vt[3] = new Point3D(-r*sq2/sq3, -r/3, -r*sq2/3);
int[][] ord = {{0, 1, 2}, {0, 2, 3}, {0, 3, 1}, {1, 3, 2}};
正六面体
有一正六面体其中心在原点,如下所示:
由顶点(0, r, 0)所延伸出来的錂线有三条,为了计算方便,将两个顶点置于同一XY平面上,所以錂线所接的各顶点经计算后如下所示:
其它未定出的顶点皆以原点对称于这四个顶点,对称于原点其实就是将(x, y, z)都乘上负号,假设有个方法是minus()是进行这项工作,则其它顶点的计算及面的索引阵列如下所示,其中NVt表示顶点数,对正六面体而言是8:
|
正八面体
依以上同样的道理,可以定出正八面体的一组基本顶点,不过正八面体的中心的三个顶点可以调整至XYZ三轴上,如下所示:
正八面体的顶点配置方式与顶点索引阵列,提供以下的程式作参考,其中NVt?表示顶点数,对正八面体而言是6:
|
正十二面体
下图为正十二面体的图形:
正十二面体的对称顶点有十对,顶点配置与顶点索引阵列如下所示,其中NVt表示顶点数,对正十二面体而言是20:
|
正二十面体
下图为正二十面体的图形:
正二十面体的对称顶点有六对,顶点配置与顶点索引阵列如下所示,其中NVt表示顶点数,对正二十面体而言是12:
|
由以上,只要一个变数r,就可以订出所有的正多面体顶点,当然所牺牲的就是一些运算时间了。