2017年11月9日 星期四

JavaFX 3D - Snub Dodecahedron

以下是以JavaFX 8的TriangleMesh類別建構之Snub Dodecahedron (扭稜十二面體),屬於Archimedean Solid (阿基米德立體)。

The Archimedean solids are a set of 13 polyhedra described by Pappus of Alexandria around 340 AD. Each solid is a convex polyhedron whose faces are regular polygons of two or more types that meet in the same pattern around each vertex. Each has polyhedral group, tetrahedral, octahedral, or icosahedral, rotational symmetry.


double phi = (1.0 + Math.sqrt(5.0)) / 2.0;
double x   = Math.cbrt((phi + Math.sqrt(phi-5.0/27.0))/2.0) + Math.cbrt((phi - Math.sqrt(phi-5.0/27.0))/2.0);

float C0  = length * (float) (phi * Math.sqrt(3.0 - (x*x)) / 2.0);
float C1  = length * (float) (x * phi * Math.sqrt(3.0 - (x*x)) / 2.0);
float C2  = length * (float) (phi * Math.sqrt((x - 1.0 - (1.0/x)) * phi) / 2.0);
float C3  = length * (float) ((x*x) * phi * Math.sqrt(3.0 - (x*x)) / 2.0);
float C4  = length * (float) (x * phi * Math.sqrt((x - 1.0 - (1.0/x)) * phi) / 2.0);
float C5  = length * (float) (phi * Math.sqrt(1.0 - x + (phi + 1.0) / x) / 2.0);
float C6  = length * (float) (phi * Math.sqrt(x - phi + 1.0) / 2.0);
float C7  = length * (float) ((x*x) * phi * Math.sqrt((x - 1.0 - (1.0/x)) * phi) / 2.0);
float C8  = length * (float) (x * phi * Math.sqrt(1.0 - x + (phi + 1.0) / x) / 2.0);
float C9  = length * (float) (Math.sqrt((x + 2.0) * phi + 2.0) / 2.0);
float C10 = length * (float) (x * Math.sqrt(x * (phi + 1.0) - phi) / 2.0);
float C11 = length * (float) (Math.sqrt((x*x) * (2.0 * phi + 1.0) - phi) / 2.0);
float C12 = length * (float) (phi * Math.sqrt((x*x) + x) / 2.0);
float C13 = length * (float) ((phi*x) * Math.sqrt(x * (x + phi) + 1.0) / (2.0 * x));
float C14 = length * (float) (phi * Math.sqrt(x * (x + phi) + 1.0) / 2.0);

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

// 設定頂點座標
trianglemesh.getPoints().addAll(
    C2,  -C1,  C14,
    C2,   C1, -C14,
   -C2,   C1,  C14,
   -C2,  -C1, -C14,
   C14,  -C2,   C1,
   C14,   C2,  -C1,
  -C14,   C2,   C1,
  -C14,  -C2,  -C1,
    C1, -C14,   C2,
    C1,  C14,  -C2,
   -C1,  C14,   C2,
   -C1, -C14,  -C2,
    C3,   C4,  C13,
    C3,  -C4, -C13,
   -C3,  -C4,  C13,
   -C3,   C4, -C13,
   C13,   C3,   C4,
   C13,  -C3,  -C4,
  -C13,  -C3,   C4,
  -C13,   C3,  -C4,
    C4,  C13,   C3,
    C4, -C13,  -C3,
   -C4, -C13,   C3,
   -C4,  C13,  -C3,
    C0,  -C8,  C12,
    C0,   C8, -C12,
   -C0,   C8,  C12,
   -C0,  -C8, -C12,
   C12,  -C0,   C8,
   C12,   C0,  -C8,
  -C12,   C0,   C8,
  -C12,  -C0,  -C8,
    C8, -C12,   C0,
    C8,  C12,  -C0,
   -C8,  C12,   C0,
   -C8, -C12,  -C0,
    C7,  -C6,  C11,
    C7,   C6, -C11,
   -C7,   C6,  C11,
   -C7,  -C6, -C11,
   C11,  -C7,   C6,
   C11,   C7,  -C6,
  -C11,   C7,   C6,
  -C11,  -C7,  -C6,
    C6, -C11,   C7,
    C6,  C11,  -C7,
   -C6,  C11,   C7,
   -C6, -C11,  -C7,
    C9,   C5,  C10,
    C9,  -C5, -C10,
   -C9,  -C5,  C10,
   -C9,   C5, -C10,
   C10,   C9,   C5,
   C10,  -C9,  -C5,
  -C10,  -C9,   C5,
  -C10,   C9,  -C5,
    C5,  C10,   C9,
    C5, -C10,  -C9,
   -C5, -C10,   C9,
   -C5,  C10,  -C9
);

