Создадим заключительный вариант огранки октагон. Он будет немногим отличаться от предыдущего третьего варианта рассмотренного в главе 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
, который пропорционально изменяет ширину
и длину модели при ее неизменной высоте.