我正在摸索着想出一种在2D图形窗格上缩放信号的方式。故事是:我将我的应用程序连接到微控制器,并在固定的时间间隔内读取数据值(电压点)。现在我想在我的图形窗格上绘制它。例如:在2D图形窗格上缩放信号
于是起来,你在时间0看图片,电压也为0,这推移和后6个数据点,我会清除窗格和重做整个东西。
问题是,我怎样才能把这个电压转换成像素值,考虑到我希望图形窗格的中间是我的信号0,就像正常的笛卡尔图。有人可以帮助我弄清楚这种情况下的缩放算法吗?
我正在摸索着想出一种在2D图形窗格上缩放信号的方式。故事是:我将我的应用程序连接到微控制器,并在固定的时间间隔内读取数据值(电压点)。现在我想在我的图形窗格上绘制它。例如:在2D图形窗格上缩放信号
于是起来,你在时间0看图片,电压也为0,这推移和后6个数据点,我会清除窗格和重做整个东西。
问题是,我怎样才能把这个电压转换成像素值,考虑到我希望图形窗格的中间是我的信号0,就像正常的笛卡尔图。有人可以帮助我弄清楚这种情况下的缩放算法吗?
看起来像简单的数学:只需将宽度/ 2添加到您传递到绘图函数的所有X坐标。假设有6个点,你可以做以下的数组:
var g = this.CreateGraphics();
var points = new Point[6]{new Point(0, 0), new Point(10, 10), new Point(30, 0), new Point(40,20), new Point(50, 0), new Point(60,30)};
for (int i = 0; i < points.Length-1; i++)
{
g.DrawLine(Pens.Black, points[i].X + Width/2, Height/2 - points[i].Y, points[i + 1].X + Width/2, Height/2 - points[i + 1].Y);
}
或者,可以调用TranslateTransform
函数将所有进一步移动通过X和Y轴绘制的一些量。例如:
var g = this.CreateGraphics();
var points = new Point[6]{new Point(0, 0), new Point(10, 10), new Point(30, 0), new Point(40,20), new Point(50, 0), new Point(60,30)};
g.TranslateTransform(Width/2, 0, System.Drawing.Drawing2D.MatrixOrder.Append);
for (int i = 0; i < points.Length-1; i++)
{
g.DrawLine(Pens.Black, points[i].X, Height/2 - points[i].Y, points[i + 1].X, Height/2 - points[i + 1].Y);
}
也许这将是有用的(记住,规模和翻译功能改变阵列分):
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
var points = new PointF[6] { new PointF(0, 0), new PointF(30, 3), new PointF(90, 0), new PointF(190, 3.1f), new PointF(270, -0.5f), new PointF(360, 3.5f) };
float maxX = (from p in points select p).Max(t => t.X);
float maxY = (from p in points select p).Max(t => t.Y);
float xSizeToFit = pictureBox1.Width;
float ySizeToFit = pictureBox1.Height/2;
float scaleX = xSizeToFit/maxX;
float scaleY = ySizeToFit/maxY;
// scale to fit to given size
ScalePoints(points, scaleX, scaleY);
// translate to center
TranslatePoints(points, this.pictureBox1.Width/2 - 0.5f * xSizeToFit, this.pictureBox1.Height/2 + 0.5f * ySizeToFit);
DrawAxis(e.Graphics, this.pictureBox1.Size);
e.Graphics.DrawLines(Pens.Black, points);
}
private void TranslatePoints(PointF[] points, float transX, float transY)
{
for (int i = 0; i < points.Length; i++)
{
points[i].X += transX;
points[i].Y = transY - points[i].Y;
}
}
private void ScalePoints(PointF[] points, float scaleX, float scaleY)
{
for (int i = 0; i < points.Length; i++)
{
points[i].X *= scaleX;
points[i].Y *= scaleY;
}
}
public void DrawAxis(Graphics g, Size size)
{
//x
g.DrawLine(Pens.Black, 0, size.Height/2, size.Width, size.Height/2);
//y
g.DrawLine(Pens.Black, size.Width/2, size.Height, size.Width/2, 0);
}
private void pictureBox1_Resize(object sender, EventArgs e)
{
pictureBox1.Invalidate();
}