Создадим вариант огранки октагон в котором корона сделана точно также как и в главе 6, но павильон построен
немного иначе. Из СДМ уберем параметр angle_E
, задающей наклон граней
E0 - E7. Вместо этого параметра в СДМ добавим параметр hMiddleFacet
,
который будет задавать глубину на которой должны лежать вершины 0 - 7 павильона.
var plane_MiddleFacet = new Plane3D();
plane_MiddleFacet.CreatePlaneNormalDistOXYZ(Z1, -r/2 - hp * hMiddleFacet);
Затем создадим с помощью функции CreateInclinePlane
восемь плоскостей в которых лежат грани D0 - D7.
Переменная planes_up
- определяет массив в котором храненятся эти плоскости.
var planes_up = [8]; // Отдельно создаем плоскость в которой лежит грань D0 var D0 = new Plane3D(); D0.CreateInclinePlane(angle_D, girdle[9], girdle[15], girdle[8]); planes_up[0] = D0; var D7 = new Plane3D(); D7.CreateInclinePlane(angle_D, girdle[8], girdle[14], girdle[15]); planes_up[7] = D7; // создаем плоскости (planes_up) в которых лежат грани D1 - D6 for (i = 1; i < 7; i++) { var plane = new Plane3D(); plane.CreateInclinePlane(angle_D, girdle[8 + i + 1], girdle[8 + i - 1], girdle[8 + i]); planes_up[i] = plane; }
Вершины павильона 0 - 7 находим как точки пересечения трех плоскостей. Это плоскости в которых лежат
грани D0 - D7 и горизонтальная плоскость plane_MiddleFacet
:
pavil[0] = plane_MiddleFacet.IntersectionThreePlanes(planes_up[0], planes_up[7]); pavil[1] = plane_MiddleFacet.IntersectionThreePlanes(planes_up[1], planes_up[0]); pavil[2] = plane_MiddleFacet.IntersectionThreePlanes(planes_up[2], planes_up[1]); pavil[3] = plane_MiddleFacet.IntersectionThreePlanes(planes_up[3], planes_up[2]); pavil[4] = plane_MiddleFacet.IntersectionThreePlanes(planes_up[4], planes_up[3]); pavil[5] = plane_MiddleFacet.IntersectionThreePlanes(planes_up[5], planes_up[4]); pavil[6] = plane_MiddleFacet.IntersectionThreePlanes(planes_up[6], planes_up[5]); pavil[7] = plane_MiddleFacet.IntersectionThreePlanes(planes_up[7], planes_up[6]);
Координаты вершин 8 - 15 павильона определим следующим образом - найдем плоскости в которых лежат грани D0 - D7 а затем определим рассчитаем точки пересечения плоскостей лежащих на двух нижних ярусах павильона - D и E. Плоскости граней E0 - E7 расчитываются также как и для Octagon в первом варианте. Вот как, напомним, опредляется плоскость для E0:
// Создаем два вектора a0 и b0. Их векторное произведение определит нормальный вектор плоскости E0. var a0 = new Vector3D(pavil[16][0] - pavil[0][0], pavil[16][1] - pavil[0][1], pavil[16][2] - pavil[0][2]); var b0 = new Vector3D(girdle[8][0] - girdle[15][0], girdle[8][1] - girdle[15][1], 0); var vec_E0 = a0.Cross(b0); // вектор перпендикулярный к плоскости E0 vec_E0.Normer(); var E0 = new Plane3D(); E0.CreatePlaneNormalVectorPoint(vec_E0, pavil[16]);А вот и сам расчет вершин:
// Вершины 8, 9, 10, 11, 12, 13, 14, 15 павильона // массив planes_up предназначен для D0 - D7 pavil[8] = planes_up[0].IntersectionThreePlanes(E0, E1); pavil[9] = planes_up[1].IntersectionThreePlanes(E1, E2); pavil[10] = planes_up[2].IntersectionThreePlanes(E2, E3); pavil[11] = planes_up[3].IntersectionThreePlanes(E3, E4); pavil[12] = planes_up[4].IntersectionThreePlanes(E4, E5); pavil[13] = planes_up[5].IntersectionThreePlanes(E5, E6); pavil[14] = planes_up[6].IntersectionThreePlanes(E6, E7); pavil[15] = planes_up[7].IntersectionThreePlanes(E7, E0);