70 lines
4.2 KiB
C++
70 lines
4.2 KiB
C++
|
#include "stt_class.h"
|
||
|
|
||
|
/**
|
||
|
* 初始化二十面实例ICOSA
|
||
|
* @param radius 二十面的顶点半径
|
||
|
* @param orient 二十面最高点顶点方位
|
||
|
*/
|
||
|
void SttGenerator::InitialIcosahedron(double radius,Vertex orient)
|
||
|
{
|
||
|
double constL, constZ;
|
||
|
//计算二十面的十二个顶点位置 首先将顶点位置固定在地理北极点
|
||
|
base_icosahedron_.vert[0].id = 0;
|
||
|
base_icosahedron_.vert[0].posic.x = 0.0;
|
||
|
base_icosahedron_.vert[0].posic.y = 0.0;
|
||
|
base_icosahedron_.vert[0].posic.z = radius;
|
||
|
base_icosahedron_.vert[0].posis = Cartesian2Sphere(base_icosahedron_.vert[0].posic);
|
||
|
base_icosahedron_.vert[11].id = 11;
|
||
|
base_icosahedron_.vert[11].posic.x = 0.0;
|
||
|
base_icosahedron_.vert[11].posic.y = 0.0;
|
||
|
base_icosahedron_.vert[11].posic.z = -1.0*radius;
|
||
|
base_icosahedron_.vert[11].posis = Cartesian2Sphere(base_icosahedron_.vert[11].posic);
|
||
|
|
||
|
constZ = radius*(GoldenMean*GoldenMean - 1.0)/(GoldenMean*GoldenMean + 1.0);
|
||
|
constL = radius*sqrt(1.0 - pow((GoldenMean*GoldenMean - 1.0)/(GoldenMean*GoldenMean + 1.0),2));
|
||
|
|
||
|
for(int i = 1; i <= 5; i++)
|
||
|
{
|
||
|
base_icosahedron_.vert[i].id = i;
|
||
|
base_icosahedron_.vert[i].posic.x = cos(72.0*(i-1)*Pi/180.0)*constL;
|
||
|
base_icosahedron_.vert[i].posic.y = sin(72.0*(i-1)*Pi/180.0)*constL;
|
||
|
base_icosahedron_.vert[i].posic.z = constZ;
|
||
|
base_icosahedron_.vert[i].posis = Cartesian2Sphere(base_icosahedron_.vert[i].posic);
|
||
|
|
||
|
base_icosahedron_.vert[i+5].id = i+5;
|
||
|
base_icosahedron_.vert[i+5].posic.x = cos((72.0*(i-1)+36.0)*Pi/180.0)*constL;
|
||
|
base_icosahedron_.vert[i+5].posic.y = sin((72.0*(i-1)+36.0)*Pi/180.0)*constL;
|
||
|
base_icosahedron_.vert[i+5].posic.z = -constZ;
|
||
|
base_icosahedron_.vert[i+5].posis = Cartesian2Sphere(base_icosahedron_.vert[i+5].posic);
|
||
|
}
|
||
|
|
||
|
//给定二十面的面顶点索引,各个三角面顶点索引按逆时针排序
|
||
|
base_icosahedron_.tri[0].ids[0] = 0; base_icosahedron_.tri[0].ids[1] = 1; base_icosahedron_.tri[0].ids[2] = 2;
|
||
|
base_icosahedron_.tri[1].ids[0] = 0; base_icosahedron_.tri[1].ids[1] = 2; base_icosahedron_.tri[1].ids[2] = 3;
|
||
|
base_icosahedron_.tri[2].ids[0] = 0; base_icosahedron_.tri[2].ids[1] = 3; base_icosahedron_.tri[2].ids[2] = 4;
|
||
|
base_icosahedron_.tri[3].ids[0] = 0; base_icosahedron_.tri[3].ids[1] = 4; base_icosahedron_.tri[3].ids[2] = 5;
|
||
|
base_icosahedron_.tri[4].ids[0] = 0; base_icosahedron_.tri[4].ids[1] = 5; base_icosahedron_.tri[4].ids[2] = 1;
|
||
|
base_icosahedron_.tri[5].ids[0] = 1; base_icosahedron_.tri[5].ids[1] = 6; base_icosahedron_.tri[5].ids[2] = 2;
|
||
|
base_icosahedron_.tri[6].ids[0] = 2; base_icosahedron_.tri[6].ids[1] = 6; base_icosahedron_.tri[6].ids[2] = 7;
|
||
|
base_icosahedron_.tri[7].ids[0] = 2; base_icosahedron_.tri[7].ids[1] = 7; base_icosahedron_.tri[7].ids[2] = 3;
|
||
|
base_icosahedron_.tri[8].ids[0] = 3; base_icosahedron_.tri[8].ids[1] = 7; base_icosahedron_.tri[8].ids[2] = 8;
|
||
|
base_icosahedron_.tri[9].ids[0] = 3; base_icosahedron_.tri[9].ids[1] = 8; base_icosahedron_.tri[9].ids[2] = 4;
|
||
|
base_icosahedron_.tri[10].ids[0] = 4; base_icosahedron_.tri[10].ids[1] = 8; base_icosahedron_.tri[10].ids[2] = 9;
|
||
|
base_icosahedron_.tri[11].ids[0] = 4; base_icosahedron_.tri[11].ids[1] = 9; base_icosahedron_.tri[11].ids[2] = 5;
|
||
|
base_icosahedron_.tri[12].ids[0] = 5; base_icosahedron_.tri[12].ids[1] = 9; base_icosahedron_.tri[12].ids[2] = 10;
|
||
|
base_icosahedron_.tri[13].ids[0] = 5; base_icosahedron_.tri[13].ids[1] = 10; base_icosahedron_.tri[13].ids[2] = 1;
|
||
|
base_icosahedron_.tri[14].ids[0] = 1; base_icosahedron_.tri[14].ids[1] = 10; base_icosahedron_.tri[14].ids[2] = 6;
|
||
|
base_icosahedron_.tri[15].ids[0] = 6; base_icosahedron_.tri[15].ids[1] = 11; base_icosahedron_.tri[15].ids[2] = 7;
|
||
|
base_icosahedron_.tri[16].ids[0] = 7; base_icosahedron_.tri[16].ids[1] = 11; base_icosahedron_.tri[16].ids[2] = 8;
|
||
|
base_icosahedron_.tri[17].ids[0] = 8; base_icosahedron_.tri[17].ids[1] = 11; base_icosahedron_.tri[17].ids[2] = 9;
|
||
|
base_icosahedron_.tri[18].ids[0] = 9; base_icosahedron_.tri[18].ids[1] = 11; base_icosahedron_.tri[18].ids[2] = 10;
|
||
|
base_icosahedron_.tri[19].ids[0] = 10; base_icosahedron_.tri[19].ids[1] = 11; base_icosahedron_.tri[19].ids[2] = 6;
|
||
|
|
||
|
//旋转二十面顶点的位置
|
||
|
Vertex ref_vert = base_icosahedron_.vert[0]; //注意我们选取的参考点为z轴正方向
|
||
|
for (int i = 0; i < 12; i++)
|
||
|
{
|
||
|
base_icosahedron_.vert[i] = RotateVertex(ref_vert,orient,base_icosahedron_.vert[i]);
|
||
|
}
|
||
|
return;
|
||
|
}
|