1 回答
TA贡献1982条经验 获得超2个赞
LINE_STRIPE不是做你想做的合适的原始类型,因为线条是一条连贯的线。
使用原始类型LINES。所以每个分支创建一个单独的线段:
该函数必须计算当前分支的终点并将线段的 2 个顶点添加到点列表中:
let x2 = x + length * Math.sin(angle);
let y2 = y + length * Math.cos(angle);
points.push(x, y, x2, y2);
通过 e 递归调用,在当前分支的末尾有 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);
生成的基元完全不同,但看起来相同(在这种情况下)。
添加回答
举报