2012-06-03 22 views
0

我正在摸索着想出一種在2D圖形窗格上縮放信號的方式。故事是:我將我的應用程序連接到微控制器,並在固定的時間間隔內讀取數據值(電壓點)。現在我想在我的圖形窗格上繪製它。例如:在2D圖形窗格上縮放信號

enter image description here

於是起來,你在時間0看圖片,電壓也爲0,這推移和後6個數據點,我會清除窗格和重做整個東西。

問題是,我怎樣才能把這個電壓轉換成像素值,考慮到我希望圖形窗格的中間是我的信號0,就像正常的笛卡爾圖。有人可以幫助我弄清楚這種情況下的縮放算法嗎?

回答

1

看起來像簡單的數學:只需將寬度/ 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); 
} 
1

也許這將是有用的(記住,規模和翻譯功能改變陣列分):

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(); 
}