Глава 23  ◄     Содержание     ►   Глава 25

Three.js и геометрия.   Глава 24.   Построение рундиста огранки имеющей рундист в форме "подушки" (cushion) часть 2

Данная глава является продолжением предыдущей. В построение рундиста из предыдущей главы добавлена точка O4. Это изменение позволяет более гибко задавать размеры сегментов рундиста. Координаты этой точки задаются следующим образом:
O4 = new Point2D(gd_segments * lw, gd_segments);
Параметр gd_segments при построении рундиста подобным образом должен иметь одноименное поле в СДМ.

Изменения в исходном тексте программы построения линии рундиста(pear)

Изменения в тексте сделанные для нового способа нахождения границ сегментов показаны в следующем листинге:

function init_girdle()
{
	.............................................
	.............................................

	// Находим положение точки на луче, 
	//который будет определять направление на котором  
	//лежит угловая вершина рундиста girdle[8]. 
	// Этот луч будет использоваться в качестве 
	//начальной прямой отсчета для углов ang_2 и ang_3.
	//var ang_corner = ang_corner;      !!!!!!!!!

	var u = new Point2D();
	u[0] = O3[0] + Math.cos(ang_corner) * R3;
	u[1] = O3[1] + Math.sin(ang_corner) * R3;
	
	// Задаем координаты точки O4 используемой для задания начальных точек лучей (прямых) 
	// используемых для нахождения границ сегментов.
	O4 = new Point2D(gd_segments * lw, gd_segments);

	var t = new Point2D();	// Точки на радиусах сопрягающей окружности cir3
	var w = new Point2D();	// На рисунке они лежат на сопрягающей окружности
	t[0] = O4[0] + Math.cos(ang_corner + ang_2);
	t[1] = O4[1] + Math.sin(ang_corner + ang_2);

	w[0] = O4[0] + Math.cos(ang_corner - ang_3);
	w[1] = O4[1] + Math.sin(ang_corner - ang_3);

	//  Используемые для нахождения границ сегментов рундиста лучи
	// проведенные из точки O4. Точки пересечения этих лучей с линией
	// рундиста определят границы сегментов лежащих на рундисте.
	//Line2D ln_O4_t, ln_O4_u, ln_O4_w;
	var ln_O4_t = new Line2D(O4, t);
	var ln_O4_u = new Line2D(O4, u);
	var ln_O4_w = new Line2D(O4, w);

	//  Конструируем верхнюю часть рундиста
	var s = new Point2D(); // s, v - Точки лежащие на границе сегментов seg1 и seg2
	var v = new Point2D(); // и также на границе сегментов seg3 и seg4
	girdle[0] = new Point2D(0, 0.5);

	if(!cir1.IntersectionLineCircle(ln_O4_t, point1, point2))
	{
		return null;
	}
	//s = (point1[1] > point2[1]) ? point1 : point2;
	if (point1[1] > point2[1])
	{
		s[0] = point1[0]; s[1] = point1[1]
	}
	else
	{
		s[0] = point2[0]; s[1] = point2[1]			
	}
	girdle[4] = s;
	girdle[8] = u;

	if(!cir2.IntersectionLineCircle(ln_O4_w, point1, point2))
	{
		return null;
	}
	
	if (point1[0] > point2[0])
	{
		v[0] = point1[0]; v[1] = point1[1]
	}
	else
	{
		v[0] = point2[0]; v[1] = point2[1]			
	}
	
	girdle[12] = v;
	girdle[16]= new Point2D(lw/2, 0);

	// Остальной рундист
	............................................
	............................................
}

   Глава 23  ◄     Содержание     Глава 25