Данная глава является продолжением предыдущей. В построение рундиста из предыдущей главы добавлена точка O4.
Это изменение позволяет более гибко задавать размеры сегментов рундиста. Координаты этой точки задаются
следующим образом:
O4 = new Point2D(gd_segments * lw, gd_segments);
Параметр gd_segments при построении рундиста подобным образом должен иметь одноименное поле в СДМ.
Изменения в тексте сделанные для нового способа нахождения границ сегментов показаны в следующем листинге:
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);
// Остальной рундист
............................................
............................................
}