Icosahedron

正二十面體 (Icosahedron) 共有12個頂點與20個面,若各邊長為ll,則其頂點座標分別為以下之組合:

(±0.5l,0,±5+14l),(±5+14l,±0.5l,0),(0,±5+14l,±0.5l)\displaystyle (\pm 0.5l, 0, \pm \frac{\sqrt{5}+1}{4}l), (\pm \frac{\sqrt{5}+1}{4}l, \pm 0.5l, 0), (0, \pm \frac{\sqrt{5}+1}{4}l, \pm 0.5l)

請參考以下範例。

程式說明

範例示範以TriangleMesh類別依序設定頂點座標、貼圖座標與三角形所組成的面,藉此組成正二十面體 (Icosahedron)。

步驟一:設定頂點座標。

首先設定正二十面體的頂點座標:

float p0 = 0.5f * length;
float p1 = 0.0f;
float p2 = (float) (length * (Math.sqrt(5.0) + 1.0) / 4.0f);

// 建立TriangleMesh
TriangleMesh trianglemesh = new TriangleMesh();

// 設定頂點座標
trianglemesh.getPoints().addAll(
   p0,  p1,  p2,
   p0,  p1, -p2,
  -p0,  p1,  p2,
  -p0,  p1, -p2,
   p2,  p0,  p1,
   p2, -p0,  p1,
  -p2,  p0,  p1,
  -p2, -p0,  p1,
   p1,  p2,  p0,
   p1,  p2, -p0,
   p1, -p2,  p0,
   p1, -p2, -p0
);
...

步驟二:設定貼圖座標。

接著以getTexCoords().addAll()方法設定貼圖座標:

// 設定貼圖座標
trianglemesh.getTexCoords().addAll(
  0.50f, 1.00f,                                
  0.75f, (float) (1.0-Math.sqrt(3.0)/4.0f),  
  0.25f, (float) (1.0-Math.sqrt(3.0)/4.0f),  
  1.00f, 1.00f,                                
  0.50f, (float) (1.0-Math.sqrt(3.0)/2.0f),   
  0.00f, 1.00f                                 
);
...

步驟三:以頂點組成三角形的面。

接著以getFaces().addAll()方法依頂點與貼圖的序號組成正二十面體的各個面:

// 設定各三角形的面
trianglemesh.getFaces().addAll(
   0, 0,  2, 1, 10, 2,   
   0, 1, 10, 0,  5, 3,  
   0, 2,  5, 1,  4, 4, 
   0, 0,  4, 2,  8, 5, 
   0, 1,  8, 0,  2, 3, 
   2, 2,  8, 1,  6, 4,
   2, 0,  6, 2,  7, 5,
   2, 0,  7, 1, 10, 2,
  10, 2,  7, 1, 11, 4,   
  10, 0, 11, 2,  5, 5,  
   5, 0, 11, 1,  1, 2, 
   5, 1,  1, 0,  4, 3, 
   4, 0,  1, 2,  9, 5, 
   4, 0,  9, 1,  8, 2,
   8, 1,  9, 0,  6, 3,
   6, 2,  9, 1,  3, 4,
   6, 0,  3, 1,  7, 2,   
   7, 1,  3, 0, 11, 3,  
  11, 2,  3, 1,  1, 4, 
   1, 0,  3, 2,  9, 5
);
...

步驟四:設定各面的平滑參數。

getFaceSmoothingGroups().addAll()方法設定各面的平滑參數,以避免不規則鋸齒狀的現象:

// 設定各面的平滑參數
trianglemesh.getFaceSmoothingGroups().addAll(
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0
);
...

最後以MeshView類別建立正二十面體:

// 建立MeshView
MeshView meshview;

meshview = new MeshView(createMesh(180));
...

執行結果

以下是以線框的方式繪製正二十面體:

以下是以貼圖的方式繪製正二十面體:

results matching ""

    No results matching ""