简体   繁体   English

HTML5-跟踪画布上的圆圈数

[英]HTML5 - track number of circles on canvas

Is there a way to keep count of the number of shapes drawn on a canvas I'm using a brush of sorts to draw a string of circles on a canvas and would like to find a way to count how many are present 有没有一种方法可以计算在画布上绘制的形状的数量,我正在使用各种各样的画笔在画布上绘制一串圆圈,并且想找到一种方法来计算存在的数量

var mainCanvas = document.getElementById('draw1');
mainContext = mainCanvas.getContext('2d');

var CircleBrush = {

iPrevX: 0,
iPrevY: 0,

// initialization function
init: function () {
    mainContext.globalCompositeOperation = 'source-over';
    mainContext.lineWidth = 1;
    mainContext.strokeStyle = '#4679BD';
    mainContext.lineWidth = 1;
    mainContext.lineJoin = 'round';

},

startCurve: function (x, y) {
    this.iPrevX = x;
    this.iPrevY = y;
    mainContext.fillStyle = '#4679BD';
},

draw: function (x, y) {
    var iXAbs = Math.abs(x - this.iPrevX);
    var iYAbs = Math.abs(y - this.iPrevY);
    var rad = 6;

    if (iXAbs > 10 || iYAbs > 10) {
        mainContext.beginPath();
        mainContext.arc(this.iPrevX, this.iPrevY, rad, Math.PI * 2, false);
        mainContext.fill();
        mainContext.stroke();
        this.iPrevX = x;
        this.iPrevY = y;

       }
    }
};
var circleCounter = [0];
mainContext.font = '21pt Arial';
mainContext.fillStyle = '#262732';
mainContext.textBaseline = 'top';
mainContext.fillText(circleCounter, 20, 20);
CircleBrush.init();
$('#draw1').mousedown(function (e) { // mouse down handler
cMoeDo = true;
var canvasOffset = $('#draw1').offset();
var canvasX = Math.floor(e.pageX - canvasOffset.left);
var canvasY = Math.floor(e.pageY - canvasOffset.top);
CircleBrush.startCurve(canvasX, canvasY);
circleCounter ++1;
 });

$('#draw1').mouseup(function (e) { // mouse up handler
 cMoeDo = false;
});

 $('#draw1').mousemove(function (e) { // mouse move handler
  if (cMoeDo) {
    var canvasOffset = $('#draw1').offset();
    var canvasX = Math.floor(e.pageX - canvasOffset.left);
    var canvasY = Math.floor(e.pageY - canvasOffset.top);
    CircleBrush.draw(canvasX, canvasY);
    circleCounter ++1;
 }

})

Demo fiddle http://jsfiddle.net/A2vyY/ 演示小提琴http://jsfiddle.net/A2vyY/

Thanks in advance 提前致谢

You need to clear the space for the counter and redraw the count. 您需要清除计数器的空间并重新绘制计数。 In order to do so I put the counter and text drawing in the draw function like so 为了做到这一点,我将计数器和文本绘制放在了draw函数中,如下所示

draw: function (x, y) {        
    var iXAbs = Math.abs(x - this.iPrevX);
    var iYAbs = Math.abs(y - this.iPrevY);
    var rad = 6;  

    if (iXAbs > 10 || iYAbs > 10) {
        mainContext.beginPath();
        mainContext.arc(this.iPrevX, this.iPrevY, rad, Math.PI*2, false);
        mainContext.fill();
        mainContext.stroke();
        this.iPrevX = x;
        this.iPrevY = y;
        circleCounter ++;
        mainContext.clearRect(0,0,50,25);
        mainContext.fillText(circleCounter, 5, 5);           
    }
}

Updated jsFiddle (I moved the counter some so that there is more room for the dots) 更新了jsFiddle (我将计数器移了一些,以便为点提供更多空间)

You can put the counter in a separate div and just update the text 您可以将计数器放在单独的div然后更新文本

<div id="content">
    <div id="counter">0</div>
    <canvas id="draw1" height="500" width="500"></canvas>
</div>

Return true when a circle is drawn, false if not 画圆时返回true,否则返回false

draw: function (x, y) {
    /* ... */
    if (iXAbs > 10 || iYAbs > 10) {
        /* ... */
        return true;
    }

    return false;
}

increment and show as necessary 增加并根据需要显示

if (CircleBrush.draw(canvasX, canvasY)) {
    ++circleCounter;
    $('#counter').text(circleCounter);
}

See modified JSFiddle 参见修改后的JSFiddle

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM