Глава 7  ◄     Содержание     ►   Глава 9

Three.js и геометрия.   Глава 8.   Многогранник октагон (часть 4)

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

No      All      Cr-Gd-Pav

Заключение по вариантам построения моделей огранок типа октагон

Четыре варианта построения были сделаны в основном для того, чтобы показать, как можно использовать функции библиотеки WebGeometry при создании трехмерных моделей с нуля - используя только методы аналитической геометрии, не требуя при этом загрузки каких либо файлов с уже готовыми 3D-объектами или частями этих объектов. Было рассмртрено, как выбор параметров в СДМ определяет построение моделей, и как конкретный выбор параметров воздействует на изменение формы модели при их изменении.

При построении огранок типа октагон не рассматривались вычисляемые параметры (они были вкратце затронуты в главе 1 ), такие как, например, totalHtFix. Их можно было бы ввести в программу но для сокращения изложения это не было сделано. Параметр totalHt хотя и является вычисляемым, но он только отображает значение общей высоты модели и не позволяет ее задавать. При желании можно порекомендовать веруться к программе построения пирамиды и обратить внимание на то, как в ней используется такой интересный параметр как totalHtFix, который пропорционально изменяет ширину и длину модели при ее неизменной высоте.

   Глава 7  ◄     Содержание     ►   Глава 9