【问题标题】:HTML 5 fortune wheel (lunchwheel)HTML5幸运轮(午餐轮)
【发布时间】:2014-11-13 03:25:14
【问题描述】:

我一直在使用 HTML 5 编写一个简单的幸运轮实现表单 here,但是在找到获胜者段时遇到了一些问题,这是 JSFiddle 中的代码:

http://jsfiddle.net/bramp/94jP6/

JSFiddle 中的重要功能:

// Called when segments have changed
update: function() {
    // Ensure we start mid way on a item
    //var r = Math.floor(Math.random() * wheel.segments.length);
    var r = 0;
    wheel.angleCurrent = ((r + 0.5) / wheel.segments.length) * Math.PI * 2;

    var segments = wheel.segments;
    var len = segments.length;
    var colors = wheel.colors;
    var colorLen = colors.length;

    // Generate a color cache (so we have consistant coloring)
    var seg_color = new Array();
    for (var i = 0; i < len; i++)
    seg_color.push(colors[segments[i].hashCode().mod(colorLen)]);

    wheel.seg_color = seg_color;

    wheel.draw();
}

drawNeedle: function() {
    var ctx = wheel.canvasContext;
    var centerX = wheel.centerX;
    var centerY = wheel.centerY;
    var size = wheel.size;

    ctx.lineWidth = 1;
    ctx.strokeStyle = '#000000';
    ctx.fileStyle = '#ffffff';

    ctx.beginPath();

    ctx.moveTo(centerX + size - 40, centerY);
    ctx.lineTo(centerX + size + 20, centerY - 10);
    ctx.lineTo(centerX + size + 20, centerY + 10);
    ctx.closePath();

    ctx.stroke();
    ctx.fill();

    // Which segment is being pointed to?
    var i = wheel.segments.length - Math.floor((wheel.angleCurrent / (Math.PI * 2)) * wheel.segments.length) - 1;

    // Now draw the winning name
    ctx.textAlign = "left";
    ctx.textBaseline = "middle";
    ctx.fillStyle = '#000000';
    ctx.font = "2em Arial";
    ctx.fillText(wheel.segments[i], centerX + size + 25, centerY);
},

第 256 行是当前代码获胜的地方:

var i = wheel.segments.length - Math.floor((wheel.angleCurrent / (Math.PI * 2)) * wheel.segments.length) - 1;

但那是在方向盘的右侧,我试图让它在顶部作为获胜点。我已经为此苦苦挣扎了很长时间,感谢您的帮助或指导。谢谢

【问题讨论】:

    标签: javascript html


    【解决方案1】:

    Here is a working solution Fiddle 。解释如下:

    首先我们需要将指针绘制到正确的位置,在轮子的顶部:

    drawNeedle: function() {
        ...
        ctx.beginPath();
        ctx.moveTo(centerX + 20, centerY - size - 20);
        ctx.lineTo(centerX - 20, centerY - size - 20);
        ctx.lineTo(centerX  , centerY - size + 20);
        ctx.closePath();
        ...
    }
    

    在您给出的代码段中:

    var i = wheel.segments.length - Math.floor((wheel.angleCurrent / (Math.PI * 2)) * wheel.segments.length) - 1;
    

    wheel.angleCurrent / (Math.PI * 2) 部分表示它在右侧。请注意,在 JavaScript 中,我们从“单位圆”开始。要解决这个问题,我们只需将角度偏移 90 度(或者在我们的例子中添加 Math.PI/2 弧度):

        var change = wheel.angleCurrent + (Math.PI/2);
        var i = wheel.segments.length - Math.floor((change / ( Math.PI * 2)) * wheel.segments.length) - 1;
        if(i < 0) i = i + 17; // 17 = wheel.segments.length
    

    i 的计算方式取决于我们从右边开始。当我们将它从-5 to 12 更改为0 to 16 以外的部分时,它会偏移一些项目。要在负项(我们的偏移项)上解决这个问题,我们只需将它们添加为我们的 13 到 16。换句话说,添加 17(与 wheel.segments.length 相同)。

    【讨论】:

    • 你太棒了,:) 我想我会为此苦苦挣扎多年。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    • 2012-10-19
    相关资源
    最近更新 更多