使用Windows Phone 8.1中的加速计传感器数据在canvas中绘制线条

我基于设备运动在canvas上画画,我想在canvas上根据移动机芯绘制不同的角色。

目前它的工作,但我想找时间差,我想检测暂停,暂停意味着当用户没有尝试绘制和用户没有移动手机,所以应用程序ca假设现在用户想要绘制下一个字符。

如何在加速度计值中找到暂停。 任何逻辑? 还告诉我如何平滑加速度计值,以便用户可以无噪音地绘制线条。

我无法帮助加速器部分,但对于数据中的噪声,这是使用加权移动平均线的一种方法。

基础很简单:

  • 找出当前要用于平滑的当前点数
  • 根据长度计算重量,f.ex。 如果长度为5则则权重= 1 + 2 + 3 + 4 + 5 = 15
  • 从重量长度开始迭代每个数据点(你可以从1开始减去加权短 – 下面我将演示后一种方法)
  • 对于点电流 – 5乘以1/15,对于电流 – 4乘以2/15,依此类推。 总和存储为此点的值,重复下一个值点

现场演示

下面是一个演示(输入完整页面以查看所有图形)。 我用JavaScript编写它,所以它可以在答案中显示在这里。 我认为你应该把它转换成你正在使用的语言(没有说明)。

移动滑块可增加重量点数。 您可以通过多次传递来运行数据以平滑更多。 原始数据是具有噪声抖动的正弦曲线。 通过许多点,您可以看到曲线平滑以复制此点。 只需在2次传球中使用9-10分长度即可获得良好的结果且时间延迟很短:

var ctx = document.querySelector("canvas").getContext("2d"), rng = document.querySelector("input"), val = document.querySelector("span"), data = [], scale = 30; // generate sinus wave with noise jitters for(var i = 0; i < ctx.canvas.width; i += 2) data.push(Math.sin(i*0.1) * Math.random() + Math.random()) // draw initial smoothed curve (length=1, no smoothing) drawWMA(); // calculate moving average function drawWMA() { var len = +rng.value, // get smoothing length (number of previous points) dataa = [], datab = [], // pass A and B arrays weight = 0; // calc weight based on length val.innerHTML = len; ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height); ctx.beginPath(); // calc weight for(var i = 1; i <= len; i++) weight += i; // add range together [1, length] // plot original data at top of canvas plot(data, 30); // PASS 1: Calc new smoothed array dataa = calcWMA(data, len, weight); // plot smoothed curve ctx.fillText("FIRST PASS:", 0, 100); plot(dataa, 120); // PASS 2 (optional) datab = calcWMA(dataa, len, weight); ctx.fillText("SECOND PASS:", 0, 190); plot(datab, 210); ctx.stroke(); // render plots } function calcWMA(data, len, weight) { var i, t, datao = []; // calc new smoothed array for(i = 0; i < data.length; i++) { // iterate from length to end of data var v = 0; // calc average value for this position for(t = 0; t < len; t++) { // [1, len] if (it >= 0) v += data[it] * ((t+1) / weight); // weight previous values based on -delta } datao.push(v); // store new value } return datao } function plot(data, y) { ctx.moveTo(0, y + data[0]*scale); for(i = 1; i < data.length; i++) ctx.lineTo(i * 2, y + data[i]*scale); } rng.onchange = rng.oninput = drawWMA; 
 1