Глава 6  ◄     Содержание     ►   Глава 8

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

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

No      All      Cr-Gd-Pav

   Глава 6  ◄     Содержание     ►   Глава 8