如何平滑加速度计的值,以在 canvas 上显示它?
How can I smooth out accelerometer's values, to display it on canvas?
我想稍微平滑加速度计值,因为一点点震动会导致 canvas 振动。
我尝试添加一些延迟,但没有解决问题。
我该怎么做?
public BubblePage()
{
InitializeComponent();
Device.StartTimer(TimeSpan.FromSeconds(1f / 60), () =>
{
BubbleCenterCircle.InvalidateSurface();
return true;
});
}
void canvasView_BubbleCenterCircle(object sender, SKPaintSurfaceEventArgs e)
{
var surface = e.Surface;
var canvas = surface.Canvas;
canvas.Clear(SKColors.Transparent);
var width = e.Info.Width;
var height = e.Info.Height;
canvas.Translate(width / 2, height / 2);
canvas.Scale(width / 300f);
canvas.DrawLine(-60, 0, 60, 0, whiteLine);
canvas.DrawLine(0, -60, 0, 60, whiteLine);
canvas.DrawCircle(0, 0, 60f, blackPaint);
float x = (float)Math.Round(acceleration.X * RoundingValue, 1);
float y = (float)Math.Round(acceleration.Y * RoundingValue, 1);
canvas.DrawCircle(x, -y, 15f, whitePaint);
}
void Accelerometer_ReadingChanged(object sender, AccelerometerChangedEventArgs e)
{
acceleration = e.Reading.Acceleration;
}
Vector3 acceleration;
const float RoundingValue = 60f;
听起来您想对加速度进行采样以使其平滑。在这种情况下延迟它无济于事,因为该事件仍将被调用。
如果您无法控制事件触发的频率,您可以这样做:
DateTime _lastRead;
TimeSpan _sampleRate = TimeSpan.FromSeconds(1);
void Accelerometer_ReadingChanged(object sender, AccelerometerChangedEventArgs e)
{
var now = DateTime.Now;
if ((now - _lastRead) >= _sampleRate)
{
acceleration = e.Reading.Acceleration;
_lastRead = now;
}
}
这不会分配 acceleration
值,除非上次读取和现在之间的差异等于或大于采样率。
如果这不是您想要的,您需要更明确地说明您想要实现的目标。
我想稍微平滑加速度计值,因为一点点震动会导致 canvas 振动。
我尝试添加一些延迟,但没有解决问题。
我该怎么做?
public BubblePage()
{
InitializeComponent();
Device.StartTimer(TimeSpan.FromSeconds(1f / 60), () =>
{
BubbleCenterCircle.InvalidateSurface();
return true;
});
}
void canvasView_BubbleCenterCircle(object sender, SKPaintSurfaceEventArgs e)
{
var surface = e.Surface;
var canvas = surface.Canvas;
canvas.Clear(SKColors.Transparent);
var width = e.Info.Width;
var height = e.Info.Height;
canvas.Translate(width / 2, height / 2);
canvas.Scale(width / 300f);
canvas.DrawLine(-60, 0, 60, 0, whiteLine);
canvas.DrawLine(0, -60, 0, 60, whiteLine);
canvas.DrawCircle(0, 0, 60f, blackPaint);
float x = (float)Math.Round(acceleration.X * RoundingValue, 1);
float y = (float)Math.Round(acceleration.Y * RoundingValue, 1);
canvas.DrawCircle(x, -y, 15f, whitePaint);
}
void Accelerometer_ReadingChanged(object sender, AccelerometerChangedEventArgs e)
{
acceleration = e.Reading.Acceleration;
}
Vector3 acceleration;
const float RoundingValue = 60f;
听起来您想对加速度进行采样以使其平滑。在这种情况下延迟它无济于事,因为该事件仍将被调用。
如果您无法控制事件触发的频率,您可以这样做:
DateTime _lastRead;
TimeSpan _sampleRate = TimeSpan.FromSeconds(1);
void Accelerometer_ReadingChanged(object sender, AccelerometerChangedEventArgs e)
{
var now = DateTime.Now;
if ((now - _lastRead) >= _sampleRate)
{
acceleration = e.Reading.Acceleration;
_lastRead = now;
}
}
这不会分配 acceleration
值,除非上次读取和现在之间的差异等于或大于采样率。
如果这不是您想要的,您需要更明确地说明您想要实现的目标。