LINE_STRIPE
не является правильным примитивным типом, чтобы делать то, что вы хотите, потому что линейная полоса является одной связной линией.
Используйте примитивный тип LINES
. Таким образом, каждая ветвь создает отдельный отрезок линии:
Функция должна рассчитать конечную точку текущей ветки и добавить 2 вершины для отрезка линии в список точек:
let x2 = x + length * Math.sin(angle);
let y2 = y + length * Math.cos(angle);
points.push(x, y, x2, y2);
И 2 новых ветви в конце текущей ветви с помощью рекурсивного вызова:
createPoints(depth-1, x2, y2, length/2, angle+Math.PI/4, points);
createPoints(depth-1, x2, y2, length/2, angle-Math.PI/4, points);
Полное кодирование функции:
function createPoints(depth, x, y, length, angle, points) {
if (depth <= 0)
return;
// end of current line segment
let x2 = x + length * Math.sin(angle);
let y2 = y + length * Math.cos(angle);
// add segment
points.push(x, y, x2, y2);
// create 2 branches
createPoints(depth-1, x2, y2, length/2, angle+Math.PI/4, points);
createPoints(depth-1, x2, y2, length/2, angle-Math.PI/4, points);
}
например, 4 уровня:
let points = [];
createPoints(4, 0, -1.0, 1.0, 0.0, points);
Если вы все равно хотите использовать тип примитива LINE_STRIP
, то каждая ветвь должна добавить одну конечную точку, но должна вернутьсяк этой точке после каждой дочерней ветви:
function createPointsStrip(depth, x, y, length, angle, points) {
if (depth <= 0)
return;
// end of current line segment
let x2 = x + length * Math.sin(angle);
let y2 = y + length * Math.cos(angle);
// add point
points.push(x2, y2);
// create 2 branches
createPointsStrip(depth-1, x2, y2, length/2, angle+Math.PI/4, points);
points.push(x2, y2);
createPointsStrip(depth-1, x2, y2, length/2, angle-Math.PI/4, points);
points.push(x2, y2);
}
Первая точка должна быть добавлена в список точек перед вызовом рекурсивной функции:
let points = [0.0, -1.0];
createPointsStrip(4, 0, -1.0, 1.0, 0.0, points);
Сгенерированный примитивсовершенно другой, но выглядит одинаково (в данном случае).