Thomas

Thomas

  • NA
  • 4
  • 0

Matrix - Transformation

Nov 1 2007 6:11 AM

Hello,

I will try it to explain exactly, what I need

List
P1  10,10
P2  10,90
P3  400,10
P4  400,90
or more points

Depend from the zero point

Case 1

(900mm,900mm)
--------------------------------------
|....................................|
|...........P4....................P2.|
|....................................|
|....................................|
|....................................|
|....................................|
|....................................|
|...........P3....................P1.|
--------------------------------------(0,0)

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Case 2
                                 (900mm,900mm)
--------------------------------------
|....................................|
|.P2..................P4.............|
|....................................|
|....................................|
|....................................|
|....................................|
|.P1..................P3.............|
|....................................|
--------------------------------------
0,0


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Case 3
                                    0,0
--------------------------------------
|....................................|
|........P3.....................  P1.|
|....................................|
|....................................|
|....................................|
|....................................|
|........P4.......................P2.|
|....................................|
--------------------------------------
900mm,900mm


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Case 4

0,0
--------------------------------------
|....................................|
|.P1................. P3.............|
|....................................|
|....................................|
|....................................|
|....................................|
|.P2..................P4.............|
|....................................|
--------------------------------------(900mm,900mm)

How can I make that?
With matrix tranformation mirror?

Best Regards Thomas

The code at moment is

You need only a panel
this.panel_draw = new System.Windows.Forms.Panel();


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using System.Drawing.Drawing2D;

namespace Grafik
{
    public partial class Form1 : Form
    {
        public List<CODES> ListCodes;

        public class CODES
        {
            private double x;
            private double y;

            private int boardNumber;

            public double X
            {
                get { return x; }
                set { x = value; }
            }

            public double Y
            {
                get { return y; }
                set { y = value; }
            }

            public int BoardNumber
            {
                get { return boardNumber; }
                set { boardNumber = value; }
            }

            public void Init()
            {
                X = 0;
                Y = 0;
                boardNumber = 0;
            }
        }

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            ListCodes = new List<CODES>();
            CODES obj;

            int boardnumber = 0;
            for (int j = 0; j < 4; j++)
            {
                for (int i = 0; i < 5; i++)
                {
                    boardnumber++;
                    obj = new CODES();
                    obj.Init();
                    obj.X = obj.X + (j * 150);
                    obj.Y = obj.Y + (i * 70);
                    obj.BoardNumber = boardnumber;
                    ListCodes.Add(obj);
                }
            }
        }

        float ScaleX, ScaleY;

        private void MapMillimetersToPixels(Graphics gfx, Rectangle
rectPixels, Rectangle rectMm)
        {
            Matrix matrix = new Matrix();
            ScaleX = (float)rectPixels.Width / Math.Abs(rectMm.Width);
            ScaleY = (float)rectPixels.Height /
Math.Abs(rectMm.Height);
            matrix.Scale(ScaleX, ScaleY);
            matrix.Translate(rectPixels.Left - ScaleX * rectMm.Left,
                              rectPixels.Top - ScaleY * rectMm.Top);

            gfx.Transform = matrix;
        }

        private int MillimetersToPixels_X(double value)
        {
            return Convert.ToInt32(ScaleX * value);
        }

        private int MillimetersToPixels_Y(double value)
        {
            return Convert.ToInt32(ScaleY * value);
        }

    public void DrawPanel(List<CODES> listCodes, PaintEventArgs e)
    {
      Graphics gfx; // the Graphics instance; for example, taken from
PaintEventArgs
      gfx = e.Graphics;


      PointF ptCur;
      string strPoint;

      ptCur = new PointF();
      foreach ( CODES code in listCodes )
      {
        ptCur.X = MillimetersToPixels_Y(code.X);
        ptCur.Y = MillimetersToPixels_Y(code.Y);
        ptCur.X = (float)code.X;
        ptCur.Y = (float)code.Y;

        // These two lines of code draw the cross
        gfx.DrawLine( Pens.Black, ptCur.X - 5, ptCur.Y, ptCur.X +
5,ptCur.Y );
        gfx.DrawLine( Pens.Black, ptCur.X, ptCur.Y - 5,
ptCur.X,ptCur.Y + 5 );

        // This block of code draws the label for the point
        using ( Brush brush = new SolidBrush( ForeColor ) )
        {
          strPoint = "P" + code.BoardNumber + "(" + code.X +","
+code.Y + ")";
          gfx.DrawString( strPoint, Font, brush, ptCur.X +
10,ptCur.Y );
        }
      }


    // calculation is finished -- now tranformation from mm to pixel


      gfx.DrawRectangle(Pens.Red, 5, 5, 480, 380);


      Rectangle rectMM; //= new Rectangle(0, 0, 900, 500);
      Rectangle rectPixel = new Rectangle();
      bool fZeroLeft, fZeroTop;
      fZeroLeft = false;
      fZeroTop = false;

      int mmWidth, mmHeight;
      mmWidth = 900;
      mmHeight = 500;
      rectMM = new Rectangle(
         new Point(fZeroLeft ? 0 : -mmWidth,
                     fZeroTop ? 0 : -mmHeight),
         new Size(fZeroLeft ? mmWidth : -mmWidth,
                     fZeroTop ? mmHeight : -mmHeight));

      rectPixel = panel_draw.DisplayRectangle;

      MapMillimetersToPixels( gfx, rectPixel, rectMM );


    }

    private void panel_draw_Paint(object sender, PaintEventArgs e)
    {
        DrawPanel(ListCodes, e);
    }
    }
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

What is not working at moment?

#### --> means -->  is the windows panel --> panel_draw
#### the relation between the dimension from the mm to the pixel
#### is not ok.

(900mm,900mm)
###############################################
--------------------------------------~~~~~~~~#
|....................................|~~~~~~~~#
|...........P4....................P2.|~~~~~~~~#
|....................................|~~~~~~~~#
|....................................|~~~~~~~~#
|....................................|~~~~~~~~#
|....................................|~~~~~~~~#
|....................................|~~~~~~~~#
|...........P3....................P1.|~~~~~~~~#
--------------------------------------(0,0)~~~#
###############################################

 

I think we can solve this over matrix transformation, like this.
(1,0,0,1,4,5 ) -- moving
(1,0,0,1,0,0 ) -- normal matrix
(-1,0,0,1,0,0 ) -- Mirror Y-Axis
(0,-1,0,1,0,0 ) -- Mirror X-Axis

I would like to paint only the points, as a function of the zero
point.
Matrix:
(x,y,z,scalefactor,MovingX,MovingY)
z is every time 0 in my example

(-1,0,0,1,0,0 ) -- Mirror Y-Axis
(0,-1,0,1,0,0 ) -- Mirror X-Axis

I need here maybe a matrix multiplication.
It is missing to me at the conversion.
Perhaps you help me still or someone else.