机器视觉入门之路(二一,图像旋转之后,c#)

测试代码:

mg_line  testline = new mg_line(new PointF(200, 200), new PointF(400, 500));
            Graphics g = e.Graphics;
            g.DrawLine(new Pen(Brushes.Red), testline.pt_start, testline.pt_end);
          

            testline.直线旋转(new PointF(0, 0), -0.523);//30度
            g.DrawLine(new Pen(Brushes.Green), testline.pt_start, testline.pt_end);

       

            testline.直线旋转(testline.pt_end, -1.57);//90度
            g.DrawLine(new Pen(Brushes.Blue), testline.pt_start, testline.pt_end);

    效果如下:

看上去,好像长度不对,怕错?测了长度,相等,ok,再次放心(我们矩阵变换类是随手写的,当然要验证),下面又捋了捋这两个类,前面太乱,现在顺眼多了(把以前的类精简到最少,需要了再增加):

 class 矩阵变换
    {
        public double[,] 单位矩阵 = new double[3, 3];//单位矩阵
        public 矩阵变换()
        {
            int i, j;
            for (i = 0; i < 3; i++)
                for (j = 0; j < 3; j++)
                {
                    if (i == j) 单位矩阵[i, j] = 1;
                    else 单位矩阵[i, j] = 0;
                }
        }
    }
    class 矩阵变换EX : 矩阵变换
    {
        public void 点平移(PointF 指定点, ref PointF sp)
        {

            矩阵变换 M = new 矩阵变换();

            M.单位矩阵[2, 0] = -指定点.X;
            M.单位矩阵[2, 1] = -指定点.Y;

            double x, y;
            x = M.单位矩阵[0, 0] * sp.X + M.单位矩阵[1, 0] * sp.Y + M.单位矩阵[2, 0];
            y = M.单位矩阵[0, 1] * sp.X + M.单位矩阵[1, 1] * sp.Y + M.单位矩阵[2, 1];
            sp.X = (float)x;
            sp.Y = (float)y;

        }
        public void 原点旋转(double 弧度, ref PointF sp)
        {
            矩阵变换 M = new 矩阵变换();
            M.单位矩阵[0, 0] = M.单位矩阵[1, 1] = Math.Cos(弧度);//Math.Cos
            M.单位矩阵[0, 1] = Math.Sin(弧度);//Math.Sin
            M.单位矩阵[1, 0] = -M.单位矩阵[0, 1];

            double x, y;
            x = M.单位矩阵[0, 0] * sp.X + M.单位矩阵[1, 0] * sp.Y + M.单位矩阵[2, 0];
            y = M.单位矩阵[0, 1] * sp.X + M.单位矩阵[1, 1] * sp.Y + M.单位矩阵[2, 1];
            sp.X = (float)x;
            sp.Y = (float)y;

        } 
    }
    public class mg_line
    {

        public PointF pt_start;
        public PointF pt_end;
        public mg_line()
        {
            pt_end = new PointF();
            pt_start = new PointF();
        }

        public mg_line(PointF pstart, PointF pend)
        {
            pt_start = pstart;
            pt_end = pend;
        }

        public void 直线平移(PointF 指定点)
        {
            矩阵变换EX temp = new 矩阵变换EX();

            temp.点平移(指定点, ref pt_start);

            temp.点平移(指定点, ref pt_end);
        }

        public void 直线旋转(PointF 指定点, double 弧度)
        { 

            矩阵变换EX temp = new 矩阵变换EX();

            PointF tempPt=new PointF ();
            tempPt.X = -指定点.X; tempPt.Y = -指定点.Y;


            直线平移(指定点);                               //平移  
            temp.原点旋转(弧度, ref pt_start);      //旋转
            temp.原点旋转(弧度, ref pt_end);       
            直线平移(tempPt);                              //再平移

        }     }