Создадим вариант огранки октагон в котором корона сделана точно также как и в главе 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);