如何绘制无限六角形螺旋

时间:2017-05-11 09:39:21

标签: javascript

我正在尝试创建一个结构,如下面的屏幕截图所示。有没有办法在JavaScript中为此构建算法,以按时间顺序获取每个红点的X和Y坐标,以根据特定数量生成无限螺旋?

Screenshot of how it should look and work

本规范为我生成了一个正常的Hexagon:

function hexagon(centerX, centerY) {
    var ctx = canvas.getContext('2d');
    var x = centerX + Math.cos(Math.PI * 2 / 6) * 50;
    var y = centerY + Math.sin(Math.PI * 2 / 6) * 50;

    ctx.beginPath();
    ctx.moveTo(x, y);

    for (var i = 1; i < 7; i++) {
        x = centerX + Math.cos(Math.PI * 2 / 6 * i) * 50;
        y = centerY + Math.sin(Math.PI * 2 / 6 * i) * 50;

        ctx.lineTo(x, y);
    }

    ctx.closePath();
    ctx.stroke();
}

到目前为止,这是集群功能:

function cluster(centerX, centerY, count) {
    var ctx = canvas.getContext('2d');

    for (var i = 0; i < count; i++) {
        if (i == 0) {
            var x = centerX;
            var y = centerY;
        } else {
            var x = centerX + Math.cos(-Math.PI / 2) * (100 * (Math.sqrt(3) / 2));
            var y = centerY + Math.sin(-Math.PI / 2) * (100 * (Math.sqrt(3) / 2));
        }

        hexagon(x, y);
    }
}

谢谢!

1 个答案:

答案 0 :(得分:1)

您的群集功能可能如下所示:

function cluster(centerX, centerY, count) {
    var x = centerX,
        y = centerY,
        angle = Math.PI / 3,
        dist = Math.sin(angle) * 100,
        i = 1,
        side = 0;

    hexagon(x, y);
    count--;
    while (count > 0) {
        for (var t = 0; t < Math.floor((side+4)/6)+(side%6==0) && count; t++) {
            y = y - dist * Math.cos(side * angle);
            x = x - dist * Math.sin(side * angle);
            hexagon(x, y);
            count--;
        }
        side++;
    }
}

function hexagon(centerX, centerY) {
    var ctx = canvas.getContext('2d');
    var x = centerX + Math.cos(Math.PI * 2 / 6) * 50;
    var y = centerY + Math.sin(Math.PI * 2 / 6) * 50;

    ctx.beginPath();
    ctx.moveTo(x, y);

    for (var i = 1; i < 7; i++) {
        x = centerX + Math.cos(Math.PI * 2 / 6 * i) * 50;
        y = centerY + Math.sin(Math.PI * 2 / 6 * i) * 50;

        ctx.lineTo(x, y);
    }

    ctx.closePath();
    ctx.stroke();
}

function cluster(centerX, centerY, count) {
    var x = centerX,
        y = centerY,
        angle = Math.PI / 3,
        dist = Math.sin(angle) * 100,
        i = 1,
        side = 0;

    hexagon(x, y);
    count--;
    while (count > 0) {
        for (var t = 0; t < Math.floor((side+4)/6)+(side%6==0) && count; t++) {
            y = y - dist * Math.cos(side * angle);
            x = x - dist * Math.sin(side * angle);
            hexagon(x, y);
            count--;
        }
        side++;
    }
}

cluster(200,230,9);
<canvas id="canvas" width="400" height="400"></canvas>