Создадим заключительный вариант огранки октагон. Он будет немногим отличаться от предыдущего третьего варианта рассмотренного в главе 7. Построение короны останется неизменным. При создании павильона отличие будет заключаться в двух моментах:
Из СДМ уберем параметр angle_D, задающей наклон граней
D0 - D7. А вместо него добавим параметр angle_E, задающей наклон граней E0 - E7.
Заменим в СДМ параметр hMiddleFacet на параметр hLowerFacet,
который будет задавать глубину на которой должны лежать вершины 8 - 15 павильона.
Положение вершин 0 - 7 павильона теперь будет не задаваться изначально в СДМ,
а получаться автоматически путем определения точек пересечения соответствующих плоскостей.
pavil[16] = new Point3D(culet_dx, culet_dy, -r/2 - hp);
var dh = -r/2 + 0.02;
// нижние, примыкающие к калетте, четырехугольные грани павильона E0 - E7
var planes_down = [8];
var E0 = new Plane3D();
E0.CreateInclinePlane(angle_E, girdle[8], girdle[15], pavil[16]);
planes_down[0] = E0;
// создаем плоскости (planes_down) в которых лежат грани E1 - E7
for (i = 1; i < 8; i++)
{
var plane = new Plane3D();
plane.CreateInclinePlane(angle_E, girdle[i+8], girdle[8 + i - 1], pavil[16]);
planes_down[i] = plane;
}
// горизонтальная плоскость на уровне вершин 8, 9, 10, 11, 12, 13, 14, 15 павильона
var plane_LowerFacet = new Plane3D();
plane_LowerFacet.CreatePlaneNormalDistOXYZ(Z1, - r/2 - hp * hLowerFacet);
// Вершины 8, 9, 10, 11, 12, 13, 14, 15
pavil[8] = plane_LowerFacet.IntersectionThreePlanes(planes_down[0], planes_down[1]);
pavil[9] = plane_LowerFacet.IntersectionThreePlanes(planes_down[1], planes_down[2]);
pavil[10] = plane_LowerFacet.IntersectionThreePlanes(planes_down[2], planes_down[3]);
pavil[11] = plane_LowerFacet.IntersectionThreePlanes(planes_down[3], planes_down[4]);
pavil[12] = plane_LowerFacet.IntersectionThreePlanes(planes_down[4], planes_down[5]);
pavil[13] = plane_LowerFacet.IntersectionThreePlanes(planes_down[5], planes_down[6]);
pavil[14] = plane_LowerFacet.IntersectionThreePlanes(planes_down[6], planes_down[7]);
pavil[15] = plane_LowerFacet.IntersectionThreePlanes(planes_down[7], planes_down[0]);
// четырехугольные грани павильона D0 - D7
// Создаем два вектора a0 и b0. Их векторное произведение определит нормальный вектор плоскости D0.
var a0 = new Vector3D(pavil[8][0] - girdle[8][0], pavil[8][1] - girdle[8][1], pavil[8][2] - girdle[8][2]);
var b0 = new Vector3D(girdle[9][0] - girdle[15][0], girdle[9][1] - girdle[15][1], 0);
var vec_D0 = a0.Cross(b0); // вектор перпендикулярный к плоскости D0
vec_D0.Normer();
var D0 = new Plane3D();
D0.CreatePlaneNormalVectorPoint(vec_D0, pavil[8]);
..................................................
..................................................
// Создаем два вектора a7 и b7. Их векторное произведение определит нормальный вектор плоскости D7.
var a7 = new Vector3D(pavil[15][0] - girdle[15][0], pavil[15][1] - girdle[15][1], pavil[15][2] - girdle[15][2]);
var b7 = new Vector3D(girdle[8][0] - girdle[14][0], girdle[8][1] - girdle[14][1], 0);
var vec_D7 = a7.Cross(b7); // вектор перпендикулярный к плоскости D0
vec_D7.Normer();
var D7 = new Plane3D();
D7.CreatePlaneNormalVectorPoint(vec_D7, pavil[15]);
// находим координаты вершин 0 - 7 павильона
pavil[0] = planes_down[0].IntersectionThreePlanes(D0, D7);
pavil[1] = planes_down[1].IntersectionThreePlanes(D1, D0);
pavil[2] = planes_down[2].IntersectionThreePlanes(D2, D1);
pavil[3] = planes_down[3].IntersectionThreePlanes(D3, D2);
pavil[4] = planes_down[4].IntersectionThreePlanes(D4, D3);
pavil[5] = planes_down[5].IntersectionThreePlanes(D5, D4);
pavil[6] = planes_down[6].IntersectionThreePlanes(D6, D5);
pavil[7] = planes_down[7].IntersectionThreePlanes(D7, D6);
Четыре варианта построения были сделаны в основном для того, чтобы показать, как можно использовать функции библиотеки WebGeometry при создании трехмерных моделей с нуля - используя только методы аналитической геометрии, не требуя при этом загрузки каких либо файлов с уже готовыми 3D-объектами или частями этих объектов. Было рассмртрено, как выбор параметров в СДМ определяет построение моделей, и как конкретный выбор параметров воздействует на изменение формы модели при их изменении.
При построении огранок типа октагон не рассматривались вычисляемые параметры (они были вкратце затронуты вглаве 1 ),
такие как, например, totalHtFix. Их можно было бы ввести в программу
но для сокращения изложения это не было сделано. Параметр totalHt хотя и является вычисляемым, но он только
отображает значение общей высоты модели и не позволяет ее задавать.
При желании можно порекомендовать веруться к программе построения пирамиды и обратить внимание на то, как в ней
используется такой интересный параметр как totalHtFix, который пропорционально изменяет ширину
и длину модели при ее неизменной высоте.