// 設定貼圖座標
trianglemesh.getTexCoords().addAll(
  0.0f, 0.0f, // 0                         
  0.5f, 0.0f, // 1                          
  1.0f, 0.0f, // 2                               
  0.0f, 0.5f, // 3                               
  0.5f, 0.5f, // 4                               
  1.0f, 0.5f, // 5                              
  0.0f, 1.0f, // 6                               
  0.5f, 1.0f, // 7                               
  1.0f, 1.0f  // 8                          
);

// 設定各三角形的面
trianglemesh.getFaces().addAll(
   0, 1, 12, 5,  2, 2,
   0, 1,  2, 5, 14, 2,
   0, 1, 14, 5, 24, 2,
   0, 1, 24, 5, 36, 2,
  36, 1, 24, 5, 44, 2,
  36, 1, 44, 5, 40, 2,
  36, 1, 40, 5, 28, 2,
  28, 1, 40, 5,  4, 2,
  28, 1,  4, 5, 16, 2,
  28, 1, 16, 5, 48, 2,
  48, 1, 16, 5, 52, 2,
  48, 1, 52, 5, 56, 2,
  48, 1, 56, 5, 12, 2,
  12, 1, 56, 5, 26, 2,
  12, 1, 26, 5,  2, 2,
   2, 1, 26, 5, 38, 2,
  38, 1, 26, 5, 46, 2,
  38, 1, 46, 5, 42, 2,
  38, 1, 42, 5, 30, 2,
  30, 1, 42, 5,  6, 2,
  30, 1,  6, 5, 18, 2,
  30, 1, 18, 5, 50, 2,
  50, 1, 18, 5, 54, 2,
  50, 1, 54, 5, 58, 2,
  50, 1, 58, 5, 14, 2,
  14, 1, 58, 5, 24, 2,
  58, 1, 54, 5, 22, 2,
  22, 1, 54, 5, 35, 2,
  22, 1, 35, 5, 11, 2,
  22, 1, 11, 5,  8, 2,
   8, 1, 11, 5, 21, 2,
   8, 1, 21, 5, 32, 2,
   8, 1, 32, 5, 44, 2,
  44, 1, 32, 5, 40, 2,
  32, 1, 21, 5, 53, 2,
  53, 1, 21, 5, 57, 2,
  53, 1, 57, 5, 49, 2,
  53, 1, 49, 5, 17, 2,
  17, 1, 49, 5, 29, 2,
  17, 1, 29, 5,  5, 2,
  17, 1,  5, 5,  4, 2,
   4, 1,  5, 5, 16, 2,
   5, 1, 29, 5, 41, 2,
  41, 1, 29, 5, 37, 2,
  41, 1, 37, 5, 45, 2,
  41, 1, 45, 5, 33, 2,
  33, 1, 45, 5,  9, 2,
  33, 1,  9, 5, 20, 2,
  33, 1, 20, 5, 52, 2,
  52, 1, 20, 5, 56, 2,
  20, 1,  9, 5, 10, 2,
  10, 1,  9, 5, 23, 2,
  10, 1, 23, 5, 34, 2,
  10, 1, 34, 5, 46, 2,
  46, 1, 34, 5, 42, 2,
  34, 1, 23, 5, 55, 2,
  55, 1, 23, 5, 59, 2,
  55, 1, 59, 5, 51, 2,
  55, 1, 51, 5, 19, 2,
  19, 1, 51, 5, 31, 2,
  19, 1, 31, 5,  7, 2,
  19, 1,  7, 5,  6, 2,
   6, 1,  7, 5, 18, 2,
   7, 1, 31, 5, 43, 2,
  43, 1, 31, 5, 39, 2,
  43, 1, 39, 5, 47, 2,
  43, 1, 47, 5, 35, 2,
  35, 1, 47, 5, 11, 2,
  47, 1, 39, 5, 27, 2,
  27, 1, 39, 5,  3, 2,
  27, 1,  3, 5, 13, 2,
  27, 1, 13, 5, 57, 2,
  57, 1, 13, 5, 49, 2,
  13, 1,  3, 5,  1, 2,
   1, 1,  3, 5, 15, 2,
   1, 1, 15, 5, 25, 2,
   1, 1, 25, 5, 37, 2,
  37, 1, 25, 5, 45, 2,
  25, 1, 15, 5, 59, 2,
  59, 1, 15, 5, 51, 2,
   0, 0, 36, 4, 28, 1,
   0, 0, 28, 4, 48, 1,
   0, 0, 48, 4, 12, 1,
   1, 0, 37, 4, 29, 1,
   1, 0, 29, 4, 49, 1,
   1, 0, 49, 4, 13, 1,
   2, 0, 38, 4, 30, 1,
   2, 0, 30, 4, 50, 1,
   2, 0, 50, 4, 14, 1,
   3, 0, 39, 4, 31, 1,
   3, 0, 31, 4, 51, 1,
   3, 0, 51, 4, 15, 1,
   4, 0, 40, 4, 32, 1,
   4, 0, 32, 4, 53, 1,
   4, 0, 53, 4, 17, 1,
   5, 0, 41, 4, 33, 1,
   5, 0, 33, 4, 52, 1,
   5, 0, 52, 4, 16, 1,
   6, 0, 42, 4, 34, 1,
   6, 0, 34, 4, 55, 1,
   6, 0, 55, 4, 19, 1,
   7, 0, 43, 4, 35, 1,
   7, 0, 35, 4, 54, 1,
   7, 0, 54, 4, 18, 1,
   8, 0, 44, 4, 24, 1,
   8, 0, 24, 4, 58, 1,
   8, 0, 58, 4, 22, 1,
   9, 0, 45, 4, 25, 1,
   9, 0, 25, 4, 59, 1,
   9, 0, 59, 4, 23, 1,
  10, 0, 46, 4, 26, 1,
  10, 0, 26, 4, 56, 1,
  10, 0, 56, 4, 20, 1,
  11, 0, 47, 4, 27, 1,
  11, 0, 27, 4, 57, 1,
  11, 0, 57, 4, 21, 1 
);

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

// 建立MeshView
MeshView meshview;

meshview = new MeshView(createMesh(70));
...
【參考資料】

[1] Java Official Web Site:http://www.oracle.com/technetwork/java/index.html
[2] JavaFX:http://www.oracle.com/technetwork/java/javafx
[3] JavaFX 8.0 API Specification.
[4] Java Platform, Standard Edition 8 API Specification.
[5] JDK 8 Certified System Configurations.
[6] H. M. Cundy, A. P. Rollett, Mathematical Models, Tarquin Publications, 1981.
[7] G. Sellers, R. S. Wright, N. Haemel, OpenGL SuperBible: Comprehensive Tutorial and Reference (6th Edition), Addison-Wesley Professional, 2013.
[8] 黃嘉輝, JavaFX 8技術手冊, ISBN: 9789863474050, 碁峰資訊, 2014.

© Chia-Hui Huang

沒有留言:

張貼留言