4_RA

Real world window to viewport transformation

header

4_RA assignament

Request

Do a personal research about the real world window to viewport transformation, and note separately the formulas and code which can be useful for your present and future applications.

real world to viewport

When we want to drow a chart in .net we need to address the problem of rappresenting points inside a pictureBox(often inside a rectangle), for do this we need to operate some trasformation, we can do this one by one, or create a trasformation matrix and use this on every point. The matrix is for sure more rapid,and functional,so let’s look in depth how it works:

Traformation Matrix

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//Frist we need to create a matrix
Matrix m = new Matrix();
//-----
// then we need to prepare the needed trasformation
m.Translate(-(int)minX_Window,-(int)minY_Window,MatrixOrder.Append);
m.Scale( (int)(viewPort.Width / (maxX_Window - minX_Window)),(int)(-viewPort.Height / (maxY_Window - minY_Window)), MatrixOrder.Append);
m.Translate(viewPort.Left, viewPort.Top + viewPort.Height, MatrixOrder.Append);

// we apply the trasformation to the array of points that we need in the graphics
m.TransformPoints(myPoints );

// in the end we can write the point to the graphics (THIS IS AN EXAMPLE FROM MY IMPLEMENTATION) 
 foreach(PointF punto in myPoints)
            {
                if (myPointsreal[i].X <= maxX_Window && myPointsreal[i].Y <= maxY_Window)
                {
                    g.FillEllipse(Brushes.Black, new Rectangle(new Point((int)(punto.X - 2), (int)(punto.Y - 2)), new Size(4, 4)));
                   
                    g.DrawString(myPointsreal[i].ToString(), new Font("Arial", 10), Brushes.Black,(int)(punto.X), (int)(punto.Y));
                    g.FillEllipse(Brushes.Red, new Rectangle(new Point((int)(punto.X - 2), (int)(viewPort.Y + viewPort.Height - 2)), new Size(4, 4)));
                    g.FillEllipse(Brushes.Red, new Rectangle(new Point((int)(viewPort.X), (int)(int)(punto.Y - 2)), new Size(4, 4)));
                   

                }
            }
comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